roles介绍
角色(roles)是ansible自1.2版本开始引入的新特性,用于层次性,结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单的说,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中、并可以便捷地include他们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。
创建角色框架
可以使用标准Linux命令创建新角色所需的所有子目录和文件。此外,也可以通过命令行实用程序来自动执行新角色创建过程。
ansible-galaxy命令行工具可用于管理Ansible角色,包括新角色的创建。用户可以运行ansible-galaxy init来创建新角色的目录结构。指定角色的名称作为命令的参数,该命令在当前工作目录中为新角色创建子目录
[root@ansible roles]# ansible-galaxy init test - Role test was created successfully [root@ansible roles]# tree . └── test ├── defaults │ └── main.yml ├── files ├── handlers │ └── main.yml ├── meta │ └── main.yml ├── README.md ├── tasks │ └── main.yml ├── templates ├── tests │ ├── inventory │ └── test.yml └── vars └── main.yml
Ansible角色子目录
子目录 | 功能 |
---|---|
defaults | 此目录中的main.yml文件包含角色变量的默认值,使用角色时可以覆盖这些默认值。 这些变量的优先级较低,应该在play中更改和自定义。 |
files | 此目录包含由角色任务引用的静态文件。 |
handlers | 此目录中的main.yml文件包含角色的处理程序定义。 |
meta | 此目录中的main.yml文件包含与角色相关的信息,如作者、许可证、平台和可选的角色依赖项。 |
tasks | 此目录中的main.yml文件包含角色的任务定义。 |
templates | 此目录包含由角色任务引用的Jinja2模板。 |
tests | 此目录可以包含清单和名为test.yml的playbook,可用于测试角色。 |
vars | 此目录中的main.yml文件定义角色的变量值。这些变量通常用于角色内部用途。 这些变量的优先级较高,在playbook中使用时不应更改。 |
当然,上述目录并不全是必须的,也就是说,如果你的角色并没有相关的模板文件,那么角色目录中并不用包含templates目录,同理,其他目录也一样,一般情况下,都至少会有一个tasks目录
在playbook中使用角色
--- - hosts: xxxxxxx roles: - role1 - role2
创建一个简单的角色test1,在test1目录中创建tasks子目录,在子目录tasks创建main.yml的文件
[root@ansible roles]# mkdir -p test1/tasks 通过debug模块可以输出信息 [root@ansible roles]# cat test1/tasks/main.yml - debug: msg: "test1 roles!"
调用角色的剧本文件名为test.yml,它与test1目录处于同级目录中
[root@ansible roles]# ls ansible.cfg inventory test1 test.yml [root@ansible roles]# vim test.yml --- - hosts: test123 roles: - test1 [root@ansible roles]# ansible-playbook test.yml PLAY [test123] ************************************************************************************************* TASK [Gathering Facts] *************************************************************************************** ok: [test123] TASK [test1 : debug] ***************************************************************************************** ok: [test123] => { "msg": "test1 roles!" } PLAY RECAP *************************************************************************************************** test123 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
通过变量更改角色行为
编写良好的角色利用默认变量来改变角色行为,使之与相关的配置场景相符。这有助于让角色变得更为通用,可在各种不同的上下文中重复利用。
如果通过以下方式定义了相同的变量,则角色的defaults目录中定义的变量的值将被覆盖:
- 在清单文件中定义,作为主机变量或组变量
- 在playbook项目的group_vars或host_vars目录下的YAML文件中定义
- 作为变量嵌套在play的vars关键字中定义
- 在play的roles关键字中包含该角色时作为变量定义
创建test角色模板文件,引用Ansible事实和test_variable
#创建test模板 [root@ansible roles]# vim test/templates/test.j2 This is the system {{ ansible_facts['hostname'] }}. Today's date is: {{ ansible_facts['date_time']['date'] }}. test {{ test_variable }} #定义变量 [root@ansible roles]# vim test/defaults/main.yml --- # defaults file for test test_variable: 1234567 #tasks [root@ansible roles]# vim test/tasks/main.yml --- # tasks file for test - template: src: test.j2 dest: /tmp/test #调用角色执行剧本 [root@ansible roles]# cat test.yml --- - hosts: test123 roles: - test [root@ansible roles]# ansible-playbook test.yml PLAY [test123] ************************************************************************************************* TASK [Gathering Facts] *************************************************************************************** ok: [test123] TASK [test : template] *************************************************************************************** changed: [test123] PLAY RECAP *************************************************************************************************** test123 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 #查看test文件 [root@ansible roles]# ansible test123 -a "cat /tmp/test" test123 | CHANGED | rc=0 >> This is the system test123. Today's date is: 2021-02-23. test 1234567
在清单文件中定义变量
在清单文件中定义 [root@ansible roles]# vim inventory test123 test_variable=inventory [root@ansible roles]# ansible-playbook test.yml PLAY [test123] ************************************************************************************************* TASK [Gathering Facts] *************************************************************************************** ok: [test123] TASK [test : template] *************************************************************************************** changed: [test123] PLAY RECAP *************************************************************************************************** test123 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 角色的defaults目录中定义的变量的值将被覆盖 [root@ansible roles]# ansible test123 -a "cat /tmp/test" httpd | CHANGED | rc=0 >> This is the system test123. Today's date is: 2021-02-23. test inventory
在group_vars或host_vars目录yaml文件中定义
[root@ansible roles]# vim inventory test123 #创建host_vars目录 [root@ansible roles]# mkdir host_vars #创建yaml文件定义变量 [root@ansible roles]# cat host_vars/test123.yml test_variable: host_vars #执行剧本 [root@ansible roles]# ansible-playbook test.yml PLAY [test123] ************************************************************************************************* TASK [Gathering Facts] *************************************************************************************** ok: [test123] TASK [test : template] *************************************************************************************** changed: [test123] PLAY RECAP *************************************************************************************************** test123 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 #角色的defaults目录中定义的变量的值将被覆盖 [root@ansible roles]# ansible test123 -a "cat /tmp/test" test123 | CHANGED | rc=0 >> This is the system test123. Today's date is: 2021-02-23. test host_vars
作为变量嵌套在play的vars关键字中定义
[root@ansible roles]# cat test.yml --- - hosts: test123 vars: test_variable: play roles: - test [root@ansible roles]# ansible-playbook test.yml PLAY [test123] ************************************************************************************************* TASK [Gathering Facts] *************************************************************************************** ok: [test123] TASK [test : template] *************************************************************************************** changed: [test123] PLAY RECAP *************************************************************************************************** test123 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 #defaults中定义的被覆盖 [root@ansible roles]# ansible test123 -a "cat /tmp/test" test123 | CHANGED | rc=0 >> This is the system test123. Today's date is: 2021-02-23. test play
在play的roles关键字中包含该角色时作为变量定义
[root@ansible roles]# vim test.yml --- - hosts: test123 roles: - role: test vars: test_variable: role [root@ansible roles]# ansible-playbook test.yml PLAY [test123] ************************************************************************************************* TASK [Gathering Facts] *************************************************************************************** ok: [test123] TASK [test : template] *************************************************************************************** changed: [test123] PLAY RECAP *************************************************************************************************** test123 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 #被覆盖 [root@ansible roles]# ansible test123 -a "cat /tmp/test" test123 | CHANGED | rc=0 >> This is the system test123. Today's date is: 2021-02-23. test role
在play中使用角色变量时,变量的优先顺序可能会让人困惑。
- 几乎任何其他变量都会覆盖角色的默认变量,如清单变量、playvars变量,以及内嵌的角色参数等。
- 较少的变量可以覆盖角色的vars目录中定义的变量。事实、通过include_vars加载的变量、注册的变量和角色参数是其中一些具备这种能力的变量。清单变量和playvars无此能力。这非常重要,因为它有助于避免用户的play意外改变角色的内部功能。
- 不过,正如上述示例中最后一个所示,作为角色参数内嵌声明的变量具有非常高的优先级。它们可以覆盖角色的vars目录中定义的变量。如果某一角色参数的名称与playvars或角色vars中设置的变量或者清单变量或playbook变量的名称相同,该角色参数将覆盖另一个变量。
红帽企业Linux系统角色
自RHEL7.4开始,操作系统随附了多个Ansible角色,作为rhel-system-roles软件包的一部分。在RHEL8中,该软件包可以从AppStream中获取。以下是每个角色的简要描述:
RHEL系统角色
名称 | 状态 | 角色描述 |
---|---|---|
rhel-system-roles.kdump | 全面支持 | 配置kdump崩溃恢复服务 |
rhel-system-roles.network | 全面支持 | 配置网络接口 |
rhel-system-roles.selinux | 全面支持 | 配置和管理SELinux自定义, 包括SELinux模式、文件和端口上下文、 布尔值设置以及SELinux用户 |
rhel-system-roles.timesync | 全面支持 | 使用网络时间协议或精确时间协议配置时间同步 |
rhel-system-roles.postfix | 技术预览 | 使用Postfix服务将每个主机配置为邮件传输代理 |
rhel-system-roles.firewall | 开发中 | 配置主机的防火墙 |
rhel-system-roles.tuned | 开发中 | 配置tuned服务,以调优系统性能 |
系统角色的目的是在多个版本之间标准化红帽企业Linux子系统的配置。使用系统角色来配置版本6.10及以上的任何红帽企业Linux主机。
安装RHEL系统角色
RHEL系统角色由rhel-system-roles软件包提供,该软件包可从AppStream流获取。在Ansible控制节点上安装该软件包。
#安装RHEL系统角色 [root@ansible ~]# yum -y install rhel-system-roles
安装后,RHEL系统角色位于/usr/share/ansible/roles目录中:
[root@ansible ~]# ls /usr/share/ansible/roles/ linux-system-roles.certificate linux-system-roles.nbde_server linux-system-roles.tlog rhel-system-roles.nbde_client rhel-system-roles.timesync linux-system-roles.kdump linux-system-roles.network rhel-system-roles.certificate rhel-system-roles.nbde_server rhel-system-roles.tlog linux-system-roles.kernel_settings linux-system-roles.postfix rhel-system-roles.kdump rhel-system-roles.network linux-system-roles.logging linux-system-roles.selinux rhel-system-roles.kernel_settings rhel-system-roles.postfix linux-system-roles.metrics linux-system-roles.storage rhel-system-roles.logging rhel-system-roles.selinux linux-system-roles.nbde_client linux-system-roles.timesync rhel-system-roles.metrics rhel-system-roles.storage
安装后,RHEL系统角色的文档位于/usr/share/doc/rhel-system-roles-/目录中。文档按照子系统整理到子目录中:
[root@ansible roles]# ls /usr/share/doc/rhel-system-roles/ certificate kernel_settings metrics nbde_server postfix storage tlog kdump logging nbde_client network selinux timesync
每个角色的文档目录均包含一个README.md文件。README.md文件含有角色的说明,以及角色用法信息。
README.md文件也会说明影响角色行为的角色变量。通常,README.md文件中含有一个playbook代码片段,用于演示常见配置场景的变量设置。
时间同步角色示例
假设需要在服务器上配置NTP时间同步。我们可以自行编写自动化来执行每一个必要的任务。但是,RHEL系统角色中有一个可以执行此操作角色,那就是rhel-system-roles.timesync。
该角色的详细记录位于/usr/share/doc/rhel-system-roles/timesync目录下的README.md中。此文件说明了影响角色行为的所有变量,还包含演示了不同时间同步配置的三个playbook代码片段。
为了手动配置NTP服务器,该角色具有一个名为timesync_ntp_servers的变量。此变量取一个要使用的NTP服务器的列表作为值。列表中的每一项均由一个或多个属性构成。两个关键属性如下:
timesync_ntp_servers属性
属性 | 用途 |
---|---|
hostname | 要与其同步的NTP服务器的主机名。 |
iburst | 一个布尔值,用于启用或禁用快速初始同步。在角色中默认为no,但通常应该将属性设为yes. |
修改test123主机时间
[root@ansible roles]# ansible test123 -m command -a "date -s '1999-1-1 00:11:11'" test123 | CHANGED | rc=0 >> Fri Jan 1 00:11:11 CST 1999 [root@ansible roles]# date && ssh test123 'date' Wed Feb 24 17:47:44 CST 2021 Fri Jan 1 00:14:35 CST 1999
编写时间同步playbook
[root@ansible roles]# cp /usr/share/ansible/roles/rhel-system-roles.timesync/ ~/roles/timesync [root@ansible roles]# ls ansible.cfg inventory test test1 test.yml timesync #编写剧本导入角色 [root@ansible roles]# cat test.yml --- - hosts: test123 vars: timesync_ntp_servers: - hostname: time1.aliyun.com iburst: yes roles: - timesync #执行剧本 [root@ansible roles]# ansible-playbook test.yml #查看时间是否同步 [root@ansible roles]# date && ssh test123 'date' Wed Feb 24 18:43:22 CST 2021 Wed Feb 24 18:43:21 CST 2021
使用ansible galaxy部署角色
Ansible Galaxy [https://galaxy.ansible.com]是一个Ansible内容公共资源库,这些内容由许许多多Ansible管理员和用户编写。它包含数千个Ansible角色,具有可搜索的数据库,可帮助Ansible用户确定或许有助于他们完成管理任务的角色。
获取Ansible Galaxy帮助
通过Ansible Galaxy网站主页上的Documenttaion标签,可以进入描述如何使用Ansible Galaxy的页面。其中包含了介绍如何从Ansible Galaxy下载和使用角色的内容。该页面也提供关于如何开发角色并上传到Ansible Galaxy的说明。
浏览Ansible Galaxy中的角色
通过Ansible Galaxy网站主页上左侧的Search标签,用户可以访问关于Ansible Galaxy上发布的角色的信息。用户可以使用标记通过角色的名称或通过其他角色属性来搜索Ansible角色。结果按照Best Match分数降序排列,此分数依据角色质量、角色受欢迎程度和搜索条件计算而得。
Ansible Galaxy命令行工具
ansible-galaxy search子命令在Ansible Galaxy中搜索角色。如果以参数形式指定了字符串,则可用于按照关键字在Ansible Galaxy中搜索角色。用户可以使用--author、--platforms和--galaxy-tags选项来缩小搜索结果的范围。也可以将这些选项用作主要的搜索键。例如,命令ansible-galaxy search --author geerlingguy将显示由用户geerlingguy提交的所有角色。
结果按照字母顺序显示,而不是Best Match分数降序排列。下例显示了包含redis并且适用于企业Linux(EL)平台的角色的名称。
[root@ansible roles]# ansible-galaxy search 'mysql' --platforms EL Found 629 roles matching your search: Name Description ---- ----------- 0utsider.ansible_zabbix_agent Installing and maintaining zabbix-agent for RedHat/Deb> 0x0i.grafana Grafana - an analytics and monitoring observability pl> 0x0i.prometheus Prometheus - a multi-dimensional time-series data moni> 4linuxdevops.mysql-server Instalacao e Configuracao do servidor MySQL 5KYDEV0P5.skydevops-mysql Install and configure MySQL Database AAbouZaid.yourls Manage Yourls, a URL shortener web app. abednarik.mysqld-exporter Install and configure mysqld_exporter abelboldu.openstack-glance abelboldu.openstack-keystone abelboldu.openstack-neutron-controller OpenStack Neutron controller node abelboldu.openstack-nova-controller OpenStack Nova controller node acandid.mysql Install MySQL 8 on RedHat/CentOS 8 and Create user and> adelean.solr Apache Solr for Linux. AerisCloud.collectd This role takes care of adding collectd to any given s> AerisCloud.librato Install and configure the Librato Agent AerisCloud.repos Manage CentOS yum and Debian apt repositories agmalpartida.cron Handle cron. ajesus37.mysql_server Instalacao e Configuracao do servidor MySQL .............................................................. ..............................................
ansible-galaxy info子命令显示与角色相关的更多详细信息。Ansible Galaxy从多个位置获取这一信息,包括角色的meta/main.yml文件及其GigHub存储库。以下命令显示了Ansible Galaxy提供的geerlingguy.redis角色的相关信息。
[root@ansible roles]# ansible-galaxy info acandid.mysql Role: acandid.mysql description: Install MySQL 8 on RedHat/CentOS 8 and Create user and database. active: True commit: 74231a180b2496c7861f899c0640aa711d591bad commit_message: Update README.md commit_url: https://api.github.com/repos/acandid/mysql/git/commits/74231a180b2496c7861f899c0640aa711d> company: Almir Candido created: 2020-07-22T13:29:27.238385Z download_count: 27 forks_count: 0 github_branch: master github_repo: mysql github_user: acandid id: 49821 imported: 2020-07-22T09:29:27.422608-04:00 is_valid: True issue_tracker_url: https://github.com/acandid/mysql/issues license: license (BSD, MIT) min_ansible_version: 2.9 modified: 2020-07-22T13:29:27.435572Z open_issues_count: 0 path: ('/root/.ansible/roles', '/usr/share/ansible/roles', '/etc/ansible/roles') role_type: ANS stargazers_count: 0 travis_status_url:
nsible-galaxy install子命令从Ansible Galaxy下载角色,并将它安装到控制节点本地。
默认情况下,角色安装到用户的roles_path下的第一个可写目录中。根据为Ansible设置的默认roles_path,角色通常将安装到用户的~/.ansible/roles目录。默认的roles_path可能会被用户当前Ansible配置文件或环境变量ANSIBLE_ROLES_PATH覆盖,这将影响ansible-galaxy的行为。
用户可以通过使用-p DIRECTORY选项,指定具体的目录来安装角色。
[root@ansible roles]# ansible-galaxy install acandid.mysql - downloading role 'mysql', owned by acandid - downloading role from https://github.com/acandid/mysql/archive/master.tar.gz - extracting acandid.mysql to /root/.ansible/roles/acandid.mysql - acandid.mysql (master) was installed successfully [root@ansible roles]# ls ~/.ansible/roles/ acandid.mysql [root@ansible roles]# ansible-galaxy install acandid.mysql -p ~/roles/ - downloading role 'mysql', owned by acandid - downloading role from https://github.com/acandid/mysql/archive/master.tar.gz - extracting acandid.mysql to /root/roles/acandid.mysql - acandid.mysql (master) was installed successfully [root@ansible roles]# ls acandid.mysql ansible.cfg inventory test test1 test.yml timesync
可以使用ansible-galaxy remove子命令本地删除角色(不用-p指定位置 默认移除 ~/.ansible/roles/ 里的)
[root@ansible roles]# ansible-galaxy remove acandid.mysql - successfully removed acandid.mysql [root@ansible roles]# ls ~/.ansible/roles/ [root@ansible roles]# ls . acandid.mysql ansible.cfg inventory test test1 test.yml timesync
ansible-galaxy list子命令列出本地找到的角色。
[root@ansible roles]# ansible-galaxy list # /root/.ansible/roles # /usr/share/ansible/roles - linux-system-roles.certificate, (unknown version) - linux-system-roles.kdump, (unknown version) - linux-system-roles.kernel_settings, (unknown version) - linux-system-roles.logging, (unknown version) - linux-system-roles.metrics, (unknown version) - linux-system-roles.nbde_client, (unknown version) - linux-system-roles.nbde_server, (unknown version) - linux-system-roles.network, (unknown version) - linux-system-roles.postfix, (unknown version) - linux-system-roles.selinux, (unknown version) - linux-system-roles.storage, (unknown version) - linux-system-roles.timesync, (unknown version) - linux-system-roles.tlog, (unknown version) - rhel-system-roles.certificate, (unknown version) - rhel-system-roles.kdump, (unknown version) - rhel-system-roles.kernel_settings, (unknown version) - rhel-system-roles.logging, (unknown version) - rhel-system-roles.metrics, (unknown version) - rhel-system-roles.nbde_client, (unknown version) ............................................ ............................................