1、Ansible Play book 的使用php
一、Playbook的核心元素node
二、Play books簡介python
三、Play book的基礎nginx
(1)主機與用戶web
(2)tasks任務列表shell
(3)task定義示例apache
(4)Play book使用示例編程
四、Play book變量的使用vim
(1)變量的定義示例centos
五、Play book中notifyh和handlers的使用.
示例:觸發
六、Play book中tags的使用
七、tepmplates 模板的使用
jinja2語言
示例:模板安裝nginx
when條件判斷
迭代with_items
1、AnsiblePlay book 的使用
一、Playbook的核心元素
Hosts: 主機,部署目標
Tasks: 任務,ansible,執行目的
Varlables: 變量
Templates: 包含了模板語法的文本文件;
Handlers: 有特定條件觸發的任務
Roles : 角色 (特別介紹)
二、Play books簡介
簡單來講,playbooks 是一種簡單的配置管理系統與多機器部署系統的基礎.與現有的其餘系統有不一樣之處,且很是適合於複雜應用的部署.
Playbooks可用於聲明配置,更強大的地方在於,在 playbooks 中能夠編排有序的執行過程,甚至於作到在多組機器間,來回有序的執行特別指定的步驟.而且能夠同步或異步的發起任務.
Playbooks 的格式是YAML(詳見:YAML 語法),語法作到最小化,意在避免 playbooks 成爲一種編程語言或是腳本,但它也並非一個配置模型或過程的模型.
playbook 由一個或多個 ‘plays’ 組成.它的內容是一個以 ‘plays’ 爲元素的列表.
在 play 之中,一組機器被映射爲定義好的角色.在 ansible 中,play 的內容,被稱爲 tasks,即任務.在基本層次的應用中,一個任務是一個對 ansible 模塊的調用。
三、Play book的基礎
(1)主機與用戶
Hosts:運行指定任務的目標主機 ()能夠是一個或多個冒號分隔的主機組)
remoute_user: 在遠程主機上執行任務的用戶;
(2)tasks任務列表
每一個play包含了一個task列表(任務列表),每個task在其對應的全部主機上(經過host parttern匹配到的全部主機)執行完畢以後才執行下一task。注意:一個paly中的全部hosts 都會獲取相同的任務指令,也就是將一組選出的hosts映射到task上,全部主機執行task任務中的命令。
每個task的目標在於執行一個moudle,一般是帶有特定的參數來執行,在參數中可使用變量(variables).
modules是具備「冪等」性的,意思是若是在執行module時此前已經執行過一次,目標主機不會做出任何改變,假設新一次的執行有所改動,那moudle只會改變必要的已經改變的地方,原有的已經執行過的結果不會發生任何改變。
每個task必須有一個名稱name,這樣在運行play book時,從其輸出的任務執行信息中能夠很好的判斷屬於哪一個task,若是沒有定義name, action的值將會用做輸出信息中標記的特定的taask。
(3)task定義示例
示例1:
下面是一種基本的task定義,server module 使用key=value格式的參數,這也是大多數moudle使用的參數格式:
tasks:
- name: apache start
service:name=httpd state=started
示例2:
注意:shell和command模塊後面直接跟命令,而非key=value類的參數列表
tasks:
- name: disable selunx
command: /sbin/setenforce 0
(4)Play book使用示例
示例1:添加用戶
[root@centos7_1 yaml]# cat user.yaml --- - hosts: all remote_user: root tasks: - name: create user1 user: name=user1 system=true uid=307 - name: create user2 user: name=user1 system=true uid=308 [root@centos7_1 yaml]# ansible-playbook user.yaml #可添加—check 選項執行前檢查
四、Play book變量的使用
(1)facts: 可直接調用
(2)ansible-playbook 命令的命令行中的自定義變量
-e EXTRA_VARS, --extra-vars=EXTRA_VARS #命令行中定義變量傳遞至yaml文件。
(3)經過roles傳遞變量
(4)Host Inventory
(a)向不一樣的主機傳遞不一樣的變量;
IP/HOSTANME varable=value var2=value2
在hosts 組ip後添加變量
(b)向組中的主機傳遞相同的變量
[group:var]
arable=value
注意:Inventory參數:
用於定義ansible遠程鏈接目標主機時使用的參數,而非傳遞給playbook的變量。 ansible_ssh_host
ansible_ssh_user
ansible_ssh_port
ansible_ssh_pass
ansible_sudo_pass
….
查看遠程主機的所有系統信息
ansible all -m setup #收集到的遠程主機的變量
(1)變量的定義示例:
變量定義位置 /etc/ansible/hosts 普通變量 [web] 172.16.250.240 http_port=80 172.16.252.18 http_port=8080 組變量 [web:var1] http_port=80 [web] 172.16.250.240 172.16.252.18 在playbook中定義變量的方法 Vars: - var1:value1 - var2:value2 命令行指定變量 nsible-playbook -e 調用
示例1:hosts定義變量使用方法
[root@centos7_1 ~]#vim /etc/ansible/hosts [web] 172.16.250.90 hname=node1 [root@centos7_1 ~]# cd /apps/yaml/ [root@centos7_1 yaml]# vim hosname.yml --- - hosts: web remote_user: root tasks: - name: sethostname hostname:name={{ hname }} [root@centos7_1 yaml]# ansible-playbook hosname.yml
示例2:在playbook中定義變量的方法
[root@centos7_1yaml]# vim user1.yml --- - hosts: web remote_user: root vars: #定義變量 - username: testuser1 #變量列表 - groupname: testgroup1 tasks: - name: crete group group: name={{ groupname }} state=present - name: crate user user: name={{ username }} state=present [root@centos7_1 yaml]#ansible-playbook user1.yml
示例3:命令行參數傳遞
利用命令行定義變量傳遞參數至劇本安裝memcached。 [root@centos7_1 yaml]#vim forth.yml --- - hosts: web remote_user: root tasks: - name: install $pkname yum: name={{pkname }} state=present [root@centos7_1yaml]# ansible-playbook -e pkname=memcached forth.yml
五、Play book中notifyh和handlers的使用
notify這個action可用於每一個play的最後被觸發,這樣能夠避免屢次有改變發生時每次都執行指定的操做,取而代之,僅在全部的變化發生完成以後一次性地執行指定操做。
在notify中列出的操做稱爲handler,即notify中調用handler中定義的操做。
handler也是也寫task的列表,經過名字來引用,他們和通常的task沒有什麼區別。
handler是由通知者進行notify,若是沒有被notify,handler是不會執行的。
無論有多少個通知者進行了notify,等到play中的全部task執行完成以後,handler也只會被執行一次。
handlers最佳的應用場景是用來重啓服務,或者觸發系統重啓操做的。除此以外不多會用到的。
示例:觸發
利用notify、handlers觸發式重啓服務。 [root@centos7_1yaml]# vim web-2.yml --- - hosts: web remote_user: root tasks: - name: install httpdpackage yum: name=httpdstate=present - name: install configurefile copy: src=/apps/work/files/httpd.confdest=/etc/httpd/conf/ #該文件與目標主機文件不徹底一致變回觸發。 notify: restart httpd - name: start httpd service service: name=httpdstate=started handlers: - name: restart httpd service: name=httpd state=restarted [root@centos7_1 yaml]#ansible-playbook web-2.yml
六、Play book中tags的使用
tags即標籤,tags能夠和一個play(就是不少個task)或者一個task進行捆綁。而後再執行play book時只需指定相應的tags便可僅執行與tags綁定的task。
示例:執行指定tags
[root@centos7_1yaml]# vim web-3.yml --- - hosts: web remote_user: root tasks: - name: install httpd package yum: name=httpd state=present - name: install configure file copy: src=/apps/work/files/httpd.conf dest=/etc/httpd/conf/ tags: instconf #tags - name: start httpd service service: name=httpd state=started [root@centos7_1 yaml]# ansible-playbook -tinstconf web-3.yml #指定tags instconf 執行。 ansible-playbookweb-3.yml --tags=" instconf " 執行此命令一樣僅執行instconf 標籤內容。
七、tepmplates 模板的使用
template是文本文件,嵌套有腳本(使用模板編程語言編寫)的配置文件。
講到template模板就不得不先介紹template使用語言 jinja2。
jinja2語言
Jinja2是基於python的模板引擎,功能比較相似於PHP的smarty,J2ee的Freemarker和velocity。它能徹底支持 unicode,並具備集成的沙箱執行環境,應用普遍。
Jinja2 語言:
字面量:
字符串:使用單引號或雙引號;
數字:整數,浮點數
列表:[item1,item2 …..]
元組:(item1item2…,)
字典:{key1:value,key2:value….}
布爾型: true/filase
算數運算:
+,- , * , / , // , % **
比較操做:
==, != , >= ,<=
邏輯運算:
and,or, not,
流表達式
For、IF、when
示例:模板安裝nginx
模板配置文件nginx.conf.j2 Worker_porcesses {{ ansible_precossor_vcpus }} #注意空格哦。 此變量執行ansible all -m setup (收集到的遠程主機的變量) 便可查看到 Worker_porcesses {{ ansible_precossor_vcpus +1 }} 此表達式也可。此處只爲表示可支持算數運算。 [root@centos7_1 yaml]# vim nginx.yml --- - hosts: web remote_user: root tasks: - name: install nginx yum: name=nginx state=present - name: install conf file template: src=/apps/work/files/nginx.conf.j2 dest=/etc/nginx/nginx.conf notify: restart nginx tags: instconf - name: start nginx service service: name=nginx state=started handlers: - name: restart nginx service:name=nginx state=restarted [root@centos7_1 yaml]# ansible-playbook nginx.yml
when條件判斷
when 語句:在task中使用。Jinja2的語法格式 tasks: - name: install conf file to Centos7 template:src=files/nginxconf.c7.j2 dest=/etc/nginx/nginx.conf when: ansible_distribution_major_version==」7」 - name: install conf file to Centos6 template:src=files/nginxconf.c6.j2 dest=/etc/nginx/nginx.conf when:ansible_distribution_major_version ==」6」 以上語法表示若查詢遠程主機系統爲centos6則執行,install conf file to Centos6。 若爲cenos7則執行install conf file to Centos7。
迭代with_items
循環迭代,須要重複執行的任務;對迭代項引用,固定變量名爲item,然後在task中使用with_items給定迭代的元素列表;
列表方法:
字符串
字典
示例1: 字符串方式 - name: install some package yum:name={{ item }} state=present with_items: - nginx - memecached - php-fpm 示例2: 字典方式 - name: add some groups group: name={{ item }} state=present with_items: - group1 - group2 - group3 - name: add some user user: name={{ item.name }} group=`item`.`group` state=present with_items: - {name: 'user1',group: 'group1'} - {name: 'user2',group: 'group2'} - {name: 'user3',group: 'group3'}
ansible的格式要求比較嚴格,所以在部署時必定要注意格式的書寫。文中如有不當之處望見諒。各位能夠在評論處留言支出不當之處。