playbook 剧本编写
文章目錄
- 一: playbooks 簡(jiǎn)述
- 1.1 什么是playbooks
- 1.2 playbooks的組成
- 1.3 playbooks劇本示例
- 1.3.1 先修改/etc/ansible/hosts主機(jī)清單
- 1.3.2 編寫安裝并啟動(dòng)httpd服務(wù)的劇本
- 1.3.3 準(zhǔn)備/opt/httpd.conf文件
- 1.4 執(zhí)行ploybooks劇本
- 1.5 檢查yaml文件,和指定task開始運(yùn)行
- 1.5.1 yaml 文件語法檢查
- 1.5.2 指定從某個(gè)task開始運(yùn)行
- 二: 定義和引用變量
- 2.1 定義變量
- 2.1.1 合法的變量名
- 2.1.2 playbook中定義變量的格式
- 2.2 使用變量
- 2.2.1 變量的替換
- 2.3 yaml陷阱
- 2.4 使用Facts獲取的信息
- 2.5 在命令行定義變量
- 2.6 ansible提供的變量
- 2.6.1 hostvars變量
- 2.6.2groups變量
- 2.6.3 groups 變量
- 2.7 變量文件的分隔
- 2.8 變量的優(yōu)先級(jí)
- 2.9playbook變量使用示例
- 三 指定遠(yuǎn)程主機(jī)sudo切換用戶
- 四:when 條件判斷
- 4.1 跳過主機(jī),或者讓滿足條件的主機(jī)執(zhí)行任務(wù)
- 4.2 迭代
- 五 templates模塊
- 5.1 準(zhǔn)備模板
- 5.2 修改主機(jī)清單文件
- 5.3 編寫playbook
- 六: tags模塊
- 6.1 指定tags標(biāo)簽執(zhí)行
- 6.2 使用always標(biāo)簽
- 七:role 模塊
- 7.1 roles的目錄結(jié)構(gòu)
- 7.2 roles 目錄的含義解釋
- 7.3 在一個(gè)playbook中使用roles的步驟
- 1 創(chuàng)建以roles命名的目錄
- 2 創(chuàng)建全局變量目錄(可選)
- 3 在roles目錄中分別創(chuàng)建以各角色名稱命名的目錄,如http,mysql
- 4 在每個(gè)角色命令的目錄中分別創(chuàng)建files、handlers、tasks、templates、meta、defaults和vars目錄,用不到的目錄可以創(chuàng)建為空目錄,也可以不創(chuàng)建
- 5 每個(gè)角色的 handlers、tasks、meta、defaults、vars 目錄下創(chuàng)建 main.yml 文件,千萬不能自定義文件名
- 6 修改site.yml 文件,針對(duì)不同主機(jī)去調(diào)用不同的角色
- 7 運(yùn)行ansible-playbook
- 7.4 示例
- 1 創(chuàng)建相應(yīng)的目錄和文件
- 2 編寫httpd 模塊
- 3 編寫mysql模塊
- 4 編寫php模塊
- 5 編寫roles示例
一: playbooks 簡(jiǎn)述
1.1 什么是playbooks
Playbooks 是 Ansible的配置,部署,編排語言.他們可以被描述為一個(gè)需要希望遠(yuǎn)程主機(jī)執(zhí)行命令的方案,或者一組IT程序運(yùn)行的命令集合.
在基礎(chǔ)層面, playbooks 可以被用來管理用于部署到遠(yuǎn)程主機(jī)的配置文件.在更高的層面上,playbooks 可以依次對(duì)多層式架構(gòu)上的服務(wù)器執(zhí)行上線包括滾動(dòng)更新在內(nèi)的操作并可以將操作委托給其他主機(jī)包括在此過程中發(fā)生的與監(jiān)視服務(wù)器,負(fù)載均衡服務(wù)器的交互操作在內(nèi).
Playbooks 的格式是YAM,語法做到最小化,意在避免 playbooks 成為一種編程語言或是腳本,但它也并不是一個(gè)配置模型或過程的模型.
playbook 由一個(gè)或多個(gè) ‘plays’ 組成.它的內(nèi)容是一個(gè)以 ‘plays’ 為元素的列表.
在 play 之中,一組機(jī)器被映射為定義好的角色.在 ansible 中,play 的內(nèi)容,被稱為 tasks,即任務(wù).在基本層次的應(yīng)用中,一個(gè)任務(wù)是一個(gè)對(duì) ansible 模塊的調(diào)用,這在前面章節(jié)學(xué)習(xí)過.
‘plays’ 好似音符,playbook 好似由 ‘plays’ 構(gòu)成的曲譜,通過 playbook,可以編排步驟進(jìn)行多機(jī)器的部署,比如在 webservers 組的所有機(jī)器上運(yùn)行一定的步驟, 然后在 database server 組運(yùn)行一些步驟,最后回到 webservers 組,再運(yùn)行一些步驟,諸如此類.
“plays” 算是一個(gè)體育方面的類比,你可以通過多個(gè) plays 告訴你的系統(tǒng)做不同的事情,不僅是定義一種特定的狀態(tài)或模型.你可以在不同時(shí)間運(yùn)行不同的 plays.
1.2 playbooks的組成
playbooks本身由以下各部分組成
1.3 playbooks劇本示例
1.3.1 先修改/etc/ansible/hosts主機(jī)清單
[root@host103 ~]# vim /etc/ansible/hosts ... #將主機(jī)ip或者主機(jī)名(要做主機(jī)名映射) 加入webservers組 [webservers] 192.168.23.105 ....1.3.2 編寫安裝并啟動(dòng)httpd服務(wù)的劇本
#劇本名應(yīng)該是 .yml 或者 .yaml 結(jié)尾 [root@host103 opt]# vim daemon1.yaml --- #yaml文件以 三個(gè)短橫杠--- 開頭,表明是一個(gè)yaml文件。可以省略 - name: first palybook # 定義一個(gè)play 的名稱。可以省略gather_facts: false #設(shè)置不進(jìn)行facts信息收集。這樣可以加快執(zhí)行速度。默認(rèn)是true。可以省略hosts: webservers #指定要執(zhí)行任務(wù)的被管理主機(jī),多個(gè)主機(jī)組用冒號(hào): 隔開。remote_user: root #指定被管理主機(jī)上執(zhí)行任務(wù)的用戶tasks: #定義任務(wù)列表。任務(wù)列表中的各個(gè)任務(wù)安次序在hosts定義的主機(jī)上執(zhí)行- name: test connection #自定義任務(wù)名稱。可以省略。但是為了排查,不建議省略ping: #使用module: [options] 格式來定義任務(wù)。這里使用ping 模塊- name: disable selinuxcommand: '/sbin/setenforce 0' #command和shell 模塊無需使用key=value的模式。引號(hào)可省#忽略失敗任務(wù)。如果命令返回值不為0,就會(huì)報(bào)錯(cuò),退出playboos。所以使用此選項(xiàng),忽略失敗的任務(wù)ignore_errors: true - name: disable firewalld#使用module: options的格式來定義任務(wù).option 使用key=value的格式service: name=firewalld state=stopped enabled=no- name: install apacheyum: name=httpd state=latest- name: start apache serviceservice: name=httpd state=started enabled=yes- name: modify httpd configuration file#需要事先準(zhǔn)備好/opt/httpd.conf文件copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf#設(shè)置觸發(fā)器。如果以上操作后為change狀態(tài),會(huì)通過notify 指定的名稱觸發(fā)對(duì)應(yīng)名稱的handlers操作notify: "restart httpd"#handlers中定義的就是任務(wù)handlers:#設(shè)置任務(wù)名。應(yīng)該和notify指定的任務(wù)名相同- name: restart httpd#設(shè)置執(zhí)行的動(dòng)作。這里使用service模塊,執(zhí)行重啟httpd的動(dòng)作service: name=httpd state=restarted#Ansible在執(zhí)行完某個(gè)任務(wù)之后并不會(huì)立即去執(zhí)行對(duì)應(yīng)的handler,而是在當(dāng)前play中所有普通任務(wù)都執(zhí)行完后再去執(zhí)行handler,這樣的好處是可以多次觸發(fā)notify,但最后只執(zhí)行一次對(duì)應(yīng)的handler,從而避免多次重啟。1.3.3 準(zhǔn)備/opt/httpd.conf文件
root@host103 opt]# vim httpd.conf #配置監(jiān)聽端口和域名(正常是使用80端口) 42// Listen 8080 95// ServerName www.mynet.com:80801.4 執(zhí)行ploybooks劇本
格式:
ansible-playbook 劇本名
補(bǔ)充參數(shù):
-k (-ask-pass):用來交互輸入ssh密碼
-K (-ask-become-pass):用來交互輸入sudo密碼
-u :指定用戶
1.5 檢查yaml文件,和指定task開始運(yùn)行
1.5.1 yaml 文件語法檢查
#檢查yaml 文件的語法是否正確 [root@host103 opt]# ansible-playbook demo1.yaml --syntax-check#檢查task任務(wù) [root@host103 opt]# ansible-playbook demo1.yaml --list-task#檢查生效的主機(jī) [root@host103 opt]# ansible-playbook demo1.yaml --list-hosts1.5.2 指定從某個(gè)task開始運(yùn)行
#將192.168.23.105 主機(jī)的firewalld服務(wù)開啟 [root@host105 ~]# systemctl start firewalld [root@host105 ~]# systemctl is-active firewalld active #192.168.23.105 停止httpd服務(wù),并移除httpd [root@host105 ~]# systemctl stop httpd [root@host105 ~]# yum -y remove httpd#先查看有哪些tasks [root@host103 opt]# ansible-playbook demo1.yaml --list-task playbook: demo1.yamlplay #1 (webservers): first palybook TAGS: []tasks:test connection TAGS: []disable selinux TAGS: []disable firewalld TAGS: []install apache TAGS: []start apache service TAGS: []modify httpd configuration file TAGS: []#指定從 install apache 這個(gè)任務(wù)開始執(zhí)行 [root@host103 opt]# ansible-playbook demo1.yaml --start-at-task='install apache'#此時(shí),192.168.23.105主機(jī),重新安裝了httpd,并啟動(dòng)了服務(wù) [root@host105 ~]# rpm -q httpd httpd-2.4.6-67.el7.centos.x86_64 [root@host105 ~]# systemctl is-active httpd active#由于disale firewalld任務(wù)在install apache 任務(wù)之前,因此,沒有被執(zhí)行 [root@host105 ~]# systemctl is-active firewalld active二: 定義和引用變量
2.1 定義變量
2.1.1 合法的變量名
在使用變量之前最好先知道什么是合法的變量名. 變量名可以為字母,數(shù)字以及下劃線.變量始終應(yīng)該以字母開頭.、“foo_port”是個(gè)合法的變量名.
”foo5”也是.“foo-port”, “foo port”, “foo.port” 和 “12”則不是合法的變量名.
2.1.2 playbook中定義變量的格式
可以使用vars定義變量,多個(gè)變量應(yīng)該組成列表的格式。變量的格式為key: value的格式
如
2.2 使用變量
Ansible允許你使用Jinja2模板系統(tǒng)在playbook中引用變量.借助Jinja你能做很多復(fù)雜的操作,
2.2.1 變量的替換
#在簡(jiǎn)單的模板中可以如下操作,這也是變量替換的最基本形式 My amp goes to {{ max_amp_value }}#在playbook中替換: template: src=foo.cfg.j2 dest={{ remote_install_path }}/foo.cfg#在上述的例子中,我們使用變量來決定文件放置在哪里. #在模板中你自動(dòng)會(huì)獲取在主機(jī)范圍之內(nèi)的所有變量的訪問權(quán)2.3 yaml陷阱
Ansible 使用 “{{ var }}” 來引用變量. 如果一個(gè)值以 “{” 開頭, YAML 將認(rèn)為它是一個(gè)字典, 所以我們必須引用它, 像這樣:foo: “{{ variable }}”
#錯(cuò)誤的例子 - hosts: app_serversvars:app_path: {{ base_path }}/22#正確的例子 - hosts: app_serversvars:app_path: "{{ base_path }}/22"2.4 使用Facts獲取的信息
還有其它地方可以獲取變量,這些變量是自動(dòng)發(fā)現(xiàn)的,而不是用戶自己設(shè)置的.
Facts通過訪問遠(yuǎn)程系統(tǒng)獲取相應(yīng)的信息. 一個(gè)例子就是遠(yuǎn)程主機(jī)的IP地址或者操作系統(tǒng)是什么. 使用以下命令可以查看哪些信息是可用的:
ansible hostname -m setup
2.5 在命令行定義變量
在命令行,可以使用 -e 指定變量。但是會(huì)覆蓋playbooks里的變量
[root@host103 opt]#ansible-playbook demo1 -e "username=nginx"2.6 ansible提供的變量
Ansible會(huì)自動(dòng)提供給你一些變量,即使你并沒有定義過它們.這些變量中重要的有
‘hostvars’,’group_names’,和 ‘groups’.由于這些變量名是預(yù)留的,所以用戶不應(yīng)當(dāng)覆蓋它們. ‘environmen’ 也是預(yù)留的.
2.6.1 hostvars變量
hostvars可以讓你訪問其它主機(jī)的變量,包括哪些主機(jī)中獲取到的facts.如果你還沒有在當(dāng)前playbook或者一組playbook的任何play中訪問那個(gè)主機(jī),那么你可以獲取變量,但無法看到facts值. 如果數(shù)據(jù)庫服務(wù)器想使用另一個(gè)節(jié)點(diǎn)的某個(gè) ‘fact’ 值,或者賦值給該節(jié)點(diǎn)的一個(gè)inventory變量.可以在一個(gè)模板中甚至命令行中輕松實(shí)現(xiàn):
{{ hostvars['test.example.com']['ansible_distribution'] }}2.6.2groups變量
group_names 是當(dāng)前主機(jī)所在所有群組的列表(數(shù)組).所以可以使用Jinja2語法在模板中根據(jù)該主機(jī)所在群組關(guān)系(或角色)來產(chǎn)生變化:
{% if 'webserver' in group_names %}# some part of a configuration file that only applies to webservers {% endif %}2.6.3 groups 變量
groups 是inventory中所有群組(主機(jī))的列表.可用于枚舉群組中的所有主機(jī).例如:
{% for host in groups['app_servers'] %}# something that applies to all app servers. {% endfor %}一個(gè)經(jīng)常使用的范式是找出該群組中的所有IP地址:
{% for host in groups['app_servers'] %}{{ hostvars[host]['ansible_eth0']['ipv4']['address'] }} {% endfor %}2.7 變量文件的分隔
把playbook置于源代碼管理之下是個(gè)很好的注意,當(dāng)你可能會(huì)想把playbook源碼公開之余還想保持某些重要的變量私有.有時(shí)你也想把某些信息放置在不同的文件中,遠(yuǎn)離主playbook文件.
你可以使用外部的變量文件來實(shí)現(xiàn):
這可以保證你共享playbook源碼時(shí)隔離敏感數(shù)據(jù)的風(fēng)險(xiǎn).
每個(gè)變量文件的內(nèi)容是一個(gè)簡(jiǎn)單的YAML文件,如下所示:
--- # in the above example, this would be vars/external_vars.yml somevar: somevalue password: magic2.8 變量的優(yōu)先級(jí)
* extra vars (在命令行中使用 -e)優(yōu)先級(jí)最高 * 然后是在inventory中定義的連接變量(比如ansible_ssh_user) * 接著是大多數(shù)的其它變量(命令行轉(zhuǎn)換,play中的變量,included的變量,role中的變量等) * 然后是在inventory定義的其它變量 * 然后是由系統(tǒng)發(fā)現(xiàn)的facts * 然后是 "role默認(rèn)變量", 這個(gè)是最默認(rèn)的值,很容易喪失優(yōu)先權(quán)2.9playbook變量使用示例
[root@host103 opt]# vim demo2.yaml - name: second playbook#啟動(dòng)facts,默認(rèn)為true(或者yes).如果想要關(guān)閉,使用false或者nogather_facts: yeshosts: webserversremote_user: root#定義變量。groupname變量,值為test ; username變量,值為zhangsanvars:- groupname: test- username: zhangsantasks:- name: create group#引用變量groupnamegroup: name={{groupname}} system=yes gid=1024- name: create user for group#引用變量username和groupnameuser: name={{username}} system=yes uid=9527 group={{groupname}}- name: test copy file#從facts里引用變量。但是要求facts必須是開啟.#ansible_defaule_ipv4為其中的一個(gè)key。copy: content="{{ansible_default_ipv4}}" dest=/opt/test.txt#執(zhí)行劇本 [root@host103 opt]# ansible-playbook demo2.yaml #在192.168.23.103 上使用ansible 的setup模塊,并使用filter過濾鍵值對(duì)信息 [root@host103 opt]# ansible webservers -m setup -a 'filter=ansible_default_ipv4'#在192.168.23.105主機(jī)查看zhangsan用戶是否生成,組是否是test [root@host105 opt]# id zhangsan #查看/opt/test.txt [root@host105 opt]# cat /opt/test.txt三 指定遠(yuǎn)程主機(jī)sudo切換用戶
--- - hosts: dbserversremote_user: zhangsan become: yes #2.6版本以后的參數(shù),之前是sudo,意思為切換用戶運(yùn)行become_user: root #指定sudo用戶為root如果你需要在使用 sudo 時(shí)指定密碼,可在運(yùn)行 ansible-playbook 命令時(shí)加上選項(xiàng) --ask-sudo-pass (-K). 如果使用 sudo 時(shí),playbook 疑似被掛起,可能是在 sudo prompt 處被卡住,這時(shí)可執(zhí)行 Control-C 殺死卡住的任務(wù),再重新運(yùn)行一次.
當(dāng)使用 sudo_user 切換到 非root 用戶時(shí),模塊的參數(shù)會(huì)暫時(shí)寫入 /tmp 目錄下的一個(gè)隨機(jī)臨時(shí)文件. 當(dāng)命令執(zhí)行結(jié)束后,臨時(shí)文件立即刪除.這種情況發(fā)生在普通用戶的切換時(shí),比如從 ‘bob’ 切換到 ‘timmy’, 切換到 root 賬戶時(shí),不會(huì)發(fā)生,如從 ‘bob’ 切換到 ‘root’,直接以普通用戶或root身份登錄也不會(huì)發(fā)生. 如果你不希望這些數(shù)據(jù)在短暫的時(shí)間內(nèi)可以被讀取(不可寫),請(qǐng)避免在 sudo_user 中傳遞未加密的密碼. 其他情況下,’/tmp’ 目錄不被使用,這種情況不會(huì)發(fā)生.Ansible 也有意識(shí)的在日志中不記錄密碼參數(shù).
四:when 條件判斷
在Ansible中,提供的唯一一個(gè)通用的條件判斷是when指令,當(dāng)when指令的值為true時(shí),則該任務(wù)執(zhí)行,否則不執(zhí)行該任務(wù)。
when一個(gè)比較常見的應(yīng)用場(chǎng)景是實(shí)現(xiàn)跳過某個(gè)主機(jī)不執(zhí)行任務(wù)或者只有滿足條件的主機(jī)執(zhí)行任務(wù)
4.1 跳過主機(jī),或者讓滿足條件的主機(jī)執(zhí)行任務(wù)
vim demo3.yaml --- - hosts: allremote_user: roottasks:- name: rebootcommand: /usr/sbin/shutdown -r now#when指令中的變量名不需要手動(dòng)加上 {{}}#次任務(wù)效果為:當(dāng)主機(jī)位192.168.23.105時(shí),執(zhí)行/usr/sbin/shutdown -r now命令,重啟主機(jī)when: ansible_default_ipv4.address == "192.168.23.105" 或 when: inventory_hostname == "<主機(jī)名>"ansible-playbook demo3.yaml4.2 迭代
Ansible提供了很多種循環(huán)結(jié)構(gòu),一般都命名為with_items,作用等同于 loop 循環(huán)。
[root@host103 opt]# vim demo4.yaml --- - name: play4hosts: webserversgather_facts: falsetasks:- name: create directories#創(chuàng)建目錄。目錄名使用with_items里的循環(huán)file:#由于值是{{....}} ,所以為了防止被認(rèn)為是字典,要加上雙引號(hào).path: "{{item}}"state: directory#with_items循環(huán),等同于loop循環(huán) with_items:- /opt/zhangsan- /opt/lisi- name: add users#使用循環(huán)創(chuàng)建用戶,并添加附加組。user:#以下兩種方法都可以調(diào)用with_iptems里的值name: "{{item.name}}"groups: "{{item['test_groups']}}"with_items:#以下兩種方法都可以- name: test01test_groups: aaa- {name: test02, test_groups: bbb} #在管理機(jī)上運(yùn)行劇本 [root@host103 opt]# ansible-playbook demo4.yaml #在被管理主機(jī)上查看執(zhí)行結(jié)果 [root@host105 opt]# ls lisi zhangsan [root@host105 opt]# id test01 uid=9528(test01) gid=9528(test01) 組=9528(test01),2222(aaa) [root@host105 opt]# id test02 uid=9529(test02) gid=9529(test02) 組=9529(test02),3333(bbb五 templates模塊
Jinja是基于Python的模板引擎。Template類是Jinja的一個(gè)重要組件,可以看作是一個(gè)編譯過的模板文件,用來產(chǎn)生目標(biāo)文本,傳遞Python的變量給模板去替換模板中的標(biāo)記。
5.1 準(zhǔn)備模板
準(zhǔn)備一個(gè)一 .j2 為后綴的template模板文件,設(shè)置引用的變量
[root@host103 opt]# cp httpd.conf httpd.conf.j2 [root@host103 opt]# vim httpd.conf.j2 #42//設(shè)置監(jiān)聽端口為變量。引用變量http_port的值42// Listen {{http_port}}#95// 設(shè)置域名為引用變量server_name的值95 ServerName {{server_name}}#119// 設(shè)置網(wǎng)站根目錄為引用root_dir的值119// DocumentRoot "{{root_dir}}"#131// 配置目錄訪問權(quán)限131// <Directory "{{root_dir}}">5.2 修改主機(jī)清單文件
修改主機(jī)清單文件,使用主機(jī)變量定義一個(gè)變量名相同,而值不同的變量
[root@host103 opt]# vim /etc/ansible/hosts#使用主機(jī)變量,對(duì)變量進(jìn)行單個(gè)的定義 [webservers] 192.168.23.105 http_port=192.168.23.105:80 server_name=www.mynet.com:80 root_dir=/opt/mynet[dbservers] 192.168.23.106 http_port=192.168.23.106:8080 server_name=www.zhi.com:8080 root_dir=/opt/zhi5.3 編寫playbook
--- - name: for diff apachehosts: webservers dbserversremote_user: rootvars:- Package: httpd- Service: httpd- mynet: /opt/mynet- zhi: /opt/zhitasks:- name: install httpdyum: name={{Package}} state=latest- name: install configure filetemplate: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: create root dir for mynetfile: path={{mynet}} state=directorywhen: ansible_default_ipv4.address == "192.168.23.105"- name: for mynet index.htmlcopy: content='this is mynet.com' dest={{mynet}}/index.htmlwhen: ansible_default_ipv4.address == "192.168.23.105"- name: create root dir for zhifile: path={{zhi}} state=directorywhen: ansible_default_ipv4.address == "192.168.23.106"- name: for zhi index.htmlcopy: content='this is zhi.com' dest={{zhi}}/index.htmlwhen: ansible_default_ipv4.address == "192.168.23.106"- name: start httpdservice: name={{Service}} enabled=true state=startedhandlers:- name: restart httpdservice: name={{Service}} state=restarted[root@host103 opt]# ansible-playbook demo5.yaml #訪問測(cè)試 [root@host103 opt]# curl http://192.168.23.105:80 this is mynet.com [root@host103 opt]# curl http://192.168.23.106:8080 this is zhi.com六: tags模塊
可以在一個(gè)playbook中為某個(gè)或某些任務(wù)定義“標(biāo)簽”,在執(zhí)行此playbook時(shí)通過ansible-playbook命令使用–tags選項(xiàng)能實(shí)現(xiàn)僅運(yùn)行指定的tasks。
playbook還提供了一個(gè)特殊的tags為always。作用就是當(dāng)使用always作為tags的task時(shí),無論執(zhí)行哪一個(gè)tags時(shí),定義有always的tags都會(huì)執(zhí)行。
6.1 指定tags標(biāo)簽執(zhí)行
[root@host104 opt]# vim webhosts.yaml --- - name: for test tagshosts: webserversremote_user: roottasks:- name: copy hosts filecopy: src=/etc/hosts dest=/opt/hosts#使用tags設(shè)置標(biāo)簽tags:- only- name: touch filefile: path=/opt/testhost state=touch#使用--tags指定標(biāo)簽。 [root@host104 opt]# ansible-playbook webhosts.yaml --tags="only" #在被管理主機(jī)上查看 [root@host105 opt]# ls hosts6.2 使用always標(biāo)簽
playbook還提供了一個(gè)特殊的tags為always。作用就是當(dāng)使用always作為tags的task時(shí),無論執(zhí)行哪一個(gè)tags時(shí),定義有always的tags都會(huì)執(zhí)行。
#先將被管理主機(jī)上的復(fù)制文件hosts刪除 [root@host105 opt]# rm -rf hosts[root@host104 opt]# vim webhosts.yaml --- - name: for test tagshosts: webserversremote_user: roottasks:- name: copy hosts filecopy: src=/etc/hosts dest=/opt/hoststags:- only- name: touch filefile: path=/opt/testhost state=touch#添加tags標(biāo)簽alwaystags:- always#依舊是指定標(biāo)簽執(zhí)行 [root@host104 opt]# ansible-playbook webhosts.yaml --tags="only" [root@host105 opt]# ls hosts testhost七:role 模塊
Ansible為了層次化、結(jié)構(gòu)化地組織Playbook,使用了角色(roles),roles可以根據(jù)層次型結(jié)構(gòu)自動(dòng)裝載變量文件、task以及handlers等。簡(jiǎn)單來講,roles就是通過分別將變量、文件、任務(wù)、模塊及處理器放置于單獨(dú)的目錄中,并可以便捷地include它們。roles一般用于基于主機(jī)構(gòu)建服務(wù)的場(chǎng)景中,但也可以用于構(gòu)建守護(hù)進(jìn)程等場(chǎng)景中。
7.1 roles的目錄結(jié)構(gòu)
[root@host104 ansible]# cd /etc/ansible/ [root@host104 ansible]# tree roles/ #創(chuàng)建roles下創(chuàng)建的第一層目錄為角色目錄。 #角色目錄里需要包含files,templates,tasks,handlers,vars,defaults,meta目錄 roles/ ├── web/ │ ├── files/ │ ├── templates/ │ ├── tasks/ │ ├── handlers/ │ ├── vars/ │ ├── defaults/ │ └── meta/ └── db/├── files/├── templates/├── tasks/├── handlers/├── vars/├── defaults/└── meta/7.2 roles 目錄的含義解釋
- files
- 用來存放由 copy 模塊或 script 模塊調(diào)用的文件。
- templates
- 用來存放 jinjia2 模板,template 模塊會(huì)自動(dòng)在此目錄中尋找 jinjia2 模板文件。
- tasks
- 此目錄應(yīng)當(dāng)包含一個(gè) main.yml 文件,用于定義此角色的任務(wù)列表,此文件可以使用 include 包含其它的位于此目錄的 task 文件。
- handlers
- 此目錄應(yīng)當(dāng)包含一個(gè) main.yml 文件,用于定義此角色中觸發(fā)條件時(shí)執(zhí)行的動(dòng)作。
- vars
- 此目錄應(yīng)當(dāng)包含一個(gè) main.yml 文件,用于定義此角色用到的變量。
- defaults
- 此目錄應(yīng)當(dāng)包含一個(gè) main.yml 文件,用于為當(dāng)前角色設(shè)定默認(rèn)變量。
- meta
- 此目錄應(yīng)當(dāng)包含一個(gè) main.yml 文件,用于定義此角色的特殊設(shè)定及其依賴關(guān)系。
7.3 在一個(gè)playbook中使用roles的步驟
1 創(chuàng)建以roles命名的目錄
#使用yum 安裝的默認(rèn)就有 mkdir -p /etc/ansible/rules2 創(chuàng)建全局變量目錄(可選)
mkdir -p /etc/ansible/group_vars/ touch /etc/ansible/group_vars/all #文件名自己定義,引用的時(shí)候注意3 在roles目錄中分別創(chuàng)建以各角色名稱命名的目錄,如http,mysql
mkdir /etc/ansible/roles/httpd mkdir /etc/ansible/roles/mysql4 在每個(gè)角色命令的目錄中分別創(chuàng)建files、handlers、tasks、templates、meta、defaults和vars目錄,用不到的目錄可以創(chuàng)建為空目錄,也可以不創(chuàng)建
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}5 每個(gè)角色的 handlers、tasks、meta、defaults、vars 目錄下創(chuàng)建 main.yml 文件,千萬不能自定義文件名
touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml6 修改site.yml 文件,針對(duì)不同主機(jī)去調(diào)用不同的角色
vim /etc/ansible/site.yml --- - hosts: webserversremote_user: rootroles:- httpd - hosts: dbserversremote_user: rootroles:- mysql7 運(yùn)行ansible-playbook
cd /etc/ansible ansible-playbook site.yml7.4 示例
1 創(chuàng)建相應(yīng)的目錄和文件
[root@host104 ansible]# mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p[root@host104 ansible]# mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p[root@host104 ansible]# mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p[root@host104 ansible]# touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml [root@host104 ansible]# touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml [root@host104 ansible]# touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml[root@host104 ansible]# tree . ├── ansible.cfg ├── hosts └── roles├── httpd│ ├── defaults│ │ └── main.yml│ ├── files│ ├── handlers│ │ └── main.yml│ ├── meta│ │ └── main.yml│ ├── tasks│ │ └── main.yml│ ├── templates│ └── vars│ └── main.yml├── mysql│ ├── defaults│ │ └── main.yml│ ├── files│ ├── handlers│ │ └── main.yml│ ├── meta│ │ └── main.yml│ ├── tasks│ │ └── main.yml│ ├── templates│ └── vars│ └── main.yml└── php├── defaults│ └── main.yml├── files├── handlers│ └── main.yml├── meta│ └── main.yml├── tasks│ └── main.yml├── templates└── vars└── main.yml25 directories, 17 files2 編寫httpd 模塊
#寫一個(gè)簡(jiǎn)單的tasks/main.yml [root@host104 ansible]# vim /etc/ansible/roles/httpd/tasks/main.yml - name: install apacheyum: name={{pkg}} state=latest- name: start apacheservice: name={{svc}} state=started enabled=yes#定義變量:可以定義在全局變量中,也可以定義在roles角色變量中,一般定義在角色變量中 [root@host104 ansible]# vim /etc/ansible/roles/httpd/vars/main.yml pkg: httpd svc: httpd3 編寫mysql模塊
[root@host104 ansible]# vim /etc/ansible/roles/mysql/tasks/main.yml - name: install mysqlyum: name={{pkg}} state=latest- name: start mysqlservice: name={{svc}} state=started enabled=yes#需要使用在線源。因此將備份的yum源啟用 - name: remove yumreposhell: move /etc/yum.repos.d/bak/* /etc/yum.repos.d/ignore_errors: yes[root@host104 ansible]# vim /etc/ansible/roles/mysql/vars/main.yml pkg:- mariadb- mariadb-server svc: mariadb4 編寫php模塊
[root@host104 ansible]# vim /etc/ansible/roles/php/tasks/main.yml - name: install phpyum: name={{pkg}} state=latest- name: start php-fpmservice: enabled=true name={{svc}} state=started[root@host104 ansible]# vim /etc/ansible/roles/php/vars/main.yml pkg:- php- php-fpm svc: php-fpm5 編寫roles示例
[root@host104 ansible]# vim /etc/ansible/site.yml --- - hosts: webserversremote_user: rootroles:- httpd- mysql- php[root@host104 ansible]# cd /etc/ansible [root@host104 ansible]# ansible-playbook site.yml #在管理主機(jī)上可以查看 [root@host105 yum.repos.d]# systemctl is-active httpd active [root@host105 yum.repos.d]# systemctl is-active mariadb active [root@host105 yum.repos.d]# systemctl is-active php-fpm active總結(jié)
以上是生活随笔為你收集整理的playbook 剧本编写的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ansible的安装和ansible的模
- 下一篇: playbook编写分布式lnmp