天天看點

Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

文章目錄

  • 一、YAML語言
    • 1.1 YAML介紹
    • 1.2 基本文法規則
    • 1.3 YAML支援的資料結構
  • 二、Ansible的腳本—playbook劇本
    • 2.1 playbook的組成
    • 2.2 補充指令
    • 2.3 tasks和action
      • 2.3.1 事務執行與復原
      • 2.3.2 name的必要性
      • 2.3.3 task的格式
      • 2.3.4 其他注意點
  • 三、編寫playbook劇本
    • 3.1 備份檔案到已知使用者的家目錄下
    • 3.2 建立新使用者
    • 3.3 安裝服務及開啟服務
    • 3.4 示例事務復原操作
    • 3.5 忽略錯誤,強制傳回成功
    • 3.6 多任務在同一劇本中
  • 四、handlers介紹及劇本編寫
    • 4.1 handlers介紹
    • 4.2 編寫劇本
  • 五、變量設定
    • 5.1 直接在劇本中指派變量
    • 5.2 通過ansible指令傳遞
    • 5.3 傳遞系統固定變量
    • 5.4 在hosts配置檔案中定義
  • 六、條件測試
    • 6.1 單條件測試
    • 6.2 多條件判斷
    • 6.3 組條件判斷
  • 七、疊代
    • 7.1 應用
  • 八、Templates模闆子產品
    • 8.1 執行個體
  • 九、tags标簽子產品
    • 9.1 單标簽任務
    • 9.2 多标簽任務
    • 9.3 always标簽
  • 十、role子產品
    • 10.1 roles内各目錄含義解釋
    • 10.2 通過roles子產品來完成LAMP架構

一、YAML語言

1.1 YAML介紹

  • 另一種标記語言,是用來寫配置檔案的語言,非常簡潔和強大;
  • YAML語言和其他語言類似,也可以表達散清單、标量等資料結構;
  • 結構通過空格來展示,序列裡配置項通過-來代表,Map裡鍵值用。

1.2 基本文法規則

  • 大小寫敏感
  • 是用縮進表示層級關系
  • 縮進時不允許是用tab鍵,隻允許使用空格
  • 縮進的空格數目不重要,隻要相同層級的元素左側對齊即可

1.3 YAML支援的資料結構

  • 對象:鍵值對的集合,又稱為映射(mapping)/哈希(hashes)/字典(directory)

    例如:name:Example Developer

  • 數組:一組按次序排列的值,又稱為序列(sequence)/清單(list)

    例如:-Apple

    -orange

  • 純量:單個的,不可再分的值

    例如:number:12.30

二、Ansible的腳本—playbook劇本

playbook是通過task調用ansible的子產品将多個play組織在一個playbook中運作

2.1 playbook的組成

  • Tasks:任務,即調用子產品完成的某操作
  • Variables:變量
  • Templates:模闆
  • Handles:處理器,當滿足某條件是,觸發執行的操作
  • Roles:角色

2.2 補充指令

ansible-playbook mysql.yaml --syntax-check	# 檢查yaml檔案的額文法是否正确

ansible-playbook mysql.yaml --list-task	# 檢查task任務

ansible-playbook mysql.yaml --list-hosts 		# 檢查生效的主機

ansible-playbook mysql.yaml --start-at-task="copy Nginx.conf" 	# 指定從某個task開始運作
           

2.3 tasks和action

2.3.1 事務執行與復原

  • Play的主體部分是task清單,task清單中的各任務按次序逐個在hosts中指定的主機上執行,即在所有主機上完成第一個任務後再開始第二個任務
  • 在運作playbook時(從上到下執行),如果一個host執行task失敗,整個tasks都會復原,請修正playbook中的錯誤,然後重新執行即可。
  • Task的目的是使用指定的參數執行子產品,而在子產品參數中可以使用變量,子產品執行時幂等的,這意味着多次執行是安全的,因為其結果一緻.

2.3.2 name的必要性

每一個task必須有一個名稱name,這樣在運作playbook時,從其輸出的任務執行資訊中可以很好的辨識出是屬于哪一個task的。如果沒有定X

2.3.3 task的格式

定 一個task,常見的格式:”module: options”例如 : yum: name=httpd

2.3.4 其他注意點

ansible的自帶子產品中,command子產品和shell子產品無需使用key=value格式

三、編寫playbook劇本

3.1 備份檔案到已知使用者的家目錄下

[[email protected] opt]# vim sudo1.yaml
- hosts: mysql		
  remote_user: root
 become: yes
  become_user: wangwu
  tasks:
    - name: copy file
     copy: src=/etc/fstab dest=/home/wangwu/fstab.bak

[[email protected] opt]# ansible-playbook 	sudo1.yaml --syntax-check	# 對劇本的文法進行檢測

playbook: sudo1.yaml		# 顯示這樣的為檢測通過

[[email protected] opt]# ansible-playbook sudo1.yaml	# 執行劇本

PLAY [mysql] 	**************************************************************************************

TASK [Gathering Facts] 	****************************************************************************
ok: [192.168.10.13]

TASK [copy file] **********************************************************************************
changed: [192.168.10.13]

PLAY RECAP ****************************************************************************************
192.168.10.13              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
           
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

3.2 建立新使用者

[[email protected] opt]# vim create.yml
- hosts: mysql
  remote_user: root
  tasks:
  - name: create group
    group: name=tomcat gid=303
  - name: create user
    user: name=tomcat uid=303 group=tomcat

[[email protected] opt]# ansible-playbook create.yml --syntax-check	# 檢查劇本的文法

playbook: create.yml

[[email protected] opt]# ansible-playbook create.yml	# 執行劇本

PLAY [mysql] *******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.10.13]

TASK [create group] ************************************************************
ok: [192.168.10.13]

TASK [create user] *************************************************************
ok: [192.168.10.13]

PLAY RECAP *********************************************************************
192.168.10.13              : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
           
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

3.3 安裝服務及開啟服務

[[email protected] opt]# vim httpd.yaml
- hosts: mysql
  remote_user: root
  tasks:
   - name: install httpd
     yum: name=httpd
   - name: stop firewlld
     service: name=firewalld state=stopped
   - name: start httpd
     service: name=httpd state=started
   - name: touch file
     copy: content="this is web!!" dest=/var/www/html/index.html

[[email protected] opt]# ansible-playbook httpd.yaml		# 執行劇本

PLAY [mysql] *******************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.10.13]

TASK [install httpd] ***********************************************************
changed: [192.168.10.13]

TASK [stop firewlld] ***********************************************************
ok: [192.168.10.13]

TASK [start httpd] *************************************************************
changed: [192.168.10.13]

TASK [touch file] **************************************************************
changed: [192.168.10.13]

PLAY RECAP *********************************************************************
192.168.10.13              : ok=5    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
           
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

3.4 示例事務復原操作

Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

驗證以下的結論,復原操作使得在錯誤事務之前的操作完成,但是錯誤操作及以後的事務都沒有執行,這樣,讓檢查和維護的工作量減輕了很多

3.5 忽略錯誤,強制傳回成功

對應上一個實驗,我們可以認為幹預當碰見錯誤時,不讓程式直接實作復原,而讓程式跳過錯誤,繼續執行下面的操作。

Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

3.6 多任務在同一劇本中

[[email protected] opt]# vim aa.yaml
- hosts: webserver
  remote_user: root
  tasks:
    - name: create group
      group: name=aaa gid=666
    - name: create user
      user: name=aaa uid=666 group=aaa

- hosts: webserver
  remote_user: root
  become: yes
  become: aaa
  tasks:
   - name: copy file
     copy: src=/etc/fstab dest=/home/aaa/fstab.bak

[[email protected] opt]# ansible-playbook aa.yaml	# 執行劇本

[[email protected] ~]# id aaa	# 到指定客戶機上面檢視執行情況
uid=666(aaa) gid=666(aaa) groups=666(aaa)
           

四、handlers介紹及劇本編寫

4.1 handlers介紹

  • handlers也是一些tasks的清單,和一般的task并沒有什麼差別
  • 是由通知者進行的notify,無果沒有notify,則handles不會執行,加入被notify了,則handles會執行
  • 不管有多少個通知者進行了notify,等到play嘚瑟所有task執行完成後,handlers也隻會被執行一次

4.2 編寫劇本

[[email protected] opt]# vim www.yaml
- hosts: mysql
  remote_user: root
  tasks:
    - name: install httpd
      yum: name=httpd
   - name: start httpd
      service: name=httpd state=started enabled=true
      notify:		# 通知名稱,可以同時多個
     - touch file
  handlers:		# 通知名稱必須一緻
  - name: touch file
   copy: content="this is web" dest=/var/www/html/index.html
[[email protected] opt]# ansible-playbook www.yaml --syntax-check

playbook: www.yaml
[[email protected] opt]# ansible-playbook www.yaml

PLAY [mysql] *******************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.10.13]

TASK [install httpd] ***********************************************************
changed: [192.168.10.13]

TASK [start httpd] *************************************************************
changed: [192.168.10.13]

RUNNING HANDLER [touch file] ***************************************************
changed: [192.168.10.13]

PLAY RECAP *********************************************************************
192.168.10.13              : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
           

五、變量設定

5.1 直接在劇本中指派變量

[[email protected] opt]# vim www.yaml

  • hosts: mysql

    remote_user: root

    vars:

    • aa: httpd

      tasks:

    • name: install httpd

      yum: name={{aa}}

    • name: start httpd

      service: name={{aa}} state=started enabled=true

      notify:

      • touch file

        handlers:

    • name: touch file

      copy: content=“this is web” dest=/var/www/html/index.html

Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

在mysql節點上檢視httpd的狀态資訊:

Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

5.2 通過ansible指令傳遞

[[email protected] opt]# vim www.yaml

  • hosts: mysql

    remote_user: root

    vars:

    • aa: ## 可根據需要在傳遞變量的時候床底多個變量

      tasks:

    • name: install httpd

      yum: name={{aa}}

    • name: start httpd

      service: name={{aa}} state=started enabled=true

      notify:

      • touch file

        handlers:

    • name: touch file

      copy: content=“this is web” dest=/var/www/html/index.html

通過ansible指令傳遞變量執行劇本:

Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

在mysql節點上檢視httpd的狀态資訊:

Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

5.3 傳遞系統固定變量

[[email protected] opt]# vim gdbl.yml

  • hosts: mysql

    remote_user: root

    tasks:

    • name: print

      copy: content="{{ansible_all_ipv4_addresses}}" dest=/opt/add.txt

Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

5.4 在hosts配置檔案中定義

[[email protected] opt]# grep -v "^#" /etc/ansible/hosts | grep -v "^$"
[webserver]
192.168.10.12
[mysql]
192.168.10.13   zhangsan="123456"		# 在hosts裡面指派
[[email protected] opt]# vim gdbl.yml
- hosts: mysql
  remote_user: root
  tasks:
    - name: print
    copy: content="{{zhangsan}}" dest=/opt/zhangsan.txt
[[email protected] opt]# ansible-playbook gdbl.yml --syntax-check		# 文法的檢測

playbook: gdbl.yml
[[email protected] opt]# ansible-playbook gdbl.yml		# 執行劇本

PLAY [mysql] *******************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.10.13]

TASK [print] *******************************************************************
changed: [192.168.10.13]

PLAY RECAP *********************************************************************
192.168.10.13              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
           
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

服務變量:

  • 劇本使用的 伺服器名稱,資料
  • 指令 ip位址,測試
  • 固定變量
  • 節點hosts 以系統的參數值

六、條件測試

  • 如果需要根據變量、facts (setup) 或此前任務的執行結果來作為某task執行與否的前提時要用到條件測試,在Playbook中條件測試使用when
  • 在task後添加when子句即可使用條件測試: when子句支援jinjia2表達式或文法

6.1 單條件測試

Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
[[email protected] opt]# vim xt.yml
- hosts: mysql
  remote_user: root
  tasks:
   - name: shutdown Cent
    command: /sbin/shutdown -h now
    when: ansible_distribution == "CentOS"
           
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

6.2 多條件判斷

[[email protected] opt]# vim xt.yml
- hosts: mysql
  remote_user: root
  tasks:
    - name: shutdown Cent
     command: /sbin/shutdown -h now
   when:
  	  - ansible_distribution == "CentOS"
  	  - ansible_distribution_major_version == "7"
           
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

6.3 組條件判斷

[[email protected] opt]# vim xt.yml

  • hosts: mysql

    remote_user: root

    tasks:

    • name: shutdown Cent

      command: /sbin/shutdown -h now

      when: (ansible_distribution == “CentOS” and ansible_distribution_major_version == “7”) or

      (ansible_distribution == “Debian” and ansible_distribution_major_version == “7”)

Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

七、疊代

  • 當有需要重複性執行的任務時,可以使用疊代機制,其使用格式為将需要疊代的内容定義為item變量引用,并通過with_items語句指明疊代的元素

7.1 應用

  • 疊代的安裝軟體
    [[email protected] opt]# vim install.yml
    
      - hosts: mysql
        remote_user: root
        tasks:
       - name: install httpd ftpd
         yum: name={{item}}
      	  with_items:
     	   - httpd
      	   - tomcat
               
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

安裝完成:

Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
  • 通過疊代來添加使用者群組
    [[email protected] opt]# vim useradd.yaml
     - hosts: mysql
       remote_user: root
       tasks:
         - name: create group
           group: name={{item.name}} gid={{item.gid}}
          with_items:
             - { name: 'zhaoming',gid: '333'}
             - { name: 'chenqian',gid: '444'}
         - name: create user
         user: name={{item.xingming}} uid={{item.uid}} group={{item.group}}
        with_items:
     	    - { xingming: 'zhaoming',uid: '333',group: 'zhaoming'}
            - { xingming: 'chenqian',uid: '444',group: 'chenqian'}
               
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

八、Templates模闆子產品

  • Jinja是基于Python的模闆引擎。template類是Jinja的另一個重要元件,可以看作一個編譯過的子產品檔案,用來生産目标文本,傳遞Python的變量給模闆去替換模闆中的标記。
  • jinja2是基于python的模闆引擎,功能比較類似于PHP的smarty,J2ee的Freemark和velocity。它能完全支援unicode,并具有內建的沙盒執行環境,應用廣泛。jinja2使用BSD授權

8.1 執行個體

以安裝apache為例,具體來說明Templates子產品的工作流程

  1. 首先要拷貝模闆配置檔案到ansible管理端來
    scp [email protected]:/etc/httpd/conf/httpd.conf /opt/
               
  2. 對拷貝過來的檔案進行修改,改成我們需要的格式類型,并修改此時配置檔案的格式
    # vim httpd.conf
     	Listen {{http_port}}
     	ServerName {{server_name}}
     	Maxclients {{access_num}}
     # mv httpd.conf httpd.conf.j2
               
  3. 進入ansible隻配置檔案,指派變量
    [[email protected] opt]# vi /etc/ansible/hosts
     [webserver]
     192.168.10.12 http_port=192.168.10.12:80 server_name=www.aa.com:80 access_num=600
               
  4. 劇本的編寫
    [[email protected] opt]# vim apache.yaml
     - hosts: webserver
       remote_user: root
       tasks:
         - name: install httpd
         yum: name=httpd
       - name: congfig file
           template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
        - name: start httpd
        service: name=httpd state=started
         - name: stop firewalld
          service: name=firewalld state=stopped
               
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

我們進入到webserver節點檢查已經安裝好的httpd服務,并檢視其配置檔案,是否根據我們的要求更改完成。

[[email protected] ~]# vi /etc/httpd/conf/httpd.conf
Listen 192.168.10.12:80
ServerName www.aa.com:80
Maxclients 600
           

九、tags标簽子產品

  • 在一個playbook中,我們一般會定義很多個task,如果我們隻想執行其中的某一個或者多個task時就可以使用tags标簽功能了

9.1 單标簽任務

[[email protected] opt]# vim biaoqian.yml

  • hosts: webserver

    remote_user: root

    tasks:

    • name: copy hosts

      copy: src=/etc/hosts dest=/opt/hosts1

      tags:

      • aaa
    • name: touch hosts2

      file: path=/opt/hosts2 state=touch

    • name: touch hosts3

      file: path=/opt/hosts3 state=directory

Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

9.2 多标簽任務

  • 當劇本中有多個任務,但存在兩個标簽任務,且标簽名一樣時,執行時,隻執行這兩給任務
    [[email protected] opt]# vim biaoqian.yml
      - hosts: webserver
        remote_user: root
        tasks:
         - name: copy hosts
           copy: src=/etc/hosts dest=/opt/hosts1
          tags:
      	    - aaa
       - name: touch hosts2
      	  file: path=/opt/hosts2 state=touch
         tags:
     		 - aaa
        - name: touch hosts3
      	  file: path=/opt/hosts3 state=directory
               
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

9.3 always标簽

  • 事實上不光可以為單個或多個task指定同一個tags,playbook還提供了一個特殊的tags為always,作用就是當使用always當tags的task時,無論執行哪個tags時,定義有always的任務必須強制執行
    [[email protected] opt]# vim biaoqian.yml
      - hosts: webserver
        remote_user: root
        tasks:
          - name: copy hosts
            copy: src=/etc/hosts dest=/opt/hosts1
          tags:
            - aaa
          - name: touch hosts2
           file: path=/opt/hosts2 state=touch
          tags:
      	    - aaa
       - name: touch hosts3
      	  file: path=/opt/hosts3 state=directory
            tags:
      	   - always             
               
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品
Ansible-Playbook一、YAML語言二、Ansible的腳本—playbook劇本三、編寫playbook劇本四、handlers介紹及劇本編寫五、變量設定六、條件測試七、疊代八、Templates模闆子產品九、tags标簽子產品十、role子產品

說明always标簽無論是否選中的情況下,都進行了執行。

十、role子產品

  • roles(角色)能夠根據層次型結構自動裝載變量檔案、task以及handlers等。 簡單來講,roles就是通過分别将變量、檔案、任務、子產品及處理器放置于單獨的目錄中,并可以便捷地include

10.1 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檔案, 用于定義此角色的特殊設定及其依賴關系

10.2 通過roles子產品來完成LAMP架構

# 建立所需的三部分的功能子產品
cd /etc/ansible/roles/
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p  
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p                               
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p
# 建立各子產品所需的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.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml
           

配置 main.yml 檔案内容

cd /etc/ansible/roles/

vim httpd/tasks/main.yml
- name: install httpd
 yum: pkg=httpd

vim mysql/tasks/main.yml
- name: install mysql
  yum: pkg=mariadb*

vim php/tasks/main.yml
- name: install php
  yum: pkg=php
           

配置執行劇本檔案

cd /etc/ansible/
vim site.yml 
- hosts: mysql
  remote_user: root
  roles:
   - httpd
   - mysql
   - php
           

執行劇本

[[email protected] ansible]# ansible-playbook site.yml --syntax-check

playbook: site.yml
[[email protected] ansible]# ansible-playbook site.yml

PLAY [mysql] *******************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.10.13]

TASK [install httpd] ***********************************************************
changed: [192.168.10.13]

TASK [install mysql] ***********************************************************
ok: [192.168.10.13]

TASK [install php] *************************************************************
changed: [192.168.10.13]

PLAY RECAP *********************************************************************
192.168.10.13              : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
           

到指定的主機進行驗證:

[[email protected] ~]# rpm -qa httpd

httpd-2.4.6-95.el7.centos.x86_64

[[email protected] ~]# rpm -qa php
php-5.4.16-48.el7.x86_64

[[email protected] ~]# cd /etc/my.cnf.d/
[[email protected] my.cnf.d]# ll
total 4
-rw-r--r--. 1 root root 232 Apr 30  2017 mysql-clients.cnf
           

繼續閱讀