###### Ansible總結(jié)
##### 運(yùn)維工作:? 系統(tǒng)安裝(物理機(jī)、虛擬機(jī))-->程序包安裝纺酸、配置震叙、服務(wù)啟動 --> 對主機(jī)批量操作 --> 程序版本更新 -->監(jiān)控
? ? OS Provisioning:
? ? ? ? 物理機(jī):PXE可柿、Cobbler
? ? ? ? 虛擬機(jī):Image、Templates
? ? Configuration:
? ? ? ? puppet工具(ruby開發(fā))
? ? ? ? Saltstack(python開發(fā))
? ? ? ? chef
? ? Command and Concrol:
? ? ? ? fabric
? ? 預(yù)發(fā)布環(huán)境驗(yàn)證:
? ? ? ? 新版本的代碼先發(fā)布到內(nèi)網(wǎng)測試服務(wù)器(跟線上環(huán)境配置完全相同缔莲,只是未介入到調(diào)度器);
? ? 程序發(fā)布:
? ? ? ? 不能影響用戶體驗(yàn)霉旗;
? ? ? ? 系統(tǒng)不能停機(jī)痴奏;
? ? ? ? 不能導(dǎo)致系統(tǒng)故障或造成系統(tǒng)完全不可用;
? ? 灰度發(fā)布:
? ? ? ? 一種發(fā)布模式厌秒;在調(diào)度器上下線一批主機(jī) --> 關(guān)閉服務(wù) --> 部署新版本的應(yīng)用程序 --> 啟動服務(wù) --> 在調(diào)度器上啟用這一批主機(jī)读拆;
? ? ? ? 自動化灰度發(fā)布機(jī)制:可通過腳本或公司自己的發(fā)布平臺發(fā)布;
###### 運(yùn)維工具的分類 :
? ? agent:代理工具:puppet鸵闪,func
? ? agentless:無代理工具:ansible檐晕,fabric;agentless類工具必須依賴ssh服務(wù)岛马;
###### ansible的模塊化:
? ? 模塊化:調(diào)用特定的模塊來完成特定的任務(wù)棉姐;
? ? 基于python語言實(shí)現(xiàn),由paramaiko啦逆、pyYAML和jinja2三個關(guān)鍵模塊
? ? 部署簡單:agentless類工具
? ? 主從模式:
? ? 支持自定義模塊:
? ? 支持playbook:
###### ansible密鑰登陸
? ? ansible是通過ssh實(shí)現(xiàn)配置管理伞矩、應(yīng)用部署、任務(wù)執(zhí)行等功能夏志,因此乃坤,需要事先配置ansible端能基于密鑰認(rèn)證的方式聯(lián)系各個被管理節(jié)點(diǎn);
? ? ? ? ansible管理端做密鑰:ssh-keygen -t rsa -P ‘’
? ? ? ? 將密鑰拷貝到各個被控節(jié)點(diǎn):ssh-copy-id? root@192.168.4.41
? ? ? ? ssh遠(yuǎn)程連接測試:ssh root@192.168.4.41 ##應(yīng)該不需要密碼就可以直接遠(yuǎn)程進(jìn)被控端
######? ansible安裝
? ? ## wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
? ? ## yum -y install ansible
? ? 配置文件:/etc/ansible/ansible.cfg
? ? 主機(jī)清單:/etc/ansible/hosts
###### ansible的簡單使用
? ? 1沟蔑、修改/etc/ansible/hosts文件湿诊,添加ansible被控主機(jī)或被控組;
? ? ? ? ##必須先在hosts文件添加主機(jī)ip瘦材,不然遠(yuǎn)程控制被控端時(shí)會報(bào)錯: [WARNING]: No hosts matched, nothing to do
? ? 2厅须、執(zhí)行一個簡單的ansible命令:
? ? ? ? 在ansible控制端執(zhí)行:
? ? ? ? ansible 192.168.4.41 -m command -a 'ifconfig'會顯示被控端的網(wǎng)卡信息
###### ansible常用模塊
###### 可以使用‘a(chǎn)nsible-doc -s 模塊名 ’來查看模塊的詳細(xì)用法
? ? ansible用法:ansible? [-f forks] [-m module_name] [-a args]
? ? user模塊:
? ? ? ? 示例:ansible test -m user -a 'name=wuyongfeng state=present system=yes'
? ? ? ? ? ? 在test組包含的被控端上創(chuàng)建用戶,name為wuyongfeng食棕;
? ? ? ? ? ? state=present表示創(chuàng)建用戶朗和,state=absent時(shí)表示刪除用戶错沽;
? ? ? ? ? ? system=yes表示創(chuàng)建系統(tǒng)用戶;
group模塊:
示例:ansible test -m group -a 'name =testgroup gid=111 state=present system=yes'
在test組包含的被控端上創(chuàng)建組testgroup眶拉;
組id為111千埃;
state=present表示創(chuàng)建組,state=absent時(shí)表示刪除組忆植;
syste=yes表示創(chuàng)建系統(tǒng)組放可,system=no表示創(chuàng)建的不是系統(tǒng)組;
cron模塊:
示例:ansible test -m cron -a 'name="wuyongfeng crontab list" minute="*/20" job="/sbin/ntpdate 192.168.4.40 &>/dev/null"'
在test組包含的被控端添加任務(wù)計(jì)劃朝刊,每20分鐘向192.168.4.40同步時(shí)間耀里,并把輸出丟如/dev/null;
name:計(jì)劃任務(wù)的描述信息坞古;
minute:分鐘备韧;
job:要進(jìn)行的操作;
day:日(1-31痪枫,*织堂,*/2,……);
hour:小時(shí)(0-23奶陈,*易阳,*/2,……)吃粒;
month:月(1-12潦俺,*,*/2徐勃,……)事示;
weekday:周(0-7,*僻肖,……)肖爵;
user:以哪個用戶的身份執(zhí)行;
若要刪除之前在被控端部署的計(jì)劃任務(wù)臀脏,只需指定name和state=absent即可劝堪;
例如:
ansible test -m cron -a 'name="wuyongfeng crontab list" state=absent'
copy模塊:
示例:ansible test -m copy -a 'src=/data/wyf.txt dest=/tmp/wyf.txt mode=600'
復(fù)制ansible控制端的wyf.txt文件到test組所指定的被控端的主機(jī)的/tmp目錄下
src:源路徑
dest:目標(biāo)路徑
mode:文件權(quán)限
file模塊:
專門用來設(shè)定文件屬性;
ansible test -m file -a 'path=/tmp/www state=directory'
在test組定義的被控端的/tmp/下創(chuàng)建www目錄揉稚,state指定文件屬性為目錄
group:定義文件/目錄的屬組
mode:定義文件/目錄的權(quán)限
owner:定義文件/目錄的屬主
path:必選項(xiàng)秒啦,定義文件/目錄的路徑
recurse:遞歸的設(shè)置文件的屬性,只對目錄有效
src:要被鏈接的源文件的路徑搀玖,只應(yīng)用于state=link的情況
dest:被鏈接到的路徑余境,只應(yīng)用于state=link的情況
state:
=directory:如果目錄不存在,創(chuàng)建目錄
=file:即使文件不存在,也不會被創(chuàng)建
=link:創(chuàng)建軟鏈接
=hard:創(chuàng)建硬鏈接
=touch:如果文件不存在葛超,則會創(chuàng)建一個新的文件暴氏,如果文件或目錄已存在,則更新其最后修改時(shí)間
=absent:刪除目錄绣张、文件或者取消鏈接文件
ping模塊:
用于確認(rèn)和對象機(jī)器之間是否能夠ping通,正常情況會返回pong关带;
示例:ansible test -m ping
ping test組定義的被控端侥涵;如果是可以通的則返回pong;
yum模塊:
示例:ansible test -m yum -a 'name=httpd? state=present'
在test組的被控端yum安裝httpd宋雏;
config_file:yum的配置文件
disable_gpg_check:關(guān)閉gpg_check
disablerepo:不啟用某個源
enablerepo:啟用某個源
name:要進(jìn)行操作的軟件包的名字芜飘,也可以傳遞一個url或者一個本地的rpm包的路徑
state:狀態(tài)(present安裝,absent卸載磨总,latest最新的)
service模塊:
示例:ansible test -m service -a 'name=httpd state=started enabled=yes'
test組的所有被控端嗦明,啟動httpd服務(wù),開機(jī)啟動(enabled)
enabled:[yes/no] 啟動os后啟動對應(yīng)service的選項(xiàng);是否開機(jī)啟動
name:需要進(jìn)行操作的service名字
state:[stared/stoped/restarted/reloaded] 服務(wù)最終操作后的狀態(tài)蚪燕。
shell模塊:
示例:ansible test -m shell -a 'sh /date/1.sh chdir=/date/www creates=/date/www/1.txt'
執(zhí)行test組所有被控端娶牌,先切換到/date/www目錄,如果/date/www/1.txt不存在馆纳,則執(zhí)行/data/1.sh诗良,
chdir:command一樣的,運(yùn)行shell之前cd到某個目錄鲁驶;
creates:跟command一樣的鉴裹,如果某個文件存在則不運(yùn)行shell;
removes:跟command一樣的钥弯,如果某個文件不存在則不運(yùn)行shell径荔;
script模塊:
可以實(shí)現(xiàn)被控端上可以執(zhí)行ansible控制端的腳本。
示例:ansible test -m script -a '/4.40/www/2.sh'
在test組所有被控端執(zhí)行ansible控制端中/4.40./www/目錄下的2.sh
setup模塊:
用于收集遠(yuǎn)程主機(jī)的一些基本信息脆霎。
示例:ansible test -m setup
收集test組所有主機(jī)的基本信息
###### Ansible Playbooks
#playbook的核心元素:
Tasks:任務(wù)
Variables:變量
Templates:模板
Handlers:處理器
Roles:角色
ansible --yaml語法
一:介紹:
YAML是一個可讀性高的用來表達(dá)資料序列的格式总处。YAML參考了其他多種語言,包括:XML、C語言绪穆、Python辨泳、Perl等。
YAML不是XML玖院,不過菠红,在開發(fā)的這種語言時(shí),YAML的意思其實(shí)是:“Yet? Another Makup Language”(仍是一種標(biāo)記語言)
特點(diǎn):
1难菌、可讀性好
2试溯、和腳本的交互性好
3、使用實(shí)現(xiàn)怨言的數(shù)據(jù)類型
4郊酒、有一個一致的信息模型
5遇绞、易于實(shí)現(xiàn)键袱。
6、可以基于流來處理摹闽。
7蹄咖、表達(dá)能力強(qiáng),擴(kuò)展性好付鹿。
二:yaml語法
yaml的語法和其他高階語言類似澜汤,并且可以簡單表達(dá)清單,散列表舵匾,標(biāo)量等數(shù)據(jù)結(jié)構(gòu)俊抵,其結(jié)構(gòu)通過空格來展示,序列里的項(xiàng)目用“-”來表示坐梯,map里的鍵值對用“:”分隔徽诲,下面是一個示例:
name:john smith
age:41
gender:male
spouse:
name:jane smith
age:37
gender:female
children:
-? name:jimmy smith
age:17
gender:male
-? name:jenny smith
age:14
gender:female
列表: 也叫做序列
列表中的所有元素都用“-”打頭,例如:
- apple
- orange
- mango
字典:
字典通過key與value進(jìn)行標(biāo)識吵血,例如:
---
name:example developer
job:developer
skill:elite
也可以將key:value放置與{}中表示谎替,例如:
{name:example developer,job:developer践瓷,skill:elite}
###### Ansible基礎(chǔ)元素
1.變量
1.1 變量命名
變量名僅能由字母院喜,數(shù)字和下劃線組成,且只能以字母開頭
1.2 facts
facts是由正在通信的遠(yuǎn)程目標(biāo)主機(jī)返回的信息晕翠,這些信息能保存在ansible變量中喷舀,要獲取指定的遠(yuǎn)程主機(jī)所支持的素有的facts,可使用如下命令進(jìn)行
#ansible hostname -m setup
1.3 register
注冊器:把任務(wù)的輸出定義為變量淋肾,然后用于其他任務(wù)硫麻,示例如下:
tasks:
- shell:/usr/bin/foo
register:foo_result
ignore_errors:True
1.4 通過命令行傳遞變量
在運(yùn)行playbooks的時(shí)候也可以傳遞一些變量供playboo使用:示例如下:
ansible-playbook test.yml --extra-vars"hosts=www user=mageedu"
1.5 通過roles傳遞變量
當(dāng)給一個主機(jī)應(yīng)用角色的時(shí)候可以傳遞變量,然后在角色內(nèi)使用這些變量樊卓,示例如下:
- hosts:webservers
roles:
- common
- { roles:foo_app_instance拿愧,dir:'/web/htdocs/a.com',port 8000 }
2.Inventory
ansible的主要功用在于批量主機(jī)操作,為了便捷地使用其中的部分主機(jī)碌尔,可以在inventory file中將其分組命名浇辜,默認(rèn)的inventory file為/etc/ansible/hosts
Inventory file可以有多個,且也可以通過Dynamic Inventory動態(tài)生成唾戚;
2.1 Inventory文件格式
Inventory文件INI文件風(fēng)格柳洋,中括號中的字符為組名,可以將同一個主機(jī)分配到多個不同的組叹坦,此外熊镣,當(dāng)被控制的主機(jī)使用了非默認(rèn)的ssh 22端口時(shí),還可以在主機(jī)ip或主機(jī)名之后使用冒號加端口號標(biāo)明;示例:
[webservers]? ? ##被控組組名
192.168.1.100? ##使用ip添加被控端主機(jī)
www.mageedu.com:222 ##如果被控端沒有使用默認(rèn)的ssh端口绪囱,可用冒號加端口號注明
如果主機(jī)名稱遵循相似的命名格式测蹲,還可以使用列表的方式標(biāo)識主機(jī),示例:
[webservers]
www[1:50].example.com ##表示www1.example.com-www50.example.com的主機(jī)
2.2 主機(jī)變量
可以在Inventory中定義主機(jī)時(shí)為其添加主機(jī)變量以便于在playbook中使用鬼吵,例如:
[webservers]
www1.mageedu.com http_port-80 maxRequestsPerChild-808
www2.mageedu.com http_port-8080 maxRequestsPerChild-909
2.3 組變量
組變量是指賦予給指定組內(nèi)所有主機(jī)上的在playbook中可用的變量扣甲,例如:
[webservers]
www1.mageedu.com
www2.mageedu.com
[webservers:vars]? :vars是固定寫法,指定下邊兩行都可以分別對應(yīng)給webservers組的兩臺主機(jī)
ntp_server-ntp.mageedu.com
nfs_server-nfs.mageedu.com
2.4 組嵌套
Inventory中齿椅,組還可以包含其他的組文捶,并且也可以向組中的主機(jī)指定變量,不過媒咳,這些變量只能在ansible-playbook中使用,而ansible不支持种远,例如:
[apache]
httpd1.mageedu.com
httpd2.mageedu.com
[nginx]
nginx1.mageedu.com
nginx2.mageedu.com
[webservers:children]? webservers組內(nèi)包含apache和nginx兩個組涩澡,:children表示引用了其他組用來做webservers組的子組
apache
nginx
[webservers:vars]
ntp_server-ntp_mageedu.com
2.5 Inventory參數(shù)
ansible基于ssh連接Inventory中指定的遠(yuǎn)程主機(jī)時(shí),還可以通過參數(shù)指定其交互方式坠敷,這些參數(shù)如下所示:
> ansible_ssh_host
> ansible_ssh_port
> ansible_ssh_user
> ansible_ssh_pass
> ansible_sudo_pass
> ansible_connection
> ansible_ssh_pricate_key_file
> ansible_shell_type
> ansible_python_interpreter
> ansible\_\*\_interpreter
###### Ansible playbooks
playbooks是一個或多個“play”組成的列表妙同,play的主要功能在于將事先歸并為一組的主機(jī)裝扮成事先通過ansible中的tasks定義好的角色,從根本上來講膝迎,所謂task無非是調(diào)用ansible的一個module粥帚,將多個play組織在一個playbook中,即可以讓他們連同起來按事先編排的機(jī)制同唱一臺大戲限次,下面是一個簡單示例:
- hosts:webservers? ##定義inventory芒涡,主機(jī)組
vars:
http_port:80
max_clients:256
remote_user:root ##定義連接到遠(yuǎn)程主機(jī)時(shí),以哪個用戶的身份執(zhí)行
tasks:
- name:install apache is at the latest version ##描述卖漫,可隨意寫
yum:name=httpd state=latest ##使用yum模塊费尽,指定選項(xiàng),安裝最新版本的httpd
- name: ensure apache is running ##描述信息
service:name=httpd state=started ##使用service模塊羊始,指定httpd狀態(tài)
handlers: ##處理器
- name:restart apache
service:name=httpd state=restarted
playbook組成結(jié)構(gòu):
Inventory
Modules
Ad Hoc Commands
Playbooks
Tasks:任務(wù)旱幼,即調(diào)用模塊完成的某操作
Variables:變量
Templates:模板
Handlers:處理器,在某條件滿足時(shí)突委,會由某事件觸發(fā)執(zhí)行的操作
Roles:角色
hosts和remote_user:
playbook中的每一個play的目的都是為了讓某個或某些主機(jī)以某個指定的用戶身份執(zhí)行任務(wù)柏卤,hosts即用于指定要執(zhí)行指定任務(wù)的主機(jī),其可以是一個或多個由冒號分隔主機(jī)組匀油,remote_user則用于指定遠(yuǎn)程主機(jī)上的執(zhí)行任務(wù)的用戶缘缚,如以上示例中的
- hosts:webservers
remote_user:root
不過,remote_user也可以用于各個tasks中(可能每個tasks指定的用戶不一樣)钧唐,也可以指定其通過sudo的方式在遠(yuǎn)程主機(jī)上執(zhí)行操作忙灼,其可用于play全局或某任務(wù),此外,甚至可以在sudo時(shí)使用sudo_user指定sudo時(shí)切換的用戶该园;
- hosts:webservers
remote_user:mageedu
tasks:
- name:test connection
ping:
remote_user:mageedu
sudo:yes? ##以remote_user指定的用戶切入進(jìn)去酸舍,然后以這個用戶的身份sudo到root用戶去
任務(wù)列表和action:
play的主體部分是task、list里初、task list中的各任務(wù)按次序逐個在hosts中指定的所有主機(jī)上執(zhí)行啃勉,即在所有主機(jī)上完成第一個任務(wù)后再執(zhí)行第二個任務(wù),在運(yùn)行自上而下某playbook時(shí)双妨,如果中途發(fā)生錯誤淮阐,所有已執(zhí)行任務(wù)都可能回滾,因此刁品,在更正playbook后重新執(zhí)行一次即可泣特;
task的目的是使用指定的參數(shù)執(zhí)行模塊,而在模塊參數(shù)中可以使用變量挑随,模塊執(zhí)行是冪等的状您,這意味這多次執(zhí)行是安全的,因?yàn)槠浣Y(jié)果均一致兜挨;
每個task都應(yīng)該有個name膏孟,用于playbook的執(zhí)行結(jié)果輸出,建議其內(nèi)容盡可能清晰地描述任務(wù)執(zhí)行步驟拌汇,如果為提供name柒桑,則執(zhí)行action的結(jié)果將用于輸出;
定義task的可以使用"action:module option"或"module:option"的格式噪舀,推薦使用后者以實(shí)現(xiàn)向后兼容魁淳;
tasks:
- name:make sure apache is running
service:name=httpd state=running
在眾多模塊中,只有command和shell模塊僅需要給定一個列表而無需使用key:value格式傅联,例如:
tasks:
- name:disable selinux
command:/sbin/setenforce 0
如果命令或腳本的退出碼不為零先改,可以使用如下方式替代:
tasks:
- name:run this command and ignore the result
shell:/usr/bin/SOME COMMAND||/bin/true
在執(zhí)行/usr/bin/下的某條命令時(shí),如果報(bào)錯了蒸走,但是這不影響我們本身意愿或者執(zhí)行結(jié)果時(shí)仇奶,可以使用/bin/true將退出碼強(qiáng)制改為true
或者使用ignore_errors來忽略錯誤信息:
tasks:
- name:run this command and ignore the result
shell:/usr/bin/SOME COMMAND
ignore_errors:True
Handlers:處理器
用于當(dāng)關(guān)注的資源發(fā)生變化時(shí)采取一定的操作:
“notify”這個action可用于在每個play的最后被觸發(fā),這樣可以避免多次有改變發(fā)生時(shí)每次都執(zhí)行指定的操作比驻,取而代之该溯,? ? 僅在所有的變化發(fā)生完成后一次性的執(zhí)行指定操作,在notify中列出的操作成為Handlers别惦,也即notify中調(diào)用handlers中定義的操作狈茉;
示例:
- hosts: test? #\\主機(jī)組,在/etc/ansible/hosts定義
remote_user: root # \\遠(yuǎn)端執(zhí)行任務(wù)的用戶
tasks: #\\任務(wù)
- name: install httpd? #\\任務(wù)描述
command: yum -y install httpd? #\\調(diào)用ansible的command模塊安裝httpd
- name: install configuration file for httpd #\\任務(wù)描述
copy: src=/data/httpd.conf dest=/etc/httpd/conf/httpd.conf? #\\調(diào)用ansible的copy模塊復(fù)制ansible管理端的文件到被控端
notify: #\\定義一個notify掸掸,當(dāng)執(zhí)行copy這個模塊的命令時(shí)執(zhí)行notify
- restart httpd #\\? notify引用的handlers的名字為restart httpd(必須跟handlers的名字一樣)
handlers:? #\\ 定義一個handlers
- name: restart httpd? #\\名字為restart httpd
service: name=httpd state=restarted? #\\調(diào)用ansible的service模塊氯庆,重啟httpd服務(wù)
###### playbook的一個簡單實(shí)例:
- hosts: test? ? ? #\\主機(jī)組蹭秋,在/etc/ansible/hosts定義
remote_user: root? ? # \\遠(yuǎn)端執(zhí)行任務(wù)的用戶
tasks:? ? ? ? #\\任務(wù)
- name: install httpd? ? ? #\\任務(wù)描述
command: yum -y install httpd? ? #\\調(diào)用ansible的command模塊安裝httpd
###### 在playbook中使用變量:
- hosts: test? ? ? #\\主機(jī)組,在/etc/ansible/hosts定義
remote_user: root? ? # \\遠(yuǎn)端執(zhí)行任務(wù)的用戶
vars: ##定義變量package和service
- package: httpd
- service: httpd
tasks:? ? #\\任務(wù)
- name: rpm -e httpd
command: rpm -e httpd
- name: install {{ package }}? ? ? #\\任務(wù)描述 調(diào)用變量用{{ }}引用
command: yum -y install httpd? ? ? #\\調(diào)用ansible的command模塊安裝httpd
- name: install configuration file for httpd
copy: src=/data/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
handlers:
- name: restart httpd
service: name=httpd state=restarted
###### Ansible使用條件測試
如果需要根據(jù)變量堤撵、facts或此前任務(wù)的執(zhí)行結(jié)果來做為某task執(zhí)行還是不執(zhí)行的前提時(shí)需要用到條件測試仁讨;
1.when語句
在task后添加when子句即可使用條件測試,when語句支持jinja2表達(dá)式語法实昨,例如:
tasks:
- name: "shutdown debian system"
command: /sbin/shutdown -h now
when: ansible_os_family == "Debian"
當(dāng)系統(tǒng)為debian系統(tǒng)時(shí)洞豁,則關(guān)機(jī)
- hosts: test
remote_user: root
tasks:
- name: yum httpd
command: yum -y install httpd
when: ansible_fqdn == "wwww"
當(dāng)test組的某臺主機(jī)的主機(jī)名為wwww時(shí),才給符合條件的主機(jī)安裝httpd
###### Ansible playbook使用迭代(循環(huán))
當(dāng)有需要重復(fù)性執(zhí)行的任務(wù)時(shí)荒给,可以使用迭代機(jī)制丈挟,其使用格式為將需要迭代的內(nèi)容定義為item變量引用,并通過with_item語句來指明迭代的元素列表即可志电,例如:
- hosts: test
remote_user: root
tasks:
- name: touch file
file: name={{ item }} state=directory? ##循環(huán)創(chuàng)建ietm曙咽,而item對應(yīng)的值為with_items中指定的
with_items:? ##列出item索要對應(yīng)的值
- file1
- file2
事實(shí)上,with_items中可以使用元素還可為hashes挑辆,例如:
- hosts: test
remote_user: root
tasks:
- name: touch file
user: name={{ item.name}} state=present groups={{ item.groups }}? ##在各個主機(jī)創(chuàng)建用戶桐绒,以及指定用戶的基本組
with_items:
- { name: 'testuser1', groups: 'nginx' }
- { name: 'testuser2', groups: 'apache' }
###### Ansible中使用Templates
http://blog.csdn.net/modoo_junko/article/details/45460693