咱們完成一個任務,例如安裝部署一個httpd服務,咱們須要多個模塊(一個模塊也能夠稱之爲task)提供功能來完成。而playbook就是組織多個task的容器,他的實質就是一個文件,有着特定的組織格式,它採用的語法格式是YAML(Yet Another Markup Language)。YAML語法可以簡單的表示散列表,字典等數據結構。具體請參考YAML詳細語法css
列表:每個列表成員前面都要有一個短橫線和一個空格html
fruits:
- Apple
- Orange
- Strawberry
- Mango
或者:
fruits: ['Apple', 'Orange', 'Strawberry', 'Mango']
字典:每個成員由鍵值對組成,注意冒號後面要有空格python
martin: name: Martin D'vloper job: Developer skill: Elite 或者 martin: {name: Martin D'vloper, job: Developer, skill: Elite}
列表和字典能夠混合使用linux
- martin: name: Martin D'vloper job: Developer skills: - python - perl - pascal - tabitha: name: Tabitha Bitumen job: Developer skills: - lisp - fortran - erlang
整個playbook是以task爲中心,代表要執行的任務。hosts和remote_user代表在哪些遠程主機以何種身份執行。其餘組件讓其可以更加靈活。web
下面詳細介紹某些組件sql
變量定義在資產(inventory)中:shell
主機變量:
192.168.200.136 http_port=808 maxRequestsPerChild=808
192.168.200.137 http_port=8080 maxRequestsPerChild=909
主機組變量: [websers] 192.168.200.136 192.168.200.137 [websers:vars] ntp_server=ntp.exampl.com proxy=proxy.exampl.com
變量定義在playbook中centos
- hosts: webservers vars: http_port: 80
使用facts變量:緩存
facts變量是由setup模塊獲取遠程主機的信息。 用法: ansible 192.168.200.136 -m setup
在roles中定義變量bash
後面介紹
ansible-playbook 命令中傳入參數
使用 -e選項傳入參數 ansible-playbook 192.168.200.136 -e "httpd_port=808" httpd04.yml
變量的引用
{{ var_name }}
它是一個模塊功能,與copy不一樣的是他的文本文件採用了jinga2語法,
jinga2基本語法以下,
字面量:
字符串:使用單引號或雙引號
數字:整型,浮點數
列表:{item1,item2,...}
字典:{key1:value1,key2:value2,...}
布爾型:true/false 算術運算: +,-,*,/,//,%,** 比較運算: ==,!=,>,>=,<,<= 邏輯運算: and,or,not
注意:template只能在palybook中使用。
執行的模塊命令
格式:
action:模塊參數(此種方式只在較新的版本中出現)
module:參數(已鍵值對的形式出現)
每個task都有一個名稱,用於標記此任務。任務示例:
name: install httpd yum: name=httpd state=present 注意:shell和command沒有參數,可在後面直接跟命令 shell: ss -tnl | grep :80 (1)某任務的運行狀態爲changed後,可經過相應的notify通知相應的handlers (2)任務能夠經過tags打標籤,而後經過palybook命令-t選項調用.
用法:
ansible-playbook <filename.yml> ... [options] <filename.yml>:yaml格式的playbook文件路徑,必須指明 [options]: 選項 -C, --check:並不在遠程主機上執行,只是測試。 -i PATH, --inventory=PATH:資產的文件路徑 --flush-cache:清楚fact緩存 --list-hosts:列出匹配的遠程主機,並不執行任何動做 -t, TAGS, --tags=TAGS:運行指定的標籤任務 --skip-tags:跳過指定的notify,後面詳細介紹。
資產文件
~] cat /etc/ansible/Hosts
[webservers]
192.168.200.136 httpd_port=808
192.168.200.137 httpd_port=8088
[test] 192.168.200.13[6:7]
httpd配置文件
~] grep ^Listen /etc/httpd/conf/httpd.conf Listen 808
palybook文件
~] cat /root/httpd01.yml
- hosts: webservers
remote_user: root
tasks:
- name: install httpd yum: name=httpd state=present - name: install configure file copy: src=httpd.conf dest=/etc/httpd/conf/ - name: start httpd service service: name=httpd state=started
測試playbook
運行playbook
再次執行playbook
~]# yum install libselinux-python
從上圖能夠看出,192.168.200.136執行成功,而192.168.200.137啓動服務時配置文件錯誤,這是由於拷貝過去的配置文件是centos7上的,而137這臺主機是centos6,它安裝的是httpd-2.2配置文件不兼容。此問題後面解決。
查看服務啓動時的端口
copy命令拷貝配置文件時,沒法對配置文件進行修改,不夠靈活。接下來咱們使用template拷貝文件,並使用主機變量設置httpd端口號
資產文件
~]# cat /etc/ansible/hosts [webservers] 192.168.200.136 httpd_port=8088 [test] 192.168.200.13[6:7]
配置文件
~]# grep ^Listen httpd.conf.j2 Listen {{ httpd_port }}
palybook文件
~]# cat httpd02.yml - hosts: 192.168.200.136 remote_user: root tasks: - name: install httpd yum: name=httpd state=present - name: install configure file template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf - name: start httpd service service: name=httpd state=started
運行playbook
由圖能夠看出,playbook中只將文件拷貝過去了,並無重啓服務,因此咱們能夠看到端口監聽的依然是808而不是8088。此時咱們須要在配置文件修改時觸發一個任務,這就是handlers的用法,從新修改playbook文件。
從新修改YAML文件
~]# cat httpd02.yml - hosts: 192.168.200.136 remote_user: root tasks: - name: install httpd yum: name=httpd state=present - name: install configure file notify: restart httpd service template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf - name: start httpd service service: name=httpd state=started handlers: - name: restart httpd servcie service: name=httpd state=restarted
notify代表此task改變時,它會觸發一個事件,此事件會調用name爲restart httpd service的handlers task。
再次運行playbook
能夠看到,此playbook執行了兩個任務,一個是拷貝文件,一個是重啓服務。也能夠看到此時監聽的端口不在是808而是8088
咱們修改配置文件並重啓服務,這是一個很是常見的操做。由上面咱們看到,儘管咱們只需執行兩個task但咱們把全部的任務都執行一遍,這會下降效率,咱們可使用tags來指定執行那個任務。
資產文件
注意,修改了端口號
~] cat /etc/ansibele/hosts
[webservers]
192.168.200.136 httpd_port=8080
[test] 192.168.200.13[6:7]
修改playbook文件
~]# cat httpd03.yml - hosts: 192.168.200.136 remote_user: root tasks: - name: install httpd yum: name=httpd state=present - name: install configure file notify: restart httpd service tags: reinstall configure file template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf - name: start httpd service service: name=httpd state=started handlers: - name: restart httpd service service: name=httpd state=restarted
執行playbook
由圖能夠看到,playbook只執行了拷貝文件,以及拷貝文件觸發的重啓服務事件。也能夠看到服務開啓的是8080端口。
在前面有一個問題沒有解決就是centos6和centos7配置文件不兼容的問題,咱們須要對其進行判斷,不一樣的版本拷貝同的文件。
咱們將lamp放在一臺主機上時,咱們須要安裝多個程序包,寫成一個一個的task顯得效率不高,寫的臃腫。咱們可使用循環來進行安裝。
以解決上面遺留的問題爲例,如何讓centos6的主機拷貝centos6的文件,讓centos7的主機拷貝centos7的文件。
也可使用變量來實現,此處不作演示
資產文件
~]# cat /etc/ansible/hosts [webservers] 192.168.200.136 httpd_port=8088 192.168.200.137 httpd_port=8080 [test] 192.168.200.13[6:7]
playbook文件
其中的ansible_distribution_major_version是ansible收集的facts
測試playbook文件
跳過notify,讓其不執行重啓服務的操做,在執行playbook時使用 --skip-tags選項
值得注意的是,雖然沒有執行重啓,但拷貝配置文件也沒有執行。
執行playbook
注意:他的語法格式相似jinja2。
playbook文件
執行playbook文件並查看