创建角色和ansible-galaxy简单实用

孔乐邦
2023-12-01

创建角色和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管理员和用户编写。

https://galaxy.ansible.com

它包含数千个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]
 类似资料: