利用角色简化playbook
1.角色
1.1 描述角色结构
1.1.1 利用角色构造ansible playbook
随着开发更多的playbook,我们可能会发现有很多机会重复利用以前缩写的playbook中的代码。或许,一个用于为某一应用配置MySQL数据库的play可以改变用途,通过利用不同的主机名、密码和用户来为另一个应用配置MySQL数据库。
Ansible角色提供了一种方法,让用户能以通用的方式更加轻松地重复利用Ansible代码。我们可以在标准化目录结构中打包所有任务、变量、文件、模板,以及调配基础架构或部署应用所需的其他资源。只需通过复制相关的目录,将角色从一个项目复制到另一个项目。然后,只需从一个play调用该角色就能执行它。
Ansible角色具有下列优点:
- 角色可以分组内容,从而与他人轻松共享代码
- 可以编写角色来定义系统类型的基本要素:Web服务器、数据库服务器、Git存储库,或满足其他用途
- 角色使得较大型项目更容易管理
- 角色可以由不同的管理员并行开发
除了自行编写、使用、重用和共享角色外,还可以从其他来源获取角色。一些角色已包含在rhel-system-roles软件包中,用户也可以从Ansible Galaxy网站获取由社区提供支持的许多角色。
1.1.2 检查ansible角色结构
Ansible角色由子目录和文件的标准化结构定义。顶级目录定义角色本身的名称。文件整理到子目录中,子目录按照各个文件在角色中的用途进行命名,如tasks和handlers。files和templates子目录中包含由其他YAML文件中的任务引用的文件。
site.yml
webservers.yml
fooservers.yml
roles/
common/
tasks/
handlers/
files/
templates/
vars/
defaults/
meta/
webservers/
tasks/
defaults/
meta/
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中使用时不应更改。 |
1.1.3 在playbook中使用ansible角色
在playbook中使用角色非常简单。下例演示了调用Ansible角色的一种方式:
[root@ansible playbook]# cat test.yml
---
- hosts: Call the ansible role
roles:
- role1
- role2
对于每个指定的角色,角色任务、角色处理程序、角色变量和角色依赖项将按照顺序导入到playbook中。
角色中的任何copy、script、template或include_tasks/import_tasks任务都可引用角色中相关的文件、模板或任务文件,且无需相对或绝对路径名称。Ansible将分别在角色的files、templates或tasks子目录中寻找它们。
如果使用roles部分将角色导入到play中,这些角色会在用户为该play定义的任何任务之前运行。
[root@ansible playbook]# cat playbook.yml
---
- hosts: Call the ansible role
roles:
- tasks: tasks1
- tasks: tasks2
var1: val1 //针对tasks2定义的变量
var2: val2
重要:
- 正如前面的示例中所示,内嵌设置的角色变量(角色参数)具有非常高的优先级。它们将覆盖大多数其他变量。
- 务必要谨慎,不要重复使用内嵌设置在play中其他位置的角色变量名称,因为角色变量的值将覆盖清单变量和任何play中的vars。
2.控制执行顺序
对于playbook中的每个play,任务按照任务列表中的顺序来执行。首先执行所有任务tasks
,再执行任务通知的处理程序handlers
。
在角色添加到play中后,角色任务将添加到任务列表的开头。若还有其他角色添加,则依次添加在第一个角色之后。
角色处理程序(handlers)
添加到play中的方式与角色任务添加到play中相同。每个play定义一个处理程序列表。角色处理程序先添加到处理程序列表,后跟play的handlers部分中定义的处理程序。
任务一般在角色之后,若要在角色之前执行某些任务,可以为play配置pre_tasks
部分。列在此部分中的所有任务tasks和处理程序handlers将首先执行。
- name:
hosts: apache
pre_tasks:
- debug:
msg: 'pre_task'
notify: my handler
roles:
- role1
tasks:
- debug:
msg: 'first task'
notify: my handler
post_tasks:
- debug:
msg: 'post_task'
notify: my handler
handlers: //tasks中的handlers
- name: my handler
debug:
msg: running my handler
以上play演示了一个带有pre_tasks、roles、tasks、post_tasks和handlers的示例。一个play中通常不会同时包含所有这些部分。
无论任务通知处理程序几次,全结构下的handlers都只执行3次,pre_tasks执行一次、roles和tasks是一起的,执行一次、post_tasks执行一次
执行顺序:
- 首先执行pre_tasks中的tasks和handlers
- 其次执行roles角色中的tasks任务和tasks中的tasks任务
- 然后执行roles角色中的handlers和tasks任务中的handlers
- 最后执行post_tasks中的tasks任务和handlers
3.利用系统角色重用内容
3.1 系统角色
自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服务,以调优系统性能 |
3.2 简化配置管理
RHEL7的建议时间同步服务为chronyd
服务。但在RHEL6中,建议的服务为ntpd
服务。在混合了RHEL6和7主机的环境中,管理员必须管理这两个服务的配置文件。
借助RHEL系统角色,管理员不再需要维护这两个服务的配置文件。管理员可以使用rhel-system-roles.timesync
角色来配置RHEL6和7主机的时间同步。一个包含角色变量的简化YAML文件可以为这两种类型的主机定义时间同步配置。
3.3 安装RHEL系统角色
RHEL系统角色由rhel-system-roles
软件包提供,该软件包可从AppStream流获取。在Ansible控制节点上安装该软件包。
安装RHEL系统角色
yum -y install rhel-system-roles
安装后,RHEL系统角色位于/usr/share/ansible/roles
目录中:
ls -l /usr/share/ansible/roles/
在使用过程中可以将系统角色复制到自己的ansible/roles
目录下,并修改一个简单的角色名
以下是复制到自己的ansible/roles目录下的selinux角色:
[root@ansible ansible]# ls roles/selinux/
ansible_pytest_extra_requirements.txt meta tasks
COPYING molecule_extra_requirements.txt tests
custom_requirements.txt pylint_extra_requirements.txt tox.ini
defaults pylintrc vars
files pytest_extra_requirements.txt
library README.md
3.4 访问RHEL系统角色的文档
安装后,RHEL系统角色的文档位于/usr/share/doc/rhel-system-roles-/
目录中。文档按照子系统整理到子目录中:
[root@ansible ~]# ll /usr/share/doc/rhel-system-roles/
总用量 4
drwxr-xr-x. 2 root root 42 8月 7 04:07 certificate
drwxr-xr-x. 3 root root 55 8月 7 04:07 collection
drwxr-xr-x. 2 root root 42 8月 7 04:07 crypto_policies
drwxr-xr-x. 2 root root 77 8月 7 04:07 ha_cluster
drwxr-xr-x. 2 root root 42 8月 7 04:07 kdump
drwxr-xr-x. 2 root root 42 8月 7 04:07 kernel_settings
drwxr-xr-x. 2 root root 42 8月 7 04:07 logging
drwxr-xr-x. 2 root root 42 8月 7 04:07 metrics
drwxr-xr-x. 2 root root 42 8月 7 04:07 nbde_client
drwxr-xr-x. 2 root root 42 8月 7 04:07 nbde_server
drwxr-xr-x. 2 root root 4096 8月 7 04:07 network
drwxr-xr-x. 2 root root 42 8月 7 04:07 postfix
drwxr-xr-x. 2 root root 78 8月 7 04:07 selinux
drwxr-xr-x. 2 root root 42 8月 7 04:07 ssh
drwxr-xr-x. 2 root root 81 8月 7 04:07 sshd
drwxr-xr-x. 2 root root 42 8月 7 04:07 storage
drwxr-xr-x. 2 root root 121 8月 7 04:07 timesync
drwxr-xr-x. 2 root root 42 8月 7 04:07 tlog
每个角色的文档目录均包含一个README.md
文件。README.md
文件含有角色的说明,以及角色用法信息。
README.md
文件也会说明影响角色行为的角色变量。通常,README.md
文件中含有一个playbook代码片段,用于演示常见配置场景的变量设置。
部分角色文档目录中含有示例playbook。首次使用某一角色时,请查看文档目录中的任何额外示例playbook。
RHEL系统角色的角色文档与Linux系统角色的文档相匹配。使用Web浏览器来访问位于Ansible Galaxy网站https://galaxy.ansible.com/docs/ 上的角色文档。
3.5 时间同步角色示例
rhel-system-roles.timesync角色执行NTP时间同步的操作
为了手动配置NTP服务器,该角色具有一个名为timesync_ntp_servers的变量。此变量取一个要使用的NTP服务器的列表作为值。列表中的每一项均由一个或多个属性构成。两个关键属性如下:
timesync_ntp_servers属性
属性 | 用途 |
---|---|
hostname | 要与其同步的NTP服务器的主机名。 |
iburst | 一个布尔值,用于启用或禁用快速初始同步。在角色中默认为no,但通常应该将属性设为yes. |
以下示例play使用rhel-system-roles.timesync角色将受管主机配置为利用快速初始同步从aliyun服务器获取时间。此外,还添加了一个任务,以使用timezone模块将主机的时区设为UTC。
[root@localhost ~]# date
2022年 01月 01日 星期六 00:10:04 CST
[root@ansible playbook]# cat timesync.yml
---
- name:
hosts: apache
vars:
timesync_ntp_servers:
- hostname: time1.aliyun.com //指定时间同步服务器的变量
iburst: yes
roles: //引用角色
- timesync
tasks:
- name: Set timezone
timezone:
name: "{{ timezone }}"
[root@localhost ~]# date
2021年 08月 03日 星期二 00:15:57 UTC
注意:
- 如果要设置不同的时区,可以使用tzselect命令查询其他有效的值。也可以使用timedatectl命令来检查当前的时钟设置。
此示例在play的vars部分中设置角色变量,但更好的做法可能是将它们配置为主机或主机组的清单变量。
timesync.yml定义时间同步变量,覆盖清单中servers组内主机的角色默认值。
该结构可清楚地分隔角色、playbook代码和配置设置。Playbook代码简单易读,应该不需要复杂的重构。角色内容由红帽进行维护并提供支持。所有设置都以清单变量的形式进行处理。
该结构还支持动态的异构环境。具有新的时间同步要求的主机可能会放置到新的主机组中。相应的变量在YAML文件中定义,并放置到相应的group_vars(或host_vars)子目录中
3.6 selinux角色
rhel-system-roles.selinux
角色可以简化SELinux配置设置的管理。它通过利用SELinux相关的Ansible模块来实施。
与自行编写任务相比,使用此角色的优势是它能让用户摆脱编写这些任务的职责。取而代之,用户将为角色提供变量以对其进行配置,且角色中维护的代码将确保应用用户需要的SELinux配置。
此角色可以执行的任务包括:
- 设置enforcing或permissive模式
- 对文件系统层次结构的各部分运行restorecon
- 设置SELinux布尔值
- 永久设置SELinux文件上下文
- 设置SELinux用户映射
SELinux角色必须确保重新引导受管主机,以便能够完整应用其更改。但是其本身不会重新引导主机。
其工作方式为,该角色将一个布尔值变量selinux_reboot_required
设为True,如果需要重新引导,则失败。你可以使用block/rescure结构来从失败中恢复,具体操作为:如果该变量没有设为true,则让play失败,如果值是true,则重新引导受管主机并重新运行该角色。Play中的块看起来应该类似于:
[root@ansible playbook]# cat selinux.yml
- hosts: all
vars:
selinux_state: enforcing
tasks:
- name: selinux
block:
- include_role:
name: selinux
rescue:
- name: if failed reason require reboot
fail:
when: not selinux_reboot_required
- name: reboot
reboot:
- name: config selinux
include_role:
name: selinux
3.6.1 配置selinux角色
用于配置rhel-system-roles.selinux角色的变量的详细记录位于其README.md文件中。
selinux_state变量设置SELinux的运行模式。它可以设为enforcing
、permissive
或disabled
。如果未设置,则不更改模式。
selinux_state: enforcing
selinux_booleans
变量取一个要调整的SELinux布尔值的列表作为值。列表中的每一项是变量的散列/字典,布尔值的name、state(on或off),以及该设置是否应在重新引导后persistent。
[root@ansible playbook]# cat selinux.yml
---
- hosts: apache
name: Set httpd_ enabled_ Homedirs is permanently set to on
selinux_booleans:
- name: 'httpd'
state: 'on'
persistent: 'yes'
selinux_fcontext
变量取一个要永久设置(或删除)的文件上下文的列表作为值。它的工作方式与selinux fcontent
命令非常相似。
[root@ansible playbook]# cat selinux.yml
---
- hosts: apache
name: Set httpd_ enabled_ Homedirs is permanently set to on
selinux_booleans:
- name: 'httpd'
state: 'on'
persistent: 'yes'
selinux_fcontexts:
- target: '/srv/www(/.*)?'
setype: 'httpd_sys_content_t'
state: 'present'
selinux_restore_dirs
变量指定要对其运行restorecon的目录的列表:
[root@ansible playbook]# cat selinux.yml
---
- hosts: apache
name: Set httpd_ enabled_ Homedirs is permanently set to on
selinux_booleans:
- name: 'httpd'
state: 'on'
persistent: 'yes'
selinux_fcontexts:
- target: '/srv/www(/.*)?'
setype: 'httpd_sys_content_t'
state: 'present'
selinux_restore_dirs:
- /srv/www
[root@master ~]# ansible-playbook selinux.yml
selinux_ports
变量取应当具有特定SELinux类型的端口的列表作为值。
[root@ansible playbook]# cat selinux.yml
---
- hosts: apache
name: Set httpd_ enabled_ Homedirs is permanently set to on
selinux_booleans:
- name: 'httpd'
state: 'on'
persistent: 'yes'
selinux_fcontexts:
- target: '/srv/www(/.*)?'
setype: 'httpd_sys_content_t'
state: 'present'
selinux_restore_dirs:
- /srv/www
selinux_ports:
- ports: '82'
setype: 'http_port_t'
proto: 'tcp'
state: 'present'
[root@master ~]# ansible-playbook selinux.yml
selinux配置httpd服务:
[root@ansible ansible]# ls files/
httpd.conf.j2
---
- name:
vars: //定义变量 配置selinux放行规则
selinux_state: enforcing //设置selinux状态 enforcing:活跃、permissive:宽容模式、disabled:关闭
selinux_ports: //selinux放行规则分别是: 端口、标签、协议、状态
- ports: "82"
setype: "http_port_t"
proto: "tcp"
state: "present"
port: 82
tasks: //安装httpd服务
- name: instasll httpd
yum:
name: httpd
state: present
- name: config httpd //配置httpd服务
template:
src: files/httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
- name: selinux for httpd //为httpd服务提供重启
block:
- include_role:
name: selinux
rescue:
- name: if failed reason require reboot
fail:
when: not selinux_reboot_required
- name: reboot
reboot:
- name: config selinux
include_role:
name: selinux
- name: start httpd //重启httpd服务,这样新的配置文件才能生效
service:
name: httpd
state: present
enabled: yes
//执行playbook
[root@ansible ansible]# ansible-playbook test.yml
PLAY [apache] *********************************************************************************************
TASK [Gathering Facts] ************************************************************************************
ok: [192.168.237.168]
TASK [selinux : instasll httpd] ***************************************************************************
changed: [192.168.237.168]
//selinux放行规则,82端口已添加
[root@localhost ~]# semanage port -l|grep http
http_cache_port_t tcp 8080, 8118, 8123, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 82, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
[root@localhost ~]# ss -anltup
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1034,fd=5))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1034,fd=7))
tcp LISTEN 0 128 *:82 *:* users:(("httpd",pid=247294,fd=4),("httpd",pid=247293,fd=4),("httpd",pid=247292,fd=4),("httpd",pid=247290,fd=4))
测试:
4.创建角色
这里指的的角色是非系统角色是自己创建的角色。
创建角色流程:
- 创建角色目录结构
- 定义角色内容
- 在playbook中使用角色
4.1 创建角色目录结构
默认情况下,Ansible会在Ansible Playbook所在目录的roles子目录中查找角色。这样,用户可以利用playbook和其他支持文件存储角色。
如果Ansible无法在该位置找到角色,它会按照顺序在Ansible配置设置roles_path所指定的目录中查找。此变量包含要搜索的目录的冒号分隔列表。此变量的默认值为:
~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles //查找顺序
这允许用户将角色安装到由多个项目共享的系统上。例如,用户可能将自己的角色安装在自己的主目录下的~/.ansible/roles子目录中,而系统可能将所有用户的角色安装在/usr/share/ansible/roles目录中。
每个角色具有自己的目录,采用标准化的目录结构。例如,以下目录结构包含了定义motd角色的文件。
[root@ansible ~]# tree roles/
roles/
└── motd
├── defaults
│ └── main.yml
├── files
├── handlers
├── meta
│ └── main.yml
├── tasks
│ └── main.yml
└── templates
└── motd.j2
4.2 创建角色框架
可以使用标准Linux命令创建新角色所需的所有子目录和文件。此外,也可以通过命令行实用程序来自动执行新角色创建过程。
ansible-galaxy
命令行工具可用于管理Ansible角色,包括新角色的创建。用户可以运行ansible-galaxy init +角色名称参数
来创建新角色的目录结构。该命令在当前工作目录中为新角色创建子目录。
ansible-galaxy工具会自动创建一个完整的角色结构。
[root@ansible roles]# ansible-galaxy init httpd
- Role httpd was created successfully
[root@ansible roles]# tree httpd/
httpd/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 8 files
- README.md提供人类可读的基本角色描述、有关如何使用该角色的文档和示例,以及其发挥作用所需要满足的任何非Ansible要求。
- meta子目录包含一个main.yml文件,该文件指定有关模块的作者、许可证、兼容性和依赖项的信息。
- files子目录包含固定内容的文件。
- templates子目录则包含使用时可由角色部署的模板。
4.3 通过变量更改角色的行为
编写良好的角色利用默认变量来改变角色行为,使之与相关的配置场景相符。这有助于让角色变得更为通用,可在各种不同的上下文中重复利用。
如果通过以下方式定义了相同的变量,则角色的defaults目录中定义的变量的值将被覆盖:
- 在清单文件中定义,作为主机变量或组变量
- 在playbook项目的group_vars或host_vars目录下的YAML文件中定义
- 作为变量嵌套在play的vars关键字中定义
- 在play的roles关键字中包含该角色时作为变量定义
在play中使用角色变量时,变量的优先级:
- 几乎任何其他变量都会覆盖角色的默认变量,如清单变量、playvars变量,以及内嵌的角色参数等。
- 较少的变量可以覆盖角色的vars目录中定义的变量。事实、通过include_vars加载的变量、注册的变量和角色参数是其中一些具备这种能力的变量。清单变量和playvars无此能力。这非常重要,因为它有助于避免用户的play意外改变角色的内部功能。
- 作为角色参数内嵌声明的变量具有非常高的优先级。
- 它们可以覆盖角色的vars目录中定义的变量。如果某一角色参数的名称与playvars或角色vars中设置的变量或者清单变量或playbook变量的名称相同,该角色参数将覆盖另一个变量。
即优先级如下:
- 角色内嵌参数、事实、通过include_var加载的变量、注册的变量
- vars/main.yml中定义的变量
- playbook中vars部分定义的变量
- 主机变量、主机组变量
- defaults/main.yml中定义的变量
4.4 角色的使用(安装httpd)
//步骤1,将httpd的配置文件复制到/roles/httpd/templates模板目录下
[root@ansible templates]# ls
httpd.conf.j2
// 步骤2,定义模板中的端口,变量放在roles/httpd/vars/下的main.yml文件中
[root@ansible templates]# head -45 httpd.conf.j2 | tail -1
Listen {{ PORT }}
[root@ansible templates]# head -99 httpd.conf.j2 | tail -1
ServerName localhost:{{ PORT }}
[root@ansible httpd]# cat vars/main.yml
---
# vars file for httpd
PORT: 80
//步骤3,在roles/httpd/tasks/main.yml文件中编写任务
[root@ansible httpd]# cat tasks/main.yml
---
# tasks file for httpd
- name: install httpd
yum: //安装httpd
name: httpd
state: present
- name: cp httpd.conf.j2 //移动模板文件到受控主机
template:
src: templates/httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
notify: restart httpd //如果配置文件发生改动将会触发处理程序
- name: started httpd //启动httpd服务
service:
name: httpd
state: started
enabled: yes
//步骤4,在roles/httpd/handlers/main.yml文件中编写处理程序
[root@ansible httpd]# cat handlers/main.yml
---
# handlers file for httpd
- name: restart httpd
service:
name: httpd
state: restarted
//步骤5,编写playbook定义运行主机和角色
[root@ansible playbook]# cat httpd.yml
---
- name:
hosts: apache
roles:
- httpd
运行playbook:
[root@ansible ansible]# ansible-playbook playbook/httpd.yml
PLAY [apache] *********************************************************************************************
TASK [Gathering Facts] ************************************************************************************
ok: [192.168.237.168]
TASK [install httpd] **************************************************************************************
changed: [192.168.237.168]
TASK [cp httpd.conf.j2] ***********************************************************************************
changed: [192.168.237.168]
TASK [started httpd] **************************************************************************************
changed: [192.168.237.168]
RUNNING HANDLER [restart httpd] ***************************************************************************
changed: [192.168.237.168]
PLAY RECAP ************************************************************************************************
192.168.237.168 : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
//查看端口
[root@localhost ~]# ss -anltup
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1034,fd=5))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1034,fd=7))
tcp LISTEN 0 128 *:80 *:* users:(("httpd",pid=88513,fd=4),("httpd",pid=88512,fd=4),("httpd",pid=88511,fd=4),("httpd",pid=88509,fd=4))
测试:
5.使用Ansible Galaxy部署角色
5.1 介绍Ansible Galaxy
Ansible Galaxy [https://galaxy.ansible.com]是一个Ansible内容公共资源库。它包含数千个Ansible角色,具有可搜索的数据库,可帮助Ansible用户确定或许有助于他们完成管理任务的角色。
此外,用于从Ansible Galaxy获取和管理角色的ansible-galaxy命令也可用于为您的项目获取和管理自有的git存储库中的角色。
5.1.1 获取Gnsible Galaxy帮助
通过Ansible Galaxy网站主页上的Documenttaion标签,可以进入描述如何使用Ansible Galaxy的页面。其中包含了介绍如何从Ansible Galaxy下载和使用角色的内容。该页面也提供关于如何开发角色并上传到Ansible Galaxy的说明。
5.1.2 浏览Gnsible Galaxy中的角色
通过Ansible Galaxy网站主页上左侧的Search标签,用户可以访问关于Ansible Galaxy上发布的角色的信息。用户可以使用标记通过角色的名称或通过其他角色属性来搜索Ansible角色。结果按照Best Match分数降序排列,此分数依据角色质量、角色受欢迎程度和搜索条件计算而得。
5.2 Ansible Galaxy命令行工具
5.2.1 从命令行搜索角色
ansible-galaxy search
子命令在Ansible Galaxy中搜索角色。如果以参数形式指定了字符串,则可用于按照关键字在Ansible Galaxy中搜索角色。
用户可以使用--author
、--platforms
和--galaxy-tags
选项来缩小搜索结果的范围。也可以将这些选项用作主要的搜索键。
例如,命令ansible-galaxy search --author krzysztof-magosa将显示由用户krzysztof-magosa提交的所有角色。
[root@ansible ansible]# ansible-galaxy search --author krzysztof-magosa
Found 16 roles matching your search:
Name Description
---- -----------
krzysztof-magosa.configs Generic configs templater
krzysztof-magosa.cron Ansible Role for cron
krzysztof-magosa.docker Installs and configures Docker
krzysztof-magosa.epel Configures EPEL repository
krzysztof-magosa.homebrew Installs homebrew
krzysztof-magosa.hostname Sets hostname
krzysztof-magosa.htpasswd Ansible role generating htpasswd files
krzysztof-magosa.identity Configures groups and users
krzysztof-magosa.java Ansible role installing Java
krzysztof-magosa.memcached Installs and configures memcached
krzysztof-magosa.mount Ansible Role mounting filesystems
:
ansible-galaxy info
子命令显示与角色相关的更多详细信息。Ansible Galaxy从多个位置获取这一信息,包括角色的meta/main.yml文件及其GigHub存储库。
//显示krzysztof-magosa.docker角色相关信息
[root@ansible ansible]# ansible-galaxy info krzysztof-magosa.docker
Role: krzysztof-magosa.docker
description: Installs and configures Docker
active: True
commit: fcd7a5f425202636e3d432d5f2cfc8c005f81ef2
commit_message: Merge pull request #10 from krzysztof-magosa/ubuntu20
test on 20.04 as well
commit_url: https://api.github.com/repos/krzysztof-magosa/ansible-role-docker/git/commits/fcd7a5>
company:
created: 2019-08-17T22:35:01.300375Z
download_count: 1422483
forks_count: 0
github_branch: master
github_repo: ansible-role-docker
github_user: krzysztof-magosa
:
5.2.2 从Ansible Galaxy安装角色
ansible-galaxy install
子命令从Ansible Galaxy下载角色,并将它安装到控制节点本地。
默认情况下,角色安装到用户的roles_path下的第一个可写目录中。根据为Ansible设置的默认roles_path,角色通常将安装到用户的~/.ansible/roles目录。默认的roles_path可能会被用户当前Ansible配置文件或环境变量ANSIBLE_ROLES_PATH覆盖,这将影响ansible-galaxy的行为。
用户可以通过使用-p DIRECTORY选项,指定具体的目录来安装角色。
[root@ansible ansible]# ansible-galaxy install krzysztof-magosa.docker -p roles/ //-p 指定安装路径
- downloading role 'docker', owned by krzysztof-magosa
- downloading role from https://github.com/krzysztof-magosa/ansible-role-docker/archive/0.7.0.tar.gz
- extracting krzysztof-magosa.docker to /etc/ansible/roles/krzysztof-magosa.docker
- krzysztof-magosa.docker (0.7.0) was installed successfully
[root@ansible ansible]# ls roles/
apache httpd krzysztof-magosa.docker selinux
5.2.3 使用要求文件安装角色
可以使用ansible-galaxy,根据某一文本文件中的定义来安装一个角色列表。例如,如果用户的一个playbook需要安装特定的角色,可以在项目目录中创建一个roles/requirements.yml文件来指定所需的角色。此文件充当playbook项目的依赖项清单,使得playbook的开发和调试能与任何支持角色分开进行。
- 应当在requirements.yml文件中指定角色版本,特别是生产环境中的playbook。
- 如果不指定版本,将会获取角色的最新版本。如果作者对角色做出了更改,并与用户的playbook不兼容,这可能会造成自动化失败或其他问题。
若要使用角色文件来安装角色,可使用-r requirements.yml
选项:
[root@ansible ansible]# cat roles/requirements.yml
---
- src: robertdebock.httpd
[root@ansible ansible]# ansible-galaxy install -r roles/requirements.yml -p roles/ //-r 指定要求文件,-p 指定安装路径
- downloading role 'httpd', owned by robertdebock
- downloading role from https://github.com/robertdebock/ansible-role-httpd/archive/7.0.0.tar.gz
- extracting robertdebock.httpd to /etc/ansible/roles/robertdebock.httpd
- robertdebock.httpd (7.0.0) was installed successfully
5.2.4 管理下载的角色
ansible-galaxy list
子命令列出本地找到的角色。
[root@ansible ansible]# ansible-galaxy list
# /usr/share/ansible/roles
- linux-system-roles.certificate, (unknown version)
- linux-system-roles.crypto_policies, (unknown version)
- linux-system-roles.ha_cluster, (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.ssh, (unknown version)
- linux-system-roles.sshd, (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.crypto_policies, (unknown version)
- rhel-system-roles.ha_cluster, (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)
- rhel-system-roles.nbde_server, (unknown version)
- rhel-system-roles.network, (unknown version)
- rhel-system-roles.postfix, (unknown version)
- rhel-system-roles.ssh, (unknown version)
- rhel-system-roles.sshd, (unknown version)
- rhel-system-roles.storage, (unknown version)
- rhel-system-roles.timesync, (unknown version)
- rhel-system-roles.tlog, (unknown version)
# /etc/ansible/roles
- selinux, (unknown version)
- httpd, (unknown version)
- apache, (unknown version)
- krzysztof-magosa.docker, 0.7.0
- robertdebock.httpd, 7.0.0
[WARNING]: - the configured path /root/.ansible/roles does not exist.
如果需要列出的角色所在目录不在默认配置文件里面,可以使用-p指定也需要列出的路径
[root@ansible ansible]# ansible-galaxy list -p roles/
ansible-galaxy remove
子命令本地删除角色
[root@ansible ansible]# ansible-galaxy remove robertdebock.httpd
- robertdebock.httpd is not installed, skipping. //删除失败,显示未安装,跳过
[root@ansible ansible]# ansible-galaxy remove robertdebock.httpd -p roles/ //使用-p指定路径
- successfully removed robertdebock.httpd
[root@ansible ansible]# ansible-galaxy list
# /usr/share/ansible/roles
- linux-system-roles.certificate, (unknown version)
- linux-system-roles.crypto_policies, (unknown version)
- linux-system-roles.ha_cluster, (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.ssh, (unknown version)
- linux-system-roles.sshd, (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.crypto_policies, (unknown version)
- rhel-system-roles.ha_cluster, (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)
- rhel-system-roles.nbde_server, (unknown version)
- rhel-system-roles.network, (unknown version)
- rhel-system-roles.postfix, (unknown version)
- rhel-system-roles.ssh, (unknown version)
- rhel-system-roles.sshd, (unknown version)
- rhel-system-roles.storage, (unknown version)
- rhel-system-roles.timesync, (unknown version)
- rhel-system-roles.tlog, (unknown version)
# /etc/ansible/roles
- selinux, (unknown version)
- httpd, (unknown version)
- apache, (unknown version)
- krzysztof-magosa.docker, 0.7.0
[WARNING]: - the configured path /root/.ansible/roles does not exist.