创建角色和ansible-galaxy简单实用
1、创建角色
1.1 创建步骤
在Ansible中创建角色不需要特别的开发工具。创建和使用角色包含三个步骤:
- 创建角色目录结构
- 定义角色内容
- 在playbook中使用角色
1.2 创建命令
[root@JLin /]# ansible-galaxy init jlin
- Role jlin was created successfully
[root@JLin /]# ls jlin/
README.md defaults files handlers meta tasks templates tests vars
[root@JLin /]# tree jlin
jlin
|-- README.md
|-- defaults
| `-- main.yml
|-- files
|-- handlers
| `-- main.yml
|-- meta
| `-- main.yml
|-- tasks
| `-- main.yml
|-- templates
|-- tests
| |-- inventory
| `-- test.yml
`-- vars
`-- main.yml
1.3 模块化编写
角色允许以模块化方式编写playbook。为了最大限度地提高新开发角色的效率,请考虑在角色开发中采用以下推荐做法:
- 在角色自己的版本控制存储库中维护每个角色。Ansible很适合使用基于git的存储库。
- 角色存储库中不应存储敏感信息,如密码或SSH密钥。敏感值应以变量的形式进行参数化,其默认值应不敏感。使用角色的playbook负责通过Ansible Vault变量文件、环境变量或其他ansible-playbook选项定义敏感变量。
- 使用ansible-galaxy init启动角色,然后删除不需要的任何目录和文件。
- 创建并维护README.md和meta/main.yml文件,以记录用户的角色的用途、作者和用法。
- 让角色侧重于特定的用途或功能。可以编写多个角色,而不是让一个角色承担许多任务。
- 经常重用和重构角色。避免为边缘配置创建新的角色。如果现有角色能够完成大部分的所需配置,请重构现有角色以集成新的配置方案
- 使用集成和回归测试技术来确保角色提供所需的新功能,并且不对现有的playbook造成问题
1.4 角色依赖
角色依赖项使得角色可以将其他角色作为依赖项包含在内
一个定义文档服务器的角色可能依赖于另一个安装和配置web服务器的角色。依赖关系在角色目录层次结构中的meta/main.yml文件内定义
以下是一个示例meta/main.yml文件
[root@JLin jlin] cat meta/main.yml
dependencies:
- role: apache
port: 8080
- role: postgres
dbname: serverlist
admin_user: felix
默认情况下,角色仅作为依赖项添加到playbook中一次。若有其他角色也将它作为依赖项列出,它不会再次运行
此行为可以被覆盖,将meta/main.yml文件中的allow_duplicates变量设置为yes即可
1.5 在playbook中使用角色
要访问角色,可在play的 roles:
部分引用它
[root@JLin jlin] cat playbook/test.yml
---
- hosts: all
roles:
- httpd
[root@JLin jlin] ansible-playbook playbook/test.yml
PLAY [192.168.23.117] *********************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.23.117]
…………
PLAY RECAP *********************************************************************
192.168.23.117 : ok=4 changed=0 unreachable=0 failed=0 skip
这里可以不用加roles,默认情况下,Ansible会在Playbook所在目录的roles子目录中查找角色
1.6 变量更改角色行为
如果通过以下方式定义了相同的变量,则角色的defaults目录中定义的变量的值将被覆盖
- 在清单文件中定义,作为主机变量或组变量
- 在playbook项目的group_vars或host_vars目录下的YAML文件中定义
- 作为变量嵌套在play的vars关键字中定义
- 在play的roles关键字中包含该角色时作为变量定义
总结:在httpd/vars目录下定义的变量的优先级最高;/httpd/vars目录下的变量会覆盖/httpd/defaults
目录下的定义的变量
注意:
在play中使用角色变量时,变量的优先顺序可能会让人困惑
- 几乎任何其他变量都会覆盖角色的默认变量,如清单变量、playvars变量,以及内嵌的角色参数等。
- 较少的变量可以覆盖角色的vars目录中定义的变量。事实、通过include_vars加载的变量、清单变量和playvars无此能力。这非常重要,因为它有助于避免用户的play意外改变角色的内部功能。注册的变量和角色参数是其中一些具备这种能力的变量
- 不过,正如上述示例中最后一个所示,作为角色参数内嵌声明的变量具有非常高的优先级,它们可以覆盖角色的vars目录中定义的变量。如果某一角色参数的名称与playvars或角色vars中设置的变量或者清单变量或playbook变量的名称相同,该角色参数将覆盖另一个变量
1.7 角色变量的优先级
- 角色内嵌参数、事实、通过include_vars加载的变量、注册的变量
- vars/main.yml中定义的变量
- playbook中vars部分定义的变量
- 主机变量、主机组变量
- defaults/main.yml中定义变量
2、ansible-galaxy简单使用
2.1 Ansibleu galaxy简介
Ansible Galaxy 是一个Ansible内容公共资源库,这些内容由许许多多Ansible管理员和用户编写。
它包含数千个Ansible角色,具有可搜索的数据库,可帮助Ansible用户确定或许有助于他们完成管理任务的角色
Ansible Galaxy含有面向新的Ansible用户和角色开发人员的文档和视频链接
-
获取Ansible galaxy帮助
通过Ansible Galaxy网站主页上的Documenttaion标签,可以进入描述如何使用Ansible Galaxy的页面
其中包含了介绍如何从Ansible Galaxy下载和使用角色的内容。该页面也提供关于如何开发角色并上传到Ansible Galaxy的说明。 -
浏览Ansible galaxy中的角色
通过Ansible Galaxy网站主页上左侧的Search标签,用户可以访问关于Ansible Galaxy上发布的角色的信息
用户可以使用标记通过角色的名称或通过其他角色属性来搜索Ansible角色。
结果按照Best Match分数降序排列,此分数依据角色质量、角色受欢迎程度和搜索条件计算而得。
2.2 Ansible Galaxy命令行工具
2.1 从命令行搜索角色
ansible-galaxy search子命令在Ansible Galaxy中搜索角色
可以使用 –author、–platforms
和 –galaxy-tags
来缩小搜索结果的范围
浏览Ansible Galaxy中的角色
[root@JLin /]# ansible-galaxy search 'redis' --author geerlingguy
Found 3 roles matching your search:
Name Description
---- -----------
geerlingguy.php-pecl PHP PECL extension installation.
geerlingguy.php-redis PhpRedis support for Linux
geerlingguy.redis Redis for Linux
查看角色的相关信息。
[root@JLin /]# ansible-galaxy info geerlingguy.php-pecl
Role: geerlingguy.php-pecl
description: PHP PECL extension installation.
active: True
commit: 2cdc2fc9cf95415b6dd07897ef31176d2a99607c
commit_message: Switch to travis-ci.com.
commit_url: https://api.github.com/repos/geerlingguy/ansible-role-php-pecl/git/commits/2cdc2fc9cf95415b6dd07897ef31176d2a99607c
company: Midwestern Mac, LLC
created: 2020-05-26T16:57:41.121700Z
download_count: 74520
forks_count: 30
github_branch: master
github_repo: ansible-role-php-pecl
github_user: geerlingguy
id: 48922
imported: 2020-11-03T00:30:40.256620-05:00
is_valid: True
issue_tracker_url: https://github.com/geerlingguy/ansible-role-php-pecl/issues
license: license (BSD, MIT)
min_ansible_version: 2.4
modified: 2020-11-03T05:30:40.263351Z
open_issues_count: 2
path: ('/root/.ansible/roles', '/usr/share/ansible/roles', '/etc/ansible/roles')
安装角色
[root@JLin jlin]# ansible-galaxy role install robertdebock.httpd -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 /jlin/robertdebock.httpd
- robertdebock.httpd (7.0.0) was installed successfully
[root@JLin jlin]# ansible-galaxy list -p .
# /jlin
- robertdebock.httpd, 7.0.0
# /usr/share/ansible/roles
- linux-system-roles.kdump, (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)
- rhel-system-roles.kdump, (unknown version)
- rhel-system-roles.network, (unknown version)
- rhel-system-roles.postfix, (unknown version)
- rhel-system-roles.selinux, (unknown version)
- rhel-system-roles.storage, (unknown version)
- rhel-system-roles.timesync, (unknown version)
# /etc/ansible/roles
[WARNING]: - the configured path /root/.ansible/roles does not exist.
列出角色
[root@JLin jlin]# ansible-galaxy list
# /usr/share/ansible/roles
- linux-system-roles.kdump, (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)
- rhel-system-roles.kdump, (unknown version)
- rhel-system-roles.network, (unknown version)
- rhel-system-roles.postfix, (unknown version)
- rhel-system-roles.selinux, (unknown version)
- rhel-system-roles.storage, (unknown version)
- rhel-system-roles.timesync, (unknown version)
# /etc/ansible/roles
[WARNING]: - the configured path /root/.ansible/roles does not exist.
删除角色
[root@JLin jlin]# ansible-galaxy remove [name]