角色(roles):把playbook根據功能,如handler,tasks等分門別類的放在在各自的子目錄下,造成一個集合,就是角色。
Roles目錄能夠是ansible.cfg中roles_path定義的路徑,也能夠和入口Playbook文件存放在同級目錄。建議使用roles_path,方便統一管理。這篇的示例使用和入口Playbook文件存放在同級目錄。html
Roles are ways of automatically loading certain vars_files, tasks, and handlers based on a known file structure. Grouping content by roles also allows easy sharing of roles with other users.git
官方文檔的鏈接:
https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.htmlgithub
github上官方的簡單示例:
https://github.com/ansible/ansible-examplesweb
最佳實踐的官方文檔:
https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html數據庫
Roles依賴目錄命名規則和目錄擺放。下面是官方的示例,定義了一個Roles的目錄結構:apache
site.yml webservers.yml fooservers.yml roles/ common/ tasks/ handlers/ files/ templates/ vars/ defaults/ meta/ webservers/ tasks/ defaults/ meta/
在每一個角色下,根據功能按需建立目錄,目錄名有規範。每一個目錄下都要有一個main.yml文件,ansible會調用這個文件。
目錄名稱的含義以下:服務器
官方有一個在tasks裏區分的多平臺支持的示例。
另外還有一個從書上看到的不一樣平臺定義不一樣角色名的示例。
最後是一個在官方最佳實踐中的示例。 app
tasks級別,對應tasks目錄。
定義好角色,角色下定義多個task文件。在main.yml中進行條件判斷,導入對應的task文件。
tasks/main.yml是必須有的,做爲tasks的入口文件,可是實際的代碼不用寫在這個文件裏,能夠在這個文件裏包含其餘yaml文件。官方有一個多平臺支持的示例:ide
# roles/example/tasks/main.yml - import_tasks: redhat.yml when: ansible_facts['os_family']|lower == 'redhat' - import_tasks: debian.yml when: ansible_facts['os_family']|lower == 'debian' # roles/example/tasks/redhat.yml - yum: name: "httpd" state: present # roles/example/tasks/debian.yml - apt: name: "apache2" state: present
角色級別,對應roles下的角色子目錄,好比common和webservers目錄。
直接定義好多個角色,有條件地將全部的角色導入。只有知足要求的角色會被導入執行。
在roles層面來支持多平臺。預先爲不一樣平臺定義好不用的角色。好比兩個角色名分別爲 httpd_db 和 httpd_rh。那麼Playbook文件能夠這麼寫:工具
# site.yml - name: install httpd hosts: webservers roles: - { role: httpd_db, when: ansible_os_family == 'Deian' } - { role: httpd_rh, when: ansible_os_family == 'RedHat' }
這裏的判斷平臺的方式和上面的應該是同樣的,都是經過Ansible自動獲取的主機信息來進行自動判斷。這裏的寫法比上面的官網的寫法low。我沒有實際測試,就保留原來的寫法了。
playbook級別,對應roles的同級目錄,好比site.yml文件。
先執行一個 group_by 模塊的task,對主機進行動態分組。以後再分別對組進行playbook的設置。
這部份內容和roles無關,用了roles能夠套用,沒用roles也能夠套用。是官方最佳實踐裏的作法。
group_by 模塊能夠根據關鍵字對主機進行分組。關鍵字能夠從主機信息中提取,提取到以後,能夠先拼接上一段自定義的前綴或後綴。最終得到的字符串會成爲一個主機組的組名,這樣Playbook中的hosts就能夠直接填寫這個組名:
--- - name: talk to all hosts just so we can learn about them hosts: all tasks: - name: Classify hosts depending on their OS distribution group_by: key: os_{{ ansible_facts['distribution'] }} # now just on the CentOS hosts... - hosts: os_CentOS gather_facts: False tasks: - # tasks that only happen on CentOS go here
經過 group_by 模塊動態爲主機添加了分組,還能夠事先建立好組變量文件,這些組變量也是會生效的。
官網有各類花式技巧:
https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html#using-roles
各類花式技巧:
經過角色依賴,能夠在使用角色時自動加入其它角色。角色依賴定義在 meta/main.yml 文件中的 dependencies 下,內容包含當前角色的依賴角色和依賴角色的參數列表。
配置文件示例:
--- dependencies: - role: common vars: some_parameter: 3 - role: apache vars: apache_port: 80 - role: postgres vars: dbname: blarg other_parameter: 12
角色的依賴關係,僅僅是meta文件中的一個key,也就是dependencies。別的key還有allow_duplicates,這個是定義角色能夠重複執行任務的。其餘key暫時在文檔中沒有出現。
在目錄結構中,列出了角色使用的基本目錄名稱。這裏的自定義模塊和插件也是放在roles目錄下的角色名子目錄中的。
新的目錄結構:
roles/ webservers/ tasks/ defaults/ meta/ library/ module1 module2 filter_plugins filter1 filter2
在webservers角色下添加了自定義模塊,目錄名稱使用library。
ansible的插件有不少種,這裏是在webserver角色下,爲filter插件添加了兩個自定義功能的文件。
這裏是 Ansible 官方最佳實踐中推薦的一個工做目錄的結構:
production # 生產環境的 inventory 文件 stage # 試運行環境的 inventory 文件 group_vars/ # 定義組變量 group1 group2 host_vars/ # 定義主機變量 hostname1 hostname2 library/ # 若是有自定義的模塊,放在這裏(可選) module_utils/ # 若是有自定義的模塊中要使用的工具,放在這裏(可選) filter_plugins/ # 若是有自定義的過濾插件,放在這裏(可選) site.yml # 主 playbook webservers.yml # Web 服務器的 playbook dbservers.yml # 數據庫服務器的 playbook roles/ # role 文件存放目錄 common/ # common 角色目錄 tasks/ # main.yml # task 入口 handlers/ # main.yml # handler 入口 templates/ # 存放模板文件 ntp.conf.j2 # files/ # 存放文件資源 bar.txt # foo.sh # vars/ # main.yml # 定義角色使用的變量 defaults/ # main.yml # 定義角色默認變量 meta/ # main.yml # 定義角色依賴 webservers/ # webservers 角色目錄,不展開了
這裏的自定義模塊和插件是放在項目目錄下的,不會自動生效。
library的默認值: ~/.ansible/plugins/modules:/usr/share/ansible/plugins/modules
filter_plugins的默認值: ~/.ansible/plugins/filter:/usr/share/ansible/plugins/filter
官方文檔的這篇裏能夠查到不少有關Ansible設置相關的信息,包括每一個變量在配置文件中的名稱,在環境變量中的名稱,以及變量的默認值。
https://docs.ansible.com/ansible/latest/reference_appendices/config.html
能夠去修改 ansible.cfg 配置文件,也能夠利用默認的家目錄中的位置,建立軟鏈接。