ansible的playbook組件


playbook的核心元素:

        tasks: 任務

        variables: 變量

        templates: 模板

        handlers: 處理器

        roles: 角色

組織格式:YAML(被稱為另外一種標記語言)

  語法:(列表用橫桿表示,鍵值對用冒號分割,鍵值對里又可以嵌套另外的鍵值對)

例如:    name:tom

       age:21

       gender:Male

       spourse:

         name:lily

         gender:female

       children:

         —    name:susan

            age: 2

            gender:female

         —    name:sunny

            age: 10

            gender:male

列表:用—引導

字典:包含多個k:v鍵值對  例如   {name:tom age:21 gender:male}   上面的表示就是一個字典,字典也可以嵌套,如上面的

spourse下又嵌套了一個字典,而children下包含了兩個列表,每個列表下又嵌套了一個字典  

 

創建一個playbook文件:vim /root/first.yml  (這類文件必須以.yml或.yaml結尾)

一般的格式為:

   - hosts:

     vars: 

     remote_user:   

     tasks:

     handlers:

hosts 定義單個主機或組,vars定義變量,remote_user定義執行命令的遠程用戶,tasks定義執行哪些命令,handlers定義調用哪些

處理器

 

下圖是一個簡單示例:

如何運行我定義的劇本呢?  使用ansible-playbook命令  例如:ansible-playbook /root/first.yml

變量:

  變量命名:字母數字下划線組成,只能以字母開頭

  變量種類:  facts(內置變量)   

       自定義變量:(1)通過命令行傳遞,(2)通過roles傳遞,(3)主機變量,(4)組變量

  facts:由遠程主機發回的主機屬性信息,這些信息被保存在ansible變量當中

  例如:ansible 192.168.238.170 -m setup  來獲取遠程主機上的屬性信息,這些屬性信息保存在facts中

 

  通過命令行傳遞:ansible-playbook test.yml --extra-vars “host=www user=tom“(如果劇本中已有此處定義的變量則會被

覆蓋)

 

    主機變量:在/etc/ansible/hosts中定義,如下圖

  

  name=tom就是給主機192.168.238.168單獨定義的變量(主機變量)

 

  組變量:[group_name:vars]

      var1=value

      var2=value

 

inventory參數:ansible基於ssh連接inventory(/etc/ansible/hosts)中指定的遠程主機時,將以此處指定的屬性進行連接

  ansible_ssh_port 連接遠程主機使用的端口

  ansible_ssh_user 連接遠程主機使用的用戶

  ansible_ssh_pass 連接遠程主機使用的密碼(建議使用基於密鑰認證,而不是用此選項)

使用示例:vim /etc/ansible/hosts

 

 

第二個劇本:vim /root/second.yml

在playbook中調用變量的方式為{{ variable }}

 

條件測試:在某task后面添加when子句即可實現條件測試功能,例如:

ansible_os_family 是facts中內置的屬性信息   ansible_os_family的信息可以使用ansible all -m setup | grep

ansible_os_family 查看

 

迭代:

  在task中調用內置的item變量;在某task后面使用with_items語句來定義元素列表

 

例如:

- name: add four users

  user: name={{ item }}  state=present

  with_items:

  - testuser1

  - testuser2

  - testuser3

  - testuser4

 

迭代中,列表中的每個元素可以為字典格式

例如:

- name: add two users

  user: name={{ item.name }}  state=present  groups={{ item.groups }}

  with_items:  

  - { name: 'testuser5', groups: 'wheel' }

 

  - { name: 'testuser6', groups: 'root' }

 

handlers:也是task,但只有其關注的條件滿足時,才會被觸發執行 例如:

vim /root/fourth.yml

 

上面的意思是copy中復制過去的文件跟遠程主機上的文件不同,就通過notify調用handlers,即重啟httpd服務

handler 重啟服務是最通用的用法

 

templates:用於生成文本文件(配置文件);模板文件中可使用jinja2表達式,表達式要定義在{{ }},也可以簡單地僅執行變量替

換;

使用示例: vim /etc/ansible/hosts

 

添加了http_port的變量

 

接下來:vim /root/httpd.conf 

 

Listen的端口使用 {{ http_port }},這樣是為了調用此變量

 

接下來: vim /root/fourth.yml

 

修改copy為template    

ansible-playbook /root/fourth.yml,這時192.168.238.168就會監聽為8080端口,  而不是默認的80端口了

 

 

roles:roles用於實現“代碼復用”,roles以特定的層次型格式組織起來的playbook元素(variables, tasks, templates,

handlers);可被playbook以role的名字直接進行調用

roles的文件結構:

    files/:此角色中用到的所有文件均放置於此目錄中;

    templates/:Jinja2模板文件存放位置

    tasks/:任務列表文件;可以有多個,但至少有一個叫做main.yml的文件

    handlers/:處理器列表文件;可以有多個,但至少有一個叫做main.yml的文件

      vars/:變量字典文件;可以有多個,但至少有一個叫做main.yml的文件

    meta/:此角色的特殊設定及依賴關系

 

例如:mkdir /etc/ansible/roles   cd /etc/ansible/roles    mkdir  web1/{files,templates,tasks,handlers,vars,meta}

 

(1)vim web1/vars/main.yml   

  

 

 (2) vim web1/tasks/main.yml

 

這里的template指的是相對路徑-->web1/templates

 

(3) vim web1/handlers/main.yml

 

 

cp /root/httpd.conf   /etc/ansible/roles/web1/templates/

 

vim /etc/ansible/roles/web1/templates/httpd.conf

 

將User和Group都替換為上面定義的變量

 

在roles之外定義一個調用roles的文件,vim /etc/ansible/web1.yml  這個文件的文件名必須以.yml結尾

hosts:web1 指在/etc/ansible/hosts中定義的組,上面有定義

最后的 -  web1  指的是/etc/ansible/roles/web1 目錄

這時只需更改上面的hosts指定的值就可對不同的主機實現代碼重用了

 

還可以通過role傳遞變量,例如

 

 

還可以調用多個role,例如

 

每次運行palybook都會把里面的內容都運行一遍,而有時只想運行一些內容,這時可以使用tags

vim /etc/ansible/roles/web1/tasks/main.yml

 

使用命令ansible-playbook -t conf web1.yml  就只執行定義了conf的tags的那個標簽的任務,此處就是install config file

tags可以定義在多處

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM