一文掌握 Ansible 自動(dòng)化運(yùn)維
1一、基本部署
安裝Ansible
#?yum?-y?install?epel-release
#?yum?list?all?*ansible*
#?yum?info?ansible
#?yum?-y?install?ansible
Ansible配置文件
/etc/ansible/ansible.cfg????主配置文件
/etc/ansible/hosts??????????Inventory
/usr/bin/ansible-doc????????幫助文件
/usr/bin/ansible-playbook???指定運(yùn)行任務(wù)文件
定義Inventory
#?cd?/etc/ansible/
#?cp?hosts{,.bak}
#?>?hosts
#?cat?hosts
[webserver]
127.0.0.1
192.168.10.149
[dbserver]
192.168.10.113
使用秘鑰方式連接
#?ssh-keygen?-t?rsa?
#?ssh-copy-id?-i?/root/.ssh/[email protected]
#?ssh-copy-id?-i?/root/.ssh/[email protected]
#?ssh-copy-id?-i?/root/.ssh/[email protected]
使用幫助
#?ansible-doc?-l????????????????列出ansible所有的模塊
#?ansible-doc?-s?MODULE_NAME????查看指定模塊具體適用
Ansible命令應(yīng)用基礎(chǔ)
語(yǔ)法:ansible [-f forks] [-m module_name] [-a args]
這次命令對(duì)哪些主機(jī)生效的
inventory group name
ip
all
-f forks 一次處理多少個(gè)主機(jī)
-m module_name 要使用的模塊
-a args 模塊特有的參數(shù)
# ansible 192.168.10.113 -m command -a 'date'
# ansible webserver -m command -a 'date'
# ansible all -m command -a 'date'
2二、常見模塊
command?????命令模塊(默認(rèn)模塊)用于在遠(yuǎn)程主機(jī)執(zhí)行命令;不能使用變量,管道等
#?ansible?all?-a?'date'
cron????????計(jì)劃任務(wù)????
???month???指定月份
???minute??指定分鐘
???job?????指定任務(wù)
???day?????表示那一天
???hour????指定小時(shí)
???weekday?表示周幾
???state???表示是添加還是刪除
?????? present:安裝
?????? absent:移除
???#?ansible?webserver?-m?cron?-a?'minute="*/10"?job="/bin/echo?hello"?name="test?cron?job"'???#不寫默認(rèn)都是*,每個(gè)任務(wù)都必須有一個(gè)名字?
???#?ansible?webserver?-a?'crontab?-l'
???#?ansible?webserver?-m?cron?-a?'minute="*/10"?job="/bin/echo?hello"?name="test?cron?job"?state=absent'??#移除任務(wù)
user????用戶賬號(hào)管理
???name????用戶名
???uid?????uid
???state???狀態(tài)??
???group???屬于哪個(gè)組
???groups??附加組
???home????家目錄
???createhome??是否創(chuàng)建家目錄
???comment?注釋信息
???system??是否是系統(tǒng)用戶
???
???#?ansible?all?-m?user?-a?'name="user1"'
???#?ansible?all?-m?user?-a?'name="user1"?state=absent'
group???組管理
???gid?????gid??????
???name????組名???????????????
???state???狀態(tài)???????????
???system??是否是系統(tǒng)組
???#?ansible?webserver?-m?group?-a?'name=mysql?gid=306?system=yes'
???#?ansible?webserver?-m?user?-a?'name=mysql?uid=306?system=yes?group=mysql'
copy????復(fù)制文件(復(fù)制本地文件到遠(yuǎn)程主機(jī)的指定位置)
???src?????定義本地源文件路徑
???dest????定義遠(yuǎn)程目錄文件路徑(絕對(duì)路徑)
???owner???屬主
???group???屬組
???mode????權(quán)限
???content?取代src=,表示直接用此處的信息生成為文件內(nèi)容
???#?yum?-y?install?libselinux-python
???#?ansible?all?-m?copy?-a?'src=/etc/fstab?dest=/tmp/fstab.ansible?owner=root?mode=640'
???#?ansible?all?-m?copy?-a?'content="hello?ansible
Hi?ansible"?dest=/tmp/test.ansible'
file????設(shè)置文件的屬性
???path|dest|name??對(duì)那個(gè)文件做設(shè)定
???
???創(chuàng)建文件的符號(hào)鏈接:
?????? src:????指定源文件
?????? path:???指明符號(hào)鏈接文件路徑
???#?ansible?all?-m?file?-a?'owner=mysql?group=mysql?mode=644?path=/tmp/fstab.ansible'
???#?ansible?all?-m?file?-a?'path=/tmp/fstab.link?src=/tmp/fstab.ansible?state=link'
ping????測(cè)試指定主機(jī)是否能連接
???#?ansible?all?-m?ping
service?管理服務(wù)運(yùn)行狀態(tài)
???enabled?是否開機(jī)自動(dòng)啟動(dòng)
???name????指定服務(wù)名
???state???指定服務(wù)狀態(tài)
???????started?????啟動(dòng)服務(wù)
???????stoped??????停止服務(wù)
???????restarted???重啟服務(wù)
???arguments???服務(wù)的參數(shù)
???#?ansible?webserver?-m?service?-a?'enabled=true?name=httpd?state=started'
shell???在遠(yuǎn)程主機(jī)上運(yùn)行命令
???尤其是用到管道變量等功能的復(fù)雜命令
???#?ansible?all?-m?shell?-a?'echo?devopsman?|?passwd?--stdin?user1'
script??將本地腳本復(fù)制到遠(yuǎn)程主機(jī)并運(yùn)行之
???#?ansible?all?-m?script?-a?'/tmp/test.sh'
yum?????安裝程序包
???name????程序包名稱(不指定版本就安裝最新的版本latest)
???state???present,latest表示安裝,absent表示卸載
???#?ansible?webserver?-m?yum?-a?'name=httpd'
???#?ansible?all?-m?yum?-a?'name=ntpdate'??#默認(rèn)就是安裝
???#?ansible?all?-m?yum?-a?'name=ntpdate?state=absent'
setup???收集遠(yuǎn)程主機(jī)的facts
???每個(gè)被管理節(jié)點(diǎn)在接受并運(yùn)行管理命令之前,會(huì)將自己主機(jī)相關(guān)信息,如操作系統(tǒng)版本,IP地址等報(bào)告給遠(yuǎn)程的ansible主機(jī)?
???#?ansible?all?-m?setup
3三、Ansible playbook
組成結(jié)構(gòu):
inventory???????#以下操作應(yīng)用的主機(jī)
modules?????????#調(diào)用哪些模塊做什么樣的操作
ad?hoc?commands?#在這些主機(jī)上運(yùn)行哪些命令
playbooks???
???tasks???????#任務(wù),即調(diào)用模塊完成的某操作
???variable????#變量
???templates???#模板
???handlers????#處理器,由某事件觸發(fā)執(zhí)行的操作
???roles???????#角色
4四、YAML
4.1 YAML介紹
YAML是一個(gè)可讀性高的用來(lái)表達(dá)資料序列的格式。YAML參考了其它多種語(yǔ)言,包括:XML、C語(yǔ)言、Python、Perl以及電子郵件格式RFC2822等。ClarkEvans在2001年首次發(fā)表了這種語(yǔ)言,另外Ingy dot Net與Oren Ben-Kiki也是這語(yǔ)言的共同設(shè)計(jì)者。
YAML Ain't Markup Language,即YAML不是XML,不過,在開發(fā)這種語(yǔ)言時(shí),YAML的意思其實(shí)是:"Yet Another Markup Language"(仍是一種標(biāo)記語(yǔ)言),其特性:
YAML的可讀性好 YAML和腳本語(yǔ)言的交互性好 YAML使用實(shí)現(xiàn)語(yǔ)言的數(shù)據(jù)類型 YAML有一個(gè)一致的信息模型 YAML易于實(shí)現(xiàn) YAML可以基于流來(lái)處理 YAML表達(dá)能力強(qiáng),擴(kuò)展性好
更多的內(nèi)容及規(guī)范參見[1]
4.2 YAML語(yǔ)法
YAML的語(yǔ)法和其他高階語(yǔ)言類似,并且可以簡(jiǎn)單表達(dá)清單、散列表、標(biāo)量等數(shù)據(jù)結(jié)構(gòu),其結(jié)構(gòu)(structure)通過空格來(lái)展示,序列(sequence)里的項(xiàng)用"-"來(lái)表示,Map里面的鍵值對(duì)用":"分割,下面是一個(gè)示例。
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:?13
???????gender:?female
YAML文件擴(kuò)展名通常為.yaml,如example.yaml
Docker+K8s+Jenkins 主流技術(shù)全解視頻資料
4.2.1 list
列表的所有元素均使用"-"打頭,例如:
#?A?list?of?testy?fruits
-?Apple
-?Orange
-?Strawberry
-?Mango
4.2.2 dictionary
字典通過key與value進(jìn)行標(biāo)識(shí),例如:
---
#?An?employee?record
name:?Example?Developer
job:?Developer
skill:?Elite
也可以將key:value放置于{}中進(jìn)行表示,例如:
---
#An?exmloyee?record
{name:?Example?Developer,?job:?Developer,?skill:?Elite}
5五、Ansible基礎(chǔ)元素
5.1 變量
5.1.1 變量命名
變量名僅能由字母、數(shù)字和下劃線組成,且只能以字母開頭。
5.1.2 facts
facts是由正在通信的遠(yuǎn)程目標(biāo)主機(jī)發(fā)回的信息,這些信息被保存在ansible變量中。要獲取指定的遠(yuǎn)程主機(jī)所支持的所有facts,可使用如下命令進(jìn)行:
#ansible?hostname?-m?setup
5.1.3 register
把任務(wù)的輸出定義為變量,然后用于其他任務(wù),實(shí)例如下:
tasks:
???-?shell:?/usr/bin/foo
?????register:?foo_result
?????ignore_errors:?True
5.1.4 通過命令行傳遞變量
在運(yùn)行playbook的時(shí)候也可以傳遞一些變量供playbook使用,示例如下:
#ansible-playbook?test.yml?--extra-vars?"hosts=www?user=devopsman"
5.1.5 通過roles傳遞變量
當(dāng)給一個(gè)主機(jī)應(yīng)用角色的時(shí)候可以傳遞變量,然后在角色內(nèi)使用這些變量,示例如下:
-?hosts:?webserver
?roles:
???-?common
???-?{role:?foo_app_instance,?dir:?'/web/htdocs/a.com',?port:?8080}
5.2 Inventory
ansible的主要功用在于批量主機(jī)操作,為了便捷的使用其中的部分主機(jī),可以在inventory file中將其分組命名,默認(rèn)的inventory file為/etc/ansible/hosts
inventory file可以有多個(gè),且也可以通過Dynamic Inventory來(lái)動(dòng)態(tài)生成。
5.2.1 inventory文件格式
inventory文件遵循INI文件風(fēng)格,中括號(hào)中的字符為組名??梢詫⑼粋€(gè)主機(jī)同時(shí)歸并到多個(gè)不同的組中;此外,當(dāng)如若目標(biāo)主機(jī)使用非默認(rèn)的SSH端口,還可以在主機(jī)名稱之后使用冒號(hào)加端口號(hào)來(lái)表明。
ntp.devopsman.cn
[webserver]
www1.devopsman.cn:2222
www2.devopsman.cn
[dbserver]
db1.devopsman.cn
db2.devopsman.cn
db3.devopsman.cn
如果主機(jī)名遵循相似的命名模式,還可使用列表的方式標(biāo)識(shí)個(gè)主機(jī),例如:
[webserver]
www[01:50].example.com
[databases]
db-[a:f].example.com
5.2.2 主機(jī)變量
可以在inventory中定義主機(jī)時(shí)為其添加主機(jī)變量以便于在playbook中使用,例如:
[webserver]
www1.devopsman.cn http_port=80 maxRequestsPerChild=808
www2.devopsman.cn http_port=8080 maxRequestsPerChild=909
5.2.3 組變量
組變量是指賦予給指定組內(nèi)所有主機(jī)上的在playbook中可用的變量。例如:
[webserver]
www1.devopsman.cn
www2.devopsman.cn
[webserver:vars]
ntp_server=ntp.devopsman.cn
nfs_server=nfs.devopsman.cn
5.2.4 組嵌套
inventory中,組還可以包含其它的組,并且也可以向組中的主機(jī)指定變量。不過,這些變量只能在ansible-playbook中使用,而ansible不支持。例如:
[apache]
httpd1.devopsman.cn
httpd2.devopsman.cn
[nginx]
ngx1.devopsman.cn
ngx2.devopsman.cn
[webserver:children] #固定格式
apache
nginx
[webserver:vars]
ntp_server=ntp.devopsman.cn
5.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_private_key_file
ansible_shell_type
ansible_python_interpreter
5.3 條件測(cè)試
如果需要根據(jù)變量、facts或此前任務(wù)的執(zhí)行結(jié)果來(lái)做為某task執(zhí)行與否的前提時(shí)要用到條件測(cè)試。
5.3.1 when語(yǔ)句
在task后添加when字句即可使用條件測(cè)試;when語(yǔ)句支持jinja2表達(dá)式語(yǔ)句,例如:
tasks:
?-?name:?'shutdown?debian?flavored?system"
???command:?/sbin/shutdown?-h?now
???when:?ansible_os_family?==?"Debian"
when語(yǔ)句中還可以使用jinja2的大多"filter",例如果忽略此前某語(yǔ)句的錯(cuò)誤并基于其結(jié)果(failed或success)運(yùn)行后面指定的語(yǔ)句,可使用類似如下形式;
tasks:
?-?command:/bin/false
???register:?result
???ignore_errors:?True
?-?command:?/bin/something
???when:?result|failed
?-?command:?/bin/something_else
???when:?result|success
?-?command:?/bin/still/something_else
???when:?result|skipped
此外,when語(yǔ)句中還可以使用facts或playbook中定義的變量
#?cat?cond.yml?
-?hosts:?all
?remote_user:?root
?vars:
?-?username:?user10
?tasks:
?-?name:?create?{{?username?}}?user
???user:?name={{?username?}}?
???when:?ansible_fqdn?==?"node1.exercise.com"
5.4 迭代
當(dāng)有需要重復(fù)性執(zhí)行的任務(wù)時(shí),可以使用迭代機(jī)制。其使用格式為將需要迭代的內(nèi)容定義為item變量引用,并通過with_items語(yǔ)句來(lái)指明迭代的元素列表即可。例如:
-?name:?add?server?user
?user:?name={{?item?}}?state=persent?groups=wheel
?with_items:
???-?testuser1
???-?testuser2
上面語(yǔ)句的功能等同于下面的語(yǔ)句:
-?name:?add?user?testuser1
?user:?name=testuser1?state=present?group=wheel
-?name:?add?user?testuser2
?user:?name=testuser2?state=present?group=wheel
事實(shí)上,with_items中可以使用元素還可為hashes,例如:
-?name:?add?several?users
?user:?name={{?item.name}}?state=present?groups={{?item.groups?}}
?with_items:
???-?{?name:?'testuser1',?groups:?'wheel'}
???-?{?name:?'testuser2',?groups:?'root'}
Ansible的循環(huán)機(jī)制還有更多的高級(jí)功能,具體請(qǐng)參考官方文檔[2]
6六、模板示例:
#?grep?'{{'?conf/httpd.conf?
MaxClients???????{{?maxClients?}}
Listen?{{?httpd_port?}}
#?cat?/etc/ansible/hosts
[webserver]
127.0.0.1?httpd_port=80?maxClients=100
192.168.10.149?httpd_port=8080?maxClients=200
#?cat?apache.yml?
-?hosts:?webserver
?remote_user:?root
?vars:
?-?package:?httpd
?-?service:?httpd
?tasks:
?-?name:?install?httpd?package
???yum:?name={{?package?}}?state=latest
?-?name:?install?configuration?file?for?httpd
???template:?src=/root/conf/httpd.conf?dest=/etc/httpd/conf/httpd.conf
???notify:?
???-?restart?httpd
?-?name:?start?httpd?service
???service:?enabled=true?name={{?service?}}?state=started
?
?handlers:
?-?name:?restart?httpd
???service:?name=httpd?state=restarted
7七、Ansible playbooks
playbook是由一個(gè)或多個(gè)"play"組成的列表。play的主要功能在于將事先歸并為一組的主機(jī)裝扮成事先通過ansible中的task定義好的角色。從根本上來(lái)講,所有task無(wú)非是調(diào)用ansible的一個(gè)module。將多個(gè)play組織在一個(gè)playbook中,即可以讓他們連同起來(lái)按事先編排的機(jī)制同唱一臺(tái)大戲。下面是一個(gè)簡(jiǎn)單示例。
-?hosts:?webserver
?vars:
???http_port:?80
???max_clients:?256
?remote_user:?root
?tasks:
?-?name:?ensure?apache?is?at?the?latest?version
???yum:?name=httpd?state=latest
?-?name:?ensure?apache?is?running
???service:?name=httpd?state=started
?handlers:
???-?name:?restart?apache
?????service:?name=httpd?state=restarted
7.1 playbook基礎(chǔ)組件
7.1.1 Hosts和Users
playbook中的每一個(gè)play的目的都是為了讓某個(gè)或某些主機(jī)以某個(gè)指定的用戶身份執(zhí)行任務(wù)。hosts用于指定要執(zhí)行指定任務(wù)的主機(jī),其可以使一個(gè)或多個(gè)由冒號(hào)分隔主機(jī)組;remote_user則用于指定遠(yuǎn)程主機(jī)的執(zhí)行任務(wù)的用戶,如上面的實(shí)例中的
-?hosts:?webserver
?remote_user:?root
不過,remote_user也可用于各task中,也可以通過指定其通過sudo的方式在遠(yuǎn)程主機(jī)上執(zhí)行任務(wù),其可用于play全局或其任務(wù);此外,甚至可以在sudo時(shí)使用sudo_user指定sudo時(shí)切換的用戶。
-?hosts:?webserver
?remote_user:?devopsman
?tasks:
??-?name:?test?connection
????ping:
????remote_user:?devopsman
????sudo:?yes
7.1.2 任務(wù)列表和action
play的主題部分是task list。task list中的各任務(wù)按次序逐個(gè)在hosts中指定的所有主機(jī)上執(zhí)行,即在所有主機(jī)上完成第一個(gè)任務(wù)后再開始第二個(gè)。在運(yùn)行自上而下某playbook時(shí),如果中途發(fā)生錯(cuò)誤,所有已執(zhí)行任務(wù)都可能回滾,在更正playbook后重新執(zhí)行一次即可。
taks的目的是使用指定的參數(shù)執(zhí)行模塊,而在模塊參數(shù)中可以使用變量。模塊執(zhí)行是冪等的。這意味著多次執(zhí)行是安全的,因?yàn)槠浣Y(jié)果均一致。
每個(gè)task都應(yīng)該有其name,用于playbook的執(zhí)行結(jié)果輸出,建議其內(nèi)容盡可能清晰地描述任務(wù)執(zhí)行步驟,如果為提供name,則action的結(jié)果將用于輸出。
定義task可以使用"action: module options"或”module:options“的格式推薦使用后者以實(shí)現(xiàn)向后兼容。如果action一行的內(nèi)容過多,也中使用在行首使用幾個(gè)空白字符進(jìn)行換行。
tasks:
?-?name:make?sure?apache?is?running
???service:?name=httpd?state=started
tasks:
?-?name:?run?this?command?and?ignore?the?result
???shell:?/usr/bin/somecommand?||?/bin/true
在眾多的模塊中,只有command和shell模塊僅需要給定一個(gè)列表而無(wú)需使用"key=value"格式,例如:
tasks:
?-?name:?disable?selinux
???command:?/sbin/setenforce?0
如果命令或腳本的退出碼不為零,可以使用如下方式替代:
或者使用ignore_errors來(lái)忽略錯(cuò)誤信息:
tasks:
?-?name:?run?this?command?and?ignore?the?result
???shell:?/usr/bin/somecommand
???ignore_errors:?True
7.1.3handlers
用于當(dāng)關(guān)注的資源發(fā)生變化時(shí)采取一定的操作。
"notify"這個(gè)action可用于在每個(gè)play的最后被觸發(fā),這樣可以避免多次有改變發(fā)生時(shí)每次都執(zhí)行執(zhí)行的操作,取而代之,僅在所有的變化發(fā)生完成后一次性地執(zhí)行指定操作,在notify中列出的操作稱為handlers,也即notify中調(diào)用handlers中定義的操作。
-?name:?template?configuration?file
?template:?src=template.j2?dest=/etc/foo.conf
?notify:
???-?restart?memcached
???-?restart?apache
handlers是task列表,這些task與前述的task并沒有本質(zhì)上的不同。
handlers:
?-?name:?restart?memcached
???service:?name=memcached?state=restarted
?-?name:?restart?apache
???service:?name=apache?state=restarted
簡(jiǎn)單示例1:
#?cat?nginx.yml?
-?hosts:?webserver
?remote_user:?root
?tasks:
?-?name:?create?nginxn?group
???group:?name=nginx?system=yes?gid=208
?-?name:?create?nginx?user
???user:?name=nginx?uid=208?group=nginx?system=yes
-?hosts:?dbserver
?remote_user:?root
?tasks:
?-?name:?copy?file?to?dbserver
???copy:?src=/etc/inittab?dest=/tmp/inittab.ans
???
#?ansible-playbook?nginx.yml
簡(jiǎn)單示例2:
#?cat?apache.yml?
-?hosts:?webserver
?remote_user:?root
?tasks:
?-?name:?install?httpd?package
???yum:?name=httpd?state=latest
?-?name:?install?configuration?file?for?httpd
???copy:?src=/root/conf/httpd.conf?dest=/etc/httpd/conf/httpd.conf
?-?name:?start?httpd?service
???service:?enabled=true?name=httpd?state=started
#?ansible-playbook?apache.yml
handlers 示例:
#?cat?apache.yml?
-?hosts:?webserver
?remote_user:?root
?tasks:
?-?name:?install?httpd?package
???yum:?name=httpd?state=latest
?-?name:?install?configuration?file?for?httpd
???copy:?src=/root/conf/httpd.conf?dest=/etc/httpd/conf/httpd.conf
???notify:?
???-?restart?httpd
?-?name:?start?httpd?service
???service:?enabled=true?name=httpd?state=started
?
?handlers:
?-?name:?restart?httpd
???service:?name=httpd?state=restarted
#??ansible-playbook?apache.yml
variable 示例1:
#?cat?apache.yml?
-?hosts:?webserver
?remote_user:?root
?vars:
?-?package:?httpd
?-?service:?httpd
?tasks:
?-?name:?install?httpd?package
???yum:?name={{?package?}}?state=latest
?-?name:?install?configuration?file?for?httpd
???copy:?src=/root/conf/httpd.conf?dest=/etc/httpd/conf/httpd.conf
???notify:?
???-?restart?httpd
?-?name:?start?httpd?service
???service:?enabled=true?name={{?service?}}?state=started
?
?handlers:
?-?name:?restart?httpd
???service:?name=httpd?state=restarted
variable 示例2:(在playbook中可以使用所有的變量)
#?cat?facts.yml?
-?hosts:?webserver
?remote_user:?root
?tasks:
?-?name:?copy?file
???copy:?content="{{?ansible_all_ipv4_addresses?}}?"?dest=/tmp/vars.ans
8八、roles
ansible自1.2版本引入的新特性,用于層次性、結(jié)構(gòu)化地組織playbook。roles能夠根據(jù)層次型結(jié)構(gòu)自動(dòng)轉(zhuǎn)載變量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。簡(jiǎn)單來(lái)講,roles就是通過分別將變量、文件、任務(wù)、模板以及處理器放置于單獨(dú)的目錄中,并可以便捷地include他們的一種機(jī)制。角色一般用于基于主機(jī)構(gòu)建服務(wù)的場(chǎng)景中,但也可以使用于構(gòu)建守護(hù)進(jìn)程的場(chǎng)景中
Docker+K8s+Jenkins 主流技術(shù)全解視頻資料
一個(gè)roles的案例如下所示:
site.yml
webserver.yml
fooserver.yml
roles/
???common/
???????files/
???????templates/
???????tasks/
???????handlers/
???????vars/
???????meta/
???webserver/
???????files/
???????templates/
???????tasks/
???????handlers/
???????vars/
???????meta/
而在playbook中,可以這樣使用role:
-?hosts:?webserver
?roles:
???-?common??
???-?webserver
也可以向roles傳遞參數(shù),例如:
-?hosts:?webserver
?roles:
???-?common
???-?{?role:?foo_app_instance,?dir:'/opt/a',port:5000}
???-?{?role:?foo_app_instance,?dir:'/opt/b',port:5001}
甚至也可以條件式地使用roles,例如:
-?hosts:webserver
?roles:
???-?{?role:?some_role,?when:?"ansible_so_family?==?'RedHat"?}
8.1 創(chuàng)建role的步驟
創(chuàng)建以roles命名的目錄: 在roles目錄中分別創(chuàng)建以各角色命名的目錄,如webserver等 在每個(gè)角色命名的目錄中分別創(chuàng)建files、handlers、meta、tasks、templates和vars目錄;用不到的目錄可以創(chuàng)建為空目錄,也可以不創(chuàng)建 在playbook文件中,調(diào)用各角色
8.2 role內(nèi)各目錄中可應(yīng)用的文件
task目錄:至少應(yīng)該包含一個(gè)為main.yml的文件,其定義了此角色的任務(wù)列表;此文件可以使用include包含其它的位于此目錄中的task文件; file目錄:存放由copy或script等模板塊調(diào)用的文件; template目錄:template模塊會(huì)自動(dòng)在此目錄中尋找jinja2模板文件; handlers目錄:此目錄中應(yīng)當(dāng)包含一個(gè)main.yml文件,用于定義此角色用到的各handlers,在handler中使用inclnude包含的其它的handlers文件也應(yīng)該位于此目錄中; vars目錄:應(yīng)當(dāng)包含一個(gè)main.yml文件,用于定義此角色用到的變量 meta目錄:應(yīng)當(dāng)包含一個(gè)main.yml文件,用于定義此角色的特殊設(shè)定及其依賴關(guān)系;ansible1.3及其以后的版本才支持; default目錄:應(yīng)當(dāng)包含一個(gè)main.yml文件,用于為當(dāng)前角色設(shè)定默認(rèn)變量時(shí)使用此目錄;
#?mkdir?-pv?ansible_playbooks/roles/{webserver,dbserver}/{tasks,files,templates,meta,handlers,vars}?
#?cp?/etc/httpd/conf/httpd.conf?files/??
#?pwd
/root/ansible_playbooks/roles/webserver?
#?cat?tasks/main.yml?
-?name:?install?httpd?package
?yum:?name=httpd?state=present
-?name:?install?configuretion?file
?copy:?src=httpd.conf?dest=/etc/httpd/conf/httpd.conf
?tags:
?-?conf
?notify:
?-?restart?httpd
-?name:?start?httpd
?service:?name=httpd?state=started
#?cat?handlers/main.yml?
-?name:?restart?httpd
?service:?name=httpd?state=restarted
???
#?pwd;ls
/root/ansible_playbooks
roles??site.yml?
#?cat?site.yml?
-?hosts:?webserver
?remote_user:?root
?roles:
?-?webserver
#?ansible-playbook?site.yml
9九、Tags
tags用于讓用戶選擇運(yùn)行或跳過playbook中的部分代碼。ansible具有冪等性,因此會(huì)自動(dòng)跳過沒有變化的部分,即便如此,有些代碼為測(cè)試其確實(shí)沒有發(fā)生變化的時(shí)間依然會(huì)非常的長(zhǎng)。此時(shí),如果確信其沒有變化,就可以通過tags跳過此些代碼片段。
tags:在playbook可以為某個(gè)或某些任務(wù)定義一個(gè)"標(biāo)簽",在執(zhí)行此playbook時(shí),通過為ansible-playbook命令使用--tags選項(xiàng)能耐實(shí)現(xiàn)僅運(yùn)行指定的tasks而非所有的;
#?cat?apache.yml?
-?hosts:?webserver
?remote_user:?root
?vars:
?-?package:?httpd
?-?service:?httpd
?tasks:
?-?name:?install?httpd?package
???yum:?name={{?package?}}?state=latest
?-?name:?install?configuration?file?for?httpd
???template:?src=/root/conf/httpd.conf?dest=/etc/httpd/conf/httpd.conf
???tags:
???-?conf
???notify:?
???-?restart?httpd
?-?name:?start?httpd?service
???service:?enabled=true?name={{?service?}}?state=started
?
?handlers:
?-?name:?restart?httpd
???service:?name=httpd?state=restarted
#?ansible-playbook?apache.yml?--tags='conf'
特殊tags:always #無(wú)論如何都會(huì)運(yùn)行
- END - ?推薦閱讀? 31天拿下K8s含金量最高的CKA+CKS證書! Linux 使用 Systemd 管理進(jìn)程服務(wù),劃重點(diǎn)~ Linux的10個(gè)最危險(xiǎn)命令 Kubernetes網(wǎng)絡(luò)難懂?可能是沒看到這篇文章 100個(gè)Linux Shell腳本經(jīng)典案例(附PDF) 24 個(gè) Docker 常見問題處理技巧 23 款 DevOps 工具建設(shè)云原生時(shí)代 Shell分析日志文件,全面解鎖新姿勢(shì)! 這篇文章帶你全面掌握 Nginx ! 一文搞懂 Kubernetes 網(wǎng)絡(luò)通信原理 SRE本質(zhì)就是一個(gè)懂運(yùn)維的資深開發(fā) Kubernetes 4000節(jié)點(diǎn)運(yùn)維經(jīng)驗(yàn)分享 Kubernetes 的高級(jí)部署策略,你不一定知道! 基于Nginx實(shí)現(xiàn)灰度發(fā)布與AB測(cè)試 大型網(wǎng)站技術(shù)架構(gòu)設(shè)計(jì) 搭建一套完整的企業(yè)級(jí) K8s 集群(v1.22,二進(jìn)制方式) 點(diǎn)亮,服務(wù)器三年不宕機(jī)


