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