1. 程式人生 > >自動化運維工具 Ansible ——playbook 劇本詳解及簡易案例

自動化運維工具 Ansible ——playbook 劇本詳解及簡易案例

Playbook-劇本介紹

 
Playbook是 一個不同於使用Ansible命令列執行方式的模式,其功能更強大靈活。簡單來說,playbook是一個非常簡單的配置管理和多主機部署系統,不同於任何已經存在的模式,可作為一個適合部署複雜應用程式的基礎。Playbook可以定製配置,可以按照指定的操作步驟有序執行,支援同步和非同步方式。值得注意的是playbook是通過YAML格式來進行描述定義的。
 

  • 核心元素

Tasks:任務,由模板定義的操作列表
Variables:變數
Templates:模板,即使用模板語法的檔案
Handlers:處理器 ,當某條件滿足時,觸發執行的操作
Roles:角色
 

  • hosts和users介紹
  • 在playbook中的每一個play都可以選擇在哪些伺服器和以什麼使用者完成,hosts一行可以是一個主機組、主機、多個主機,中間以冒號分隔,可使用通配模式。其中remote_user表示執行的使用者賬號。
 ---
 - hosts: abc               #指定主機組,可以是一個或多個組。
       remote_user: root                #指定遠端主機執行的使用者名稱
  • 指定遠端主機sudo提升許可權
 # vim ping.yml
 ---
 - hosts: abc
      remote_user: root            
      become: yes                #2.6版本以後的引數,之前是sudo,意思為切換使用者執行
      become_user: mysql          #指定sudo使用者為mysql
 
 執行playbook
 # ansible-playbook ping.yml -K

 

  • Tasks list 和 Action 介紹

1:Play的主體部分是task列表,task列表中的各任務按次序逐個在hosts中指定的主機上執行,即在所有主機上完成第一個任務後再開始第二個任務。
 
在執行playbook時(從上到下執行),如果一個host執行task失敗,整個tasks都會回滾,請修正playbook 中的錯誤,然後重新執行即可。
 
Task的目的是使用指定的引數執行模組,而在模組引數中可以使用變數,模組執行時冪等的,這意味著多次執行是安全的,因為其結果一致。
 
2:每一個task必須有一個名稱name,這樣在執行playbook時,從其輸出的任務執行資訊中可以很好的辨別出是屬於哪一個task的。如果沒有定義name,‘action’的值將會用作輸出資訊中標記特定的task。
 
3:定義一個task,常見的格式:”module: options” 例如:yum: name=httpd
 
4:ansible的自帶模組中,command模組和shell模組無需使用key=value格式

 

  • 常用命令
  • ansible-playbook [yaml檔名、也可以yml結尾]
  • 例如:ansible-playbook test.yml
  • 引數:

-k(–ask-pass) 用來互動輸入ssh密碼
-K(-ask-become-pass) 用來互動輸入sudo密碼
-u 指定使用者

# ansible-playbook test.yml --syntax-check    #檢查yaml檔案的語法是否正確
# ansible-playbook test.yml --list-task       #檢查tasks任務
# ansible-playbook test.yml --list-hosts      #檢查生效的主機
# ansible-playbook test.yml --start-at-task='Copy Nginx.conf'     #指定從某個task開始執行
  • 示例
# vim a.yml
---
- hosts: 192.168.6.130                  //指定主機
  remote_user: root                         //指定在被管理的主機上執行任務的使用者
  tasks:                                            //任務列表↓
  - name: disable selinux                //任務名關閉防火牆
    command: '/sbin/setenforce 0'    //呼叫command模組 執行關閉防火牆命令
  - name: start httpd                         //任務名 開啟httpd
    service: name=httpd state=started         //呼叫service模組 開啟httpd 服務
# ansible-playbook a.yml --syntax-check    #檢查yaml檔案的語法是否正確
# ansible-playbook a.yml

自動化運維工具 Ansible ——playbook 劇本詳解及簡易案例
自動化運維工具 Ansible ——playbook 劇本詳解及簡易案例

 

  • playbook中只要執行命令的返回值不為0,就會報錯。tasks停止,我們可以通過下面的新增項忽略錯誤
  • ignore_errors: True #忽略錯誤,強制返回成功
    自動化運維工具 Ansible ——playbook 劇本詳解及簡易案例
    自動化運維工具 Ansible ——playbook 劇本詳解及簡易案例

 

  • Handlers 介紹
  • Handlers也是一些task的列表,和一般的task並沒有什麼區別。
  • 是由通知者進行的notify,如果沒有被notify,則Handlers不會執行,假如被notify了,則Handlers被執行
  • 不管有多少個通知者進行了notify,等到play中的所有task執行完成之後,handlers也只會被執行一次

 

  • 示例
    自動化運維工具 Ansible ——playbook 劇本詳解及簡易案例

 

  • 引用變數
  • 使用:vars,新增變數
  • 在tasks中使用變數時,要用"{{}}"引用
    自動化運維工具 Ansible ——playbook 劇本詳解及簡易案例

 

  • 直接引用 Ansible 變數
  • ansible_all_ipv4_addresses 獲取IP
    自動化運維工具 Ansible ——playbook 劇本詳解及簡易案例

 

  • 引用主機變數
  • 在組的主機後面新增變數
    # vim /etc/ansible/hosts  //在組中的主機後面新增變數
    [www]
    192.168.6.130 testvar="192.173.34.18"
     
    #vim c.yml  //編寫yml劇本
    ---
    - hosts: www
    remote_user: root
    tasks:
    - name: copy file
      copy: content="{{ansible_all_ipv4_addresses}},{{testvar}}" dest=/opt/vars.txt
    # ansible-playbook c.yml    //執行劇本
  • 檢視這個生成的檔案
    自動化運維工具 Ansible ——playbook 劇本詳解及簡易案例

 

條件判斷

 

  • when的值是一個條件表示式,如果條件判斷成立,這個task就執行,如果判斷不成立,則task不執行
  • 如果需要根據變數、facts(setup)或此前任務的執行結果來作為某task執行與否的前提時要用到條件測試,在Playbook中條件測試使用when子句。
  • 在task後新增when子句即可使用條件測試:when子句支援jinjia2表示式或語法,例如:
    自動化運維工具 Ansible ——playbook 劇本詳解及簡易案例

 

  • 多條件判斷
    自動化運維工具 Ansible ——playbook 劇本詳解及簡易案例

 

  • 組條件判斷
    自動化運維工具 Ansible ——playbook 劇本詳解及簡易案例

 

  • 自定義條件判斷
    自動化運維工具 Ansible ——playbook 劇本詳解及簡易案例

 

  • 迭代
  • 有需要重複性執行的任務時,可以使用迭代機制。其使用格式為將需要迭代的內容定義為item變數引用,並通過with_items語句指明迭代的元素列表即可。
  • 示例:
    自動化運維工具 Ansible ——playbook 劇本詳解及簡易案例
    自動化運維工具 Ansible ——playbook 劇本詳解及簡易案例

 

  • Templates 介紹
  • Jinja是基於Python的模板引擎。template類是Jinja的另一個重要元件,可以看作一個編譯過的模組檔案,用來生產目標文字,傳遞Python的變數給模板去替換模板中的標記。
    # scp [email protected]:/etc/httpd/conf/httpd.conf ./templates      //複製被管理端的配置檔案到本地
    # vim templates      //在管理端講配置檔案要修改的地方定義變數
    Listen {{http_port}}
    ServerName {{server_name}}
    MaxClients {{access_num}}
  • 在/etc/ansible/hosts 新增變數
    # vim /etc/ansible/hosts
    [www]
    192.168.6.129 http_port=192.168.6.129:80 access_num=100 server_name="www..com:80"
    # vim apache.yml
    # ansible-playbook apache.yml    #然後執行指令碼  然後去abc組的主機上檢視下配置檔案是否已經改了

 

  • Tags 介紹
  • 在一個playbook中,我們一般會定義很多個task,如果我們只想執行其中的某一個task或多個task時就可以使用tags標籤功能了
    自動化運維工具 Ansible ——playbook 劇本詳解及簡易案例
    # ansible-playbook hosts.yml --tags="only"   //只執行這個標籤上面的任務
  • 事實上,不光可以為單個或多個task指定同一個tags。playbook還提供了一個特殊的tags為always。作用就是當使用always當tags的task時,無論執行哪一個tags時,定義有always的tags都會執行。
    自動化運維工具 Ansible ——playbook 劇本詳解及簡易案例
    # ansible-playbook test.yml --tags="only"    //兩個tags都會被執行