Ansible自動化部署之Play book的使用

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的格式要求比較嚴格,所以在部署時必定要注意格式的書寫。文中如有不當之處望見諒。各位能夠在評論處留言支出不當之處。

相關文章
相關標籤/搜索