利用角色简化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的运行模式。它可以设为enforcingpermissivedisabled。如果未设置,则不更改模式。

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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值