Ansible 小手冊系列 十(包含和角色)

包含


使用include模塊來包含foo文件

tasks:
  - include: foo.yml

--- foo.yml
- name: test foo
  command: echo foo

include 還允許傳遞變量

- include: wordpress.yml wp_user=timmy
- include: wordpress.yml
  vars:
      wp_user: timmy
      ssh_keys:
        - keys/one.txt
        - keys/two.txt

動態包含


循環引用3次

- include: foo.yml param={{item}}
  with_items:
  - 1
  - 2
  - 3

還可以使用動態變量引入task文件

- include: "{{inventory_hostname}}.yml"

動態包含的一些限制

? 您不能使用notify來觸發來自動態包含的處理程序名稱。
? 您不能使用--start-at-task在動態包含內的任務開始執行。
? 僅存在于動態包含內的標記不會顯示在-list-tags輸出中。
? 只存在于動態包含內的任務將不會顯示在-list-tasks輸出中。

為了解決上面限制,2.1版本后引入了static

- include: foo.yml
  static: <yes|no|true|false>

默認情況下,在Ansible 2.1及更高版本中,include包含符合以下條件時會自動被視為靜態而不是動態:

  • include不使用任何循環
  • 包含的文件名不使用任何變量
  • 靜態選項沒有顯式禁用(即static:no)
  • 強制靜態包含(見下文)的ansible.cfg選項被禁用

ansible.cfg配置中有兩個選項可用于靜態包括:

  • task_includes_static - 將所有在tasks部分中包含的內容都設置為靜態。
  • handler_includes_static - 強制所有包括在處理程序部分是靜態的。

這些選項允許用戶強制playbook的行為與他們在1.9.x和之前一樣。

變量包含


include_vars 在task中動態加載yaml或json文件類型中的變量

- include_vars: myvars.yml

根據操作系統類型加載變量文件,如果找不到,則為默認值。

- include_vars: "{{ item }}"
  with_first_found:
   - "{{ ansible_distribution }}.yml"
   - "{{ ansible_os_family }}.yml"
   - "default.yml"

角色 ROLE


角色是基于已知文件結構自動加載某些vars_files,任務和處理程序的方法。 按角色分組內容還允許輕松與其他用戶共享角色。

文件結構如下

Paste_Image.png

結構說明

  • site.yml 主要的playbook
  • webservers.yml webservers 得playbook
  • hosts.ini 主機清單
  • ibrary 如果有任何自定義模塊,將其放在這里(可選)
  • filter_plugins 如果有任何自定義過濾器插件,將其放在這里(可選)
  • 如果group_var/all存在,其中列出的變量將被添加到所有的主機組中
  • 如果group_var/groupname1存在,其中列出的變量將被添加到groupname1主機組中-
  • 如果host_vars/hostname1存在,其中列出的變量將被添加到hostname1主機組中

這個 playbook 為一個角色 ‘x’ 指定了如下的行為

  • 如果 roles/x/tasks/main.yml 存在, 其中列出的 tasks 將被添加到 play 中
  • 如果 roles/x/handlers/main.yml 存在, 其中列出的 handlers 將被添加到 play 中
  • 如果 roles/x/vars/main.yml 存在, 其中列出的 variables 將被添加到 play 中
  • 如果 roles/ x/defaults /main.yml存在,其中列出的變量將被添加到play 中
  • 如果 roles/x/meta/main.yml 存在, 其中列出的 “角色依賴” 將被添加到 roles 列表中
  • 所有 copy tasks 可以引用 roles/x/files/ 中的文件,不需要指明文件的路徑。
  • 所有 script tasks 可以引用 roles/x/files/ 中的腳本,不需要指明文件的路徑。
  • 所有 template tasks 可以引用 roles/x/templates/ 中的文件,不需要指明文件的路徑。
  • 所有 include tasks 可以引用 roles/x/tasks/ 中的文件,不需要指明文件的路徑。

如果 roles 目錄下有文件不存在,這些文件將被忽略。

這些目錄的加載順序

  1. meta/main.yml
  2. tasks/main.yml
  3. handlers/main.yml
  4. vars/main.yml
  5. defaults/main.yml

如果區分環境使用角色,可以使用下列文檔結構

Paste_Image.png
  • production/inventory 主機清單

** 運行playbook**

ansible-playbook -i production site.yml

角色定義


在playbook中定義角色

---
- hosts: webservers
  roles:
     - x

定義角色參數

---
- hosts: webservers
  roles:
    - { role: x, dir: '/opt/a',  app_port: 5000 }

使用條件判斷,當主機是Redhat時,才執行角色任務

---
- hosts: webservers
  roles:
    - { role: some_role, when: "ansible_os_family == 'RedHat'" }

定義角色標簽

---
- hosts: webservers
  roles:
    - { role: x, tags: ["bar", "baz"] }

定義執行角色任務前后執行的動作

---
- hosts: webservers

  pre_tasks:
    - shell: echo 'hello'

  roles:
    - { role: some_role }

  tasks:
    - shell: echo 'still busy'

  post_tasks:
    - shell: echo 'goodbye'

pre_tasks里的task在roles執行前執行的任務
post_tasks里的task在roles執行完成后執行的任務

角色默認變量

定義角色默認變量,只需在角色目錄中添加一個defaults/main.yml文件。角色默認變量優先級最低。

角色依賴


角色依賴性允許您在使用角色時自動提取其他角色。 角色依賴關系存儲在角色目錄中包含的meta/main.yml文件中。 此文件應包含要在指定角色之前插入的角色和參數的列表,例如角色/myapp/meta/main.yml中的以下內容:

---
dependencies:
  - { role: common, some_parameter: 3 }
  - { role: apache, apache_port: 80 }
  - { role: postgres, dbname: blarg, other_parameter: 12 }
  - { role: '/path/to/common/roles/foo', x: 1 }

** 角色依賴執行順序**

角色依賴性始終在包含角色的角色之前執行,并且是遞歸的。
如上面內容,按照common,apache,postgres,'/path/to/common/roles/foo順序依次執行,再執行此角色

** 角色依賴嵌套**

默認情況下,在添加依賴其他角色的時候,如果其他角色內也有依賴關系,是不執行其他角色內的依賴關系的。

可以通過allow_duplicates: yes設置來實現執行其他角色內的依賴關系。

實際測試,2.12.2版本的ansible,無論加不加這個設置,就只會執行第一次依賴角色,后續的則不執行。

Paste_Image.png

例子


ansible examples :https://github.com/ansible/ansible-examples


更多文章請看 Ansible 專題文章總覽

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容