一、创建角色

1. 定义角色内容

1.1 创建角色内容
  • 演示实例:以上面创建的httpd角色目录结构

1. 在file目录中创建需要copy的文件

[root@ansible roles]# ls httpd/files/
dvd.repo
[root@ansible roles]#

2. 在templates目录中创建模板文件

[root@ansible roles]# ls httpd/templates/
httpd.conf.j2
[root@ansible roles]#

3. 在vars目录下创建变量文件

[root@ansible roles]# ls httpd/vars/
main.yml
[root@ansible roles]#

4. 在tasks目录中床架执行文件

[root@ansible roles]# ls httpd/tasks/
main.yml
[root@ansible roles]#

就是将不同类型的文件放在不同的目录下。

2. 角色内容开发推荐做法

2.1 模块化编写

角色允许以模块化方式编写playbook。为了最大限度地提高新开发角色的效率,请考虑在角色开发中采用以下推荐做法:

  1. 在角色自己的版本控制存储库中维护每个角色。Ansible很适合使用基于git的存储库
  2. 角色存储库中不应存储敏感信息,如密码或SSH密钥。敏感值应以变量的形式进行参数化,其默认值应不敏感。
  3. 使用角色的playbook负责通过Ansible Vault变量文件、环境变量或其他ansible-playbook选项定义敏感变量。
  4. 使用ansible-galaxy init启动角色,然后删除不需要的任何目录和文件
  5. 创建并维护README.mdmeta/main.yml文件,以记录用户的角色的用途、作者和用法
  6. 让角色侧重于特定的用途或功能。可以编写多个角色,而不是让一个角色承担许多任务
  7. 经常重用和重构角色。避免为边缘配置创建新的角色。如果现有角色能够完成大部分的所需配置,请重构现有角色以集成新的配置方案
  8. 使用集成和回归测试技术来确保角色提供所需的新功能,并且不对现有的playbook造成问题

3. 定义角色依赖项

3.1 角色依赖

角色依赖项使得角色可以将其他角色作为依赖项包含在内

一个定义文档服务器的角色可能依赖于另一个安装和配置web服务器的角色。依赖关系在角色目录层次结构中的meta/main.yml文件内定义

以下是一个示例meta/main.yml文件。

dependencies:
  - role: apache
    port: 8080
  - role: postgres
    dbname: serverlist
    admin_user: felix

默认情况下,角色仅作为依赖项添加到playbook中一次。若有其他角色也将它作为依赖项列出,它不会再次运行

此行为可以被覆盖,将meta/main.yml文件中的allow_duplicates变量设置为yes即可

4. 在playbook中使用角色

4.1 在playbook中引用角色

要访问角色,可在play的**roles:**部分引用它

[root@ansible ansible]# cat playbook/test.yml
---
- hosts: all
  roles:
    - httpd
[root@ansible ansible]#

这里可以不用加roles,默认情况下,Ansible会在Playbook所在目录的roles子目录中查找角色

5. 通过变量更改角色行为

5.1 角色中变量优先级

如果通过以下方式定义了相同的变量,则角色的defaults目录中定义的变量的值将被覆盖

  1. 在清单文件中定义,作为主机变量或组变量
  2. 在playbook项目的group_vars或host_vars目录下的YAML文件中定义
  3. 作为变量嵌套在play的vars关键字中定义
  4. 在play的roles关键字中包含该角色时作为变量定义

总结:在httpd/vars目录下定义的变量的优先级最高;/httpd/vars目录下的变量会覆盖**/httpd/defaults**目录下的定义的变量

重要:

  • 在play中使用角色变量时,变量的优先顺序可能会让人困惑
  • 几乎任何其他变量都会覆盖角色的默认变量,如清单变量、playvars变量,以及内嵌的角色参数等。
  • 较少的变量可以覆盖角色的vars目录中定义的变量。
  • 事实、通过include_vars加载的变量、
  • 清单变量和playvars无此能力。这非常重要,因为它有助于避免用户的play意外改变角色的内部功能。注册的变量和角色参数是其中一些具备这种能力的变量
  • 不过,正如上述示例中最后一个所示,作为角色参数内嵌声明的变量具有非常高的优先级,它们可以覆盖角色的vars目录中定义的变量。
  • 如果某一角色参数的名称与playvars或角色vars中设置的变量或者清单变量或playbook变量的名称相同,该角色参数将覆盖另一个变量

二、ansible-galaxy简单使用

1. 介绍Anisble galaxy

1.1 介绍Ansibleu galaxy

Ansible Galaxy (官网:https://galaxy.ansible.com)是一个Ansible内容公共资源库,这些内容由许许多多Ansible管理员和用户编写。

它包含数千个Ansible角色,具有可搜索的数据库,可帮助Ansible用户确定或许有助于他们完成管理任务的角色

Ansible Galaxy含有面向新的Ansible用户和角色开发人员的文档和视频链接

1.2 获取Ansible galaxy帮助

通过Ansible Galaxy网站主页上的Documenttaion标签,可以进入描述如何使用Ansible Galaxy的页面

其中包含了介绍如何从Ansible Galaxy下载和使用角色的内容。该页面也提供关于如何开发角色并上传到Ansible Galaxy的说明。

1.3 浏览Ansible galaxy中的角色

通过Ansible Galaxy网站主页上左侧的Search标签,用户可以访问关于Ansible Galaxy上发布的角色的信息

用户可以使用标记通过角色的名称或通过其他角色属性来搜索Ansible角色。

结果按照Best Match分数降序排列,此分数依据角色质量、角色受欢迎程度和搜索条件计算而得。

2. Ansible Galaxy命令行工具

2.1 从命令行搜索角色

ansible-galaxy search子命令在Ansible Galaxy中搜索角色

如果以参数形式指定了字符串,则可用于按照关键字在Ansible Galaxy中搜索角色

用户可以使用**–author、–platforms–galaxy-tags**选项来缩小搜索结果的范围

例如,命令ansible-galaxy search --author geerlingguy将显示由用户geerlingguy提交的所有角色

[root@ansible ansible]# 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@ansible ansible]#

ansible-galaxy info子命令显示与角色相关的更多详细信息

Ansible Galaxy从多个位置获取这一信息,包括角色的meta/main.yml文件及其GigHub存储库

以下命令显示了Ansible Galaxy提供的geerlingguy.redis角色的相关信息。

[root@ansible ansible]# ansible-galaxy info geerlingguy.redis

Role: geerlingguy.redis
        description: Redis for Linux
        active: True
        commit: 3bb101101e29aa3da55baa8ae5d9bf56e00e0aaf
        commit_message: Merge pull request #51 from agrrh/master

Fix #39: Redis won't start with ipv6 disabled
        commit_url: https://api.github.com/repos/geerlingguy/ansible-role-redis/git/commits/3bb101101e29aa3da5>        company: Midwestern Mac, LLC
        created: 2014-03-06T16:48:12.451903Z
        download_count: 573280
        forks_count: 137
        github_branch: master
        github_repo: ansible-role-redis
        github_user: geerlingguy
        id: 468
        imported: 2020-11-17T14:20:46.640658-05:00
        is_valid: True
        issue_tracker_url: https://github.com/geerlingguy/ansible-role-redis/issues
        license: license (BSD, MIT)
        min_ansible_version: 2.4
        modified: 2020-11-17T19:20:46.649130Z
        open_issues_count: 5
        path: ('/root/.ansible/roles', '/usr/share/ansible/roles', '/etc/ansible/roles')
        role_type: ANS
        stargazers_count: 170
        travis_status_url: 
[root@ansible ansible]#
2.2 从Ansibel 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-galaxy install --ignore-errors robertdebock.httpd -p project/
- 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 /root/project/robertdebock.httpd
- robertdebock.httpd (7.0.0) was installed successfully
[root@ansible ~]# ls project/
robertdebock.httpd
[root@ansible ~]#
2.3 使用要求安装文件安装角色

可以使用ansible-galaxy,根据某一文本文件中的定义来安装一个角色列表

例如,如果用户的一个playbook需要安装特定的角色,需要在项目目录中创建一个roles/requirements.yml文件来指定所需的角色

src属性指定角色的来源,本例中为来自Ansible Galaxy的robertdebock.httpd角色

重要:

  • 应当在requirements.yml文件中指定角色版本,特别是生产环境中的playbook
  • 如果不指定版本,将会获取角色的最新版本。如果作者对角色做出了更改,并与用户的playbook不兼容,这可能会造成自动化失败或其他问题。

若要使用角色文件来安装角色,可使用**-r REQUIREMENTS-FILE**选项

[root@ansible project]# cat roles/requirements.yml
---
- src: robertdebock.httpd
[root@ansible project]# ansible-galaxy install -r roles/requirements.yml -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 /root/project/robertdebock.httpd
- robertdebock.httpd (7.0.0) was installed successfully
[root@ansible project]# ls
robertdebock.httpd  roles
[root@ansible project]#

src关键字指定Ansible Galaxy角色名称。如果角色没有托管在Ansible Galaxy中,则src关键字将指明角色的URL。

2.4 管理下载角色

ansible-galaxy命令也可管理本地的角色,如位于playbook项目的roles目录中的角色。ansible-galaxy list子命令列出本地找到的角色

[root@ansible project]# 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.selinux, (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)
- linux-system-roles.vpn, (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.selinux, (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)
- rhel-system-roles.vpn, (unknown version)
# /etc/ansible/roles
- httpd, (unknown version)
[WARNING]: - the configured path /root/.ansible/roles does not exist.
[root@ansible project]#

可以使用ansible-galaxy remove子命令本地删除角色。

实例:删除robertdebock.httpd, 5.3.0

[root@ansible roles]# ansible-galaxy remove robertdebock.httpd -p .
- successfully removed robertdebock.httpd

在playbook中使用下载并安装的角色的方式与任何其他角色都一样

  • 在roles部分中利用其下载的角色名称来加以引用。如果角色不在项目的roles目录中,则将检查roles_path来查看角色是否安装在了其中一个目录中,将使用第一个匹配项