角色(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 配置文件,也能够利用默认的家目录中的位置,建立软链接。