当前位置: 代码迷 >> 综合 >> Ansible 包含与导入的用法,角色的架构,系统角色的使用
  详细解决方案

Ansible 包含与导入的用法,角色的架构,系统角色的使用

热度:90   发布时间:2023-12-04 04:40:48.0

1.包含和导入文件

1.1管理大型playbook

如果playbook很长或很复杂,我们可以将其分成较小的文件以便于管理。可采用模块化方式将多个playbook组合为一个主要playbook,或者将文件中的任务列表插入play。这样可以更轻松地在不同项目中重用play或任务序列。

1.2包含或导入文件

Ansible可以使用两种操作将内容带入playbook。可以包含内容,也可以导入内容。

包含内容是一个动态操作。在playbook运行期间,Ansible会在内容到达时处理所包含的内容。

导入内容是一个静态操作。在运行开始之前,Ansible在最初解析playbook时预处理导入的内容。

1.2导入playbook

import_playbook指令允许将包含play列表的外部文件导入playbook。换句话说,可以把一个或多个额外playbook导入到主playbook中。

由于导入的内容是一个完整的playbook,因此import_playbook功能只能在playbook的顶层使用,不能在play内使用。如果导入多个playbook,则将按顺序导入并运行它们。

导入两个额外playbook的主playbook的简单示例如下所示:

- name: Prepare the web serverimport_playbook: web.yml- name: Prepare the database serverimport_playbook: db.yml

还可以使用导入的playbook在主playbook中交替play。

- name: Play 1hosts: localhosttasks:- debug:msg: Play 1- name: Import Playbookimport_playbook: play2.yml

在此例中,Play 1首先运行,然后运行从play2.ymlplaybook中导入的play。

1.4导入和包含任务

可以将任务文件中的任务列表导入或包含在play中。任务文件是包含一个任务平面列表的文件:

[root@localhost ~]# cat webserver_tasks.yml- name: Installs the httpd packageyum:name: httpdstate: latest- name: Starts the httpd serviceservice:name: httpdstate: started

1.4.1导入任务文件

可以使用import_tasks功能将任务文件静态导入playbook内的play中。导入任务文件时,在解析该playbook时将直接插入该文件中的任务。Playbook中的import_tasks的位置控制插入任务的位置以及运行多个导入的顺序。

---- name: Install web serverhosts: webserverstasks:- import_tasks: webserver_tasks.yml

导入任务文件时,在解析该playbook时将直接插入该文件中的任务。由于import_tasks在解析playbook时静态导入任务,因此对其工作方式有一些影响。

  • 使用import_tasks功能时,导入时设置的when等条件语句将应用于导入的每个任务
  • 无法将循环用于import_tasks功能
  • 如果使用变量来指定要导入的文件的名称,则将无法使用主机或组清单变量

1.4.2包含任务文件

可以使用include_tasks功能将任务文件动态导入playbook内的play中。

---- name: Install web serverhosts: webserverstasks:- include_tasks: webserver_tasks.yml

在play运行并且这部分play到达前,include_tasks功能不会处理playbook中的内容。Playbook内容的处理顺序会影响包含任务功能的工作方式。

  • 使用include_tasks功能时,包含时设置的when等条件语句将确定任务是否包含在play中
  • 如果运行ansible-playbook --list-tasks以列出playbook中的任务,则不会显示已包含任务文件中的任务。将显示包含任务文件的任务。相比之下,import_tasks功能不会列出导入任务文件的任务,而列出已导入任务文件中的各个任务
  • 不能使用ansible-playbook --start-at-task从已包含任务文件中的任务开始执行playbook
  • 不能使用notify语句触发已包含任务文件中的处理程序名称。可以在包含整个任务文件的主playbook中触发处理程序,在这种情况下,已包含文件中的所有任务都将运行

2.利用角色简化playbook

2.1描述角色(roles)的结构

2.1.1角色定义

  • Ansible的roles提供了一种方法,让用户能以通用的方式更加轻松地重复利用Ansible代码。我们可以在标准化目录结构中打包所有任务、变量、文件、模板,以及调配基础架构或部署应用所需的其他资源。只需通过复制相关的目录,将角色从一个项目复制到另一个项目。然后,只需从一个play调用该角色就能执行它。
  • 简单来说roles是指一段写好的通用的playbook代码
  • 编写完毕后,可以从playbook中向角色传递调整其行为的变量,设置所有站点相关的主机名、IP地址、用户名,或其他在本地需要的具体详细信息。roles的作者也可以确保在选择不在play中设置变量值时,为这些变量设定合理的默认值。

2.1.2ansible角色具有下列优点:

  • 角色可以分组内容,从而与他人轻松共享代码
  • 可以编写角色来定义系统类型的基本要素:web服务器、数据库服务器、Git存储库,或满足其他用途
  • 角色使得较大型项目更容易管理
  • 角色可以由不同的管理员并行开发

2.1.3获取角色的方法

  • 通过https://galaxy.ansible.com/网站获取由社区提供支持的许多角色
  • 安装rhel-system-roles软件包,这个安装包里面包含了一些系统默认自带的roles
[root@master bianliang]# yum -y install rhel-system-roles
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
警告:加载 '/etc/yum.repos.d/CentOS-Base.repo' 失败,跳过。
警告:加载 '/etc/yum.repos.d/CentOS8-Base-163.repo' 失败,跳过。
CentOS-8 - Base - mirrors.aliyun.com                                                                     16 kB/s | 3.9 kB     00:00    
CentOS-8 - Base - mirrors.aliyun.com                                                                    1.9 MB/s | 4.5 MB     00:02    
CentOS-8 - Extras - mirrors.aliyun.com                                                                  5.4 kB/s | 1.5 kB     00:00    
CentOS-8 - AppStream - mirrors.aliyun.com                                                                23 kB/s | 4.3 kB     00:00    
CentOS-8 - AppStream - mirrors.aliyun.com                                                               1.8 MB/s | 8.3 MB     00:04    
Extra Packages for Enterprise Linux Modular 8 - x86_64                                                  7.6 kB/s | 9.8 kB     00:01    
Extra Packages for Enterprise Linux Modular 8 - x86_64                                                  425 kB/s | 927 kB     00:02    
Extra Packages for Enterprise Linux 8 - x86_64                 

2.1.4 查看系统中有哪些角色可以使用

[root@master bianliang]# 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)
- 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)
# /etc/ansible/roles

2.1.5查看帮助

[root@master bianliang]# cat /usr/share/doc/rhel-system-roles/timesync/README.md 
timesync
========
[![Travis Build Status](https://travis-ci.org/linux-system-roles/timesync.svg?branch=master)](https://travis-ci.org/linux-system-roles/timesync)This role installs and configures an NTP and/or PTP implementation to operate
as an NTP client and/or PTP slave in order to synchronize the system clock with
NTP servers and/or grandmasters in PTP domains. Supported NTP/PTP
implementations are chrony, ntp (the reference implementation) and linuxptp.Warning
-------.........

2.2检查ansible角色结构

Ansible角色由子目录和文件的标准化结构定义。顶级目录定义角色本身的名称。文件整理到子目录中,子目录按照各个文件在角色中的用途进行命名,如tasks和handlers。files和templates子目录中包含由其他YAML文件中的任务引用的文件。

my_role/		:具体的角色项目名称,比如 nginx、tomcat、php(自由设置)
├── defaults		:用于为当前角色设定默认变量,此目录应当包含一个 main.yml 文件
│   └── main.yml	:main.yml,类似代码中的主函数,进行统一管理
├── files		:用来存放由 copy 模块或 script 模块等模块调用的文件
├── handlers		:用于定义此角色中触发条件时执行的动作,此目录应当包含一个
main.yml 文件		
│   └── main.yml
├── meta		:用于定义此角色的特殊设定及其依赖关系,此目录应当包含一个
main.yml 文件
│   └── main.yml
├── README.md		:说明文件
├── tasks		:用于定义当前角色的任务列表,此目录应当包含一个 main.yml 文件
│   └── main.yml
├── templates		:用来存放 jinjia2 模板,template 模块会自动在此目录中寻找jinjia2 模板文件
├── tests		:用于存放测试 role 本身功能的 playbook 和主机定义文件,在开发测试阶段比较常用,此目录应当包含一个 main.yml 文件和自身资源设定 invetory
│   ├── inventory
│   └── test.yml
└── vars		:用于定义此角色用到的变量,此目录应当包含一个 main.yml 文件注意:除tests子目录外,其他的所有子目录下的YAML文件必须以main命名。

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中使用时不应更改。

并非每个角色都拥有所有这些目录。

2.3定义变量和默认值

  • 角色变量通过roles目录中的var/main.yml文件来定义,这些变量具有较高的优先级,无法被清单变量覆盖,而且,这些变量只能在当前角色中生效。
  • 角色的默认变量通过roles目录中的defaultes/main.yml文件来定义,默认变量的优先级最低。
  • 在vars/main.yml或defaults/main.yml中定义具体的变量,但不要在两个文件中定义相同的变量。有意要覆盖变量的值时,应使用默认变量。

注意事项:

  • 角色中不应该包含特定于站点的数据以及任何机密,如密码或私钥。这是因为角色应该是通用的,可以重复利用并自由共享。特定于站点的详细信息不应硬编码到角色中。
  • 机密应当通过其他途径提供给角色。play中设置的角色变量可以提供机密,或指向含有该机密的Ansible Vault加密文件。

在playbook中使用角色非常简单。下例演示了调用Ansible角色的一种方式:

---
- hosts: remote.example.comroles:- role1- role2

以下示例设置role2的两个角色变量var1和var2的值。使用role2时,任何defaults和vars变量都会被覆盖。

---
- hosts: remote.example.comroles:- role: role1- role: role2var1: val1var2: val2

以下是在此情形中用户可能看到的另一种等效的YAML语法:

---
- hosts: remote.example.comroles:- role: role1- { role: role2, var1: val1, var2: val2 }

尽管这种写法更精简,但在某些情况下它更加难以阅读。

3.利用系统角色重用内容

3.1 红帽企业Linux系统角色

自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服务,以调优系统性能

系统角色的目的是在多个版本之间标准化红帽企业Linux子系统的配置。使用系统角色来配置版本6.10及以上的任何红帽企业Linux主机。

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系统角色

[root@master ~]# yum -y install rhel-system-roles
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
警告:加载 '/etc/yum.repos.d/CentOS-Base.repo' 失败,跳过。
警告:加载 '/etc/yum.repos.d/CentOS8-Base-163.repo' 失败,跳过。
上次元数据过期检查:0:21:36 前,执行于 2021年08月01日 星期日 21时22分05秒。
软件包 rhel-system-roles-1.0.1-1.el8.noarch 已安装。
依赖关系解决。
无需任何处理。
完毕!

安装后,RHEL系统角色位于/usr/share/ansible/roles目录中:

[root@master ~]# ls -l /usr/share/ansible/roles/
总用量 56
lrwxrwxrwx.  1 root root   29 3月  20 01:04 linux-system-roles.certificate -> rhel-system-roles.certificate
lrwxrwxrwx.  1 root root   33 3月  20 01:04 linux-system-roles.crypto_policies -> rhel-system-roles.crypto_policies
lrwxrwxrwx.  1 root root   28 3月  20 01:04 linux-system-roles.ha_cluster -> rhel-system-roles.ha_cluster
lrwxrwxrwx.  1 root root   23 3月  20 01:04 linux-system-roles.kdump -> rhel-system-roles.kdump
lrwxrwxrwx.  1 root root   33 3月  20 01:04 linux-system-roles.kernel_settings -> rhel-system-roles.kernel_settings
lrwxrwxrwx.  1 root root   25 3月  20 01:04 linux-system-roles.logging -> rhel-system-roles.logging
lrwxrwxrwx.  1 root root   25 3月  20 01:04 linux-system-roles.metrics -> rhel-system-roles.metrics
lrwxrwxrwx.  1 root root   29 3月  20 01:04 linux-system-roles.nbde_client -> rhel-system-roles.nbde_client
lrwxrwxrwx.  1 root root   29 3月  20 01:04 linux-system-roles.nbde_server -> rhel-system-roles.nbde_server
lrwxrwxrwx.  1 root root   25 3月  20 01:04 linux-system-roles.network -> rhel-system-roles.network
lrwxrwxrwx.  1 root root   25 3月  20 01:04 linux-system-roles.postfix -> rhel-system-roles.postfix
.........

红帽企业Linux中的默认roles_path在路径中包含/usr/share/ansible/roles,因此在playbook引用这些角色时Ansible可以很轻松的找到它们。

3.4访问RHEL系统角色的文档

安装后,RHEL系统角色的文档位于/usr/share/doc/rhel-system-roles-/目录中。文档按照子系统整理到子目录中:

[root@master ~]# ll /usr/share/doc/rhel-system-roles/
总用量 4
drwxr-xr-x. 2 root root   42 8月   1 21:14 certificate
drwxr-xr-x. 3 root root   55 8月   1 21:14 collection
drwxr-xr-x. 2 root root   42 8月   1 21:14 crypto_policies
drwxr-xr-x. 2 root root   77 8月   1 21:14 ha_cluster
drwxr-xr-x. 2 root root   42 8月   1 21:14 kdump
drwxr-xr-x. 2 root root   42 8月   1 21:14 kernel_settings
drwxr-xr-x. 2 root root   42 8月   1 21:14 logging
drwxr-xr-x. 2 root root   42 8月   1 21:14 metrics
drwxr-xr-x. 2 root root   42 8月   1 21:14 nbde_client
drwxr-xr-x. 2 root root   42 8月   1 21:14 nbde_server
drwxr-xr-x. 2 root root 4096 8月   1 21:14 network
drwxr-xr-x. 2 root root   42 8月   1 21:14 postfix
drwxr-xr-x. 2 root root   78 8月   1 21:14 selinux
drwxr-xr-x. 2 root root   42 8月   1 21:14 ssh
drwxr-xr-x. 2 root root   81 8月   1 21:14 sshd
drwxr-xr-x. 2 root root   42 8月   1 21:14 storage
drwxr-xr-x. 2 root root  121 8月   1 21:14 timesync
drwxr-xr-x. 2 root root   42 8月   1 21:14 tlog

每个角色的文档目录均包含一个README.md文件。README.md文件含有角色的说明,以及角色用法信息。

README.md文件也会说明影响角色行为的角色变量。通常,README.md文件中含有一个playbook代码片段,用于演示常见配置场景的变量设置。

部分角色文档目录中含有示例playbook。首次使用某一角色时,请查看文档目录中的任何额外示例playbook。

RHEL系统角色的角色文档与Linux系统角色的文档相匹配。使用Web浏览器来访问位于Ansible Galaxy网站https://galaxy.ansible.com/docs/上的角色文档。

3.5时间同步角色示例

假设需要在服务器上配置NTP时间同步。我们可以自行编写自动化来执行每一个必要的任务。但是,RHEL系统角色中有一个可以执行此操作角色,那就是rhel-system-roles.timesync。

该角色的详细记录位于/usr/share/doc/rhel-system-roles/timesync目录下的README.md中。此文件说明了影响角色行为的所有变量,还包含演示了不同时间同步配置的三个playbook代码片段

为了手动配置NTP服务器,该角色具有一个名为timesync_ntp_servers的变量。此变量取一个要使用的NTP服务器的列表作为值。列表中的每一项均由一个或多个属性构成。两个关键属性如下:

timesync_ntp_servers属性

属性 用途
hostname 要与其同步的NTP服务器的主机名。
iburst 一个布尔值,用于启用或禁用快速初始同步。在角色中默认为no,但通常应该将属性设为yes.

例如一个playbook项目具有以下结构:

[root@localhost ~]# date -s "2000-9-22"   //首先我们更改受管主机上的时间
2000年 09月 22日 星期五 00:00:00 EDT[root@centos8-1 ansible]# cat httpd.tar/mytime.yml    //在控制机上写playbook
---
- hosts: 192.168.100.147vars: timesync_ntp_servers: - hostname: time1.aliyun.comiburst: yesroles:  - timesync
[root@centos8-1 ansible]# [root@centos8-1 ansible]# cp /usr/share/ansible/roles/rhel-system-roles.timesync /etc/ansible/roles/timesync -r    //然后将这个文件cp一下[root@centos8-1 ansible]# ansible-playbook httpd.tar/mytime.yml    //执行成功PLAY [192.168.100.147] *********************************************************************************************TASK [Gathering Facts] *********************************************************************************************
ok: [192.168.100.147]TASK [timesync : Set version specific variables] *******************************************************************
ok: [192.168.100.147]TASK [timesync : Populate service facts] ***************************************************************************
ok: [192.168.100.147]TASK [Set variable `timesync_services` with filtered uniq service names] *******************************************
ok: [192.168.100.147]TASK [Check that variable 'timesync_services' is defined] **********************************************************
ok: [192.168.100.147] => {"changed": false,"msg": "All assertions passed"
}TASK [timesync : Check if only NTP is needed] **********************************************************************
ok: [192.168.100.147]TASK [timesync : Check if single PTP is needed] ********************************************************************
skipping: [192.168.100.147]TASK [timesync : Check if both NTP and PTP are needed] *************************************************************
skipping: [192.168.100.147]TASK [timesync : Determine current NTP provider] *******************************************************************
ok: [192.168.100.147]TASK [timesync : Select NTP provider] ******************************************************************************
ok: [192.168.100.147]TASK [timesync : Install chrony] ***********************************************************************************
ok: [192.168.100.147]TASK [timesync : Install ntp] **************************************************************************************
skipping: [192.168.100.147]TASK [timesync : Install linuxptp] *********************************************************************************
skipping: [192.168.100.147]TASK [timesync : Gather package facts] *****************************************************************************
ok: [192.168.100.147]TASK [timesync : Run phc_ctl on PTP interface] *********************************************************************
skipping: [192.168.100.147]TASK [timesync : Check if PTP interface supports HW timestamping] **************************************************
skipping: [192.168.100.147]TASK [timesync : Generate chrony.conf file] ************************************************************************
changed: [192.168.100.147]TASK [timesync : Generate chronyd sysconfig file] ******************************************************************
changed: [192.168.100.147]TASK [timesync : Generate ntp.conf file] ***************************************************************************
skipping: [192.168.100.147]TASK [timesync : Generate ntpd sysconfig file] *********************************************************************
skipping: [192.168.100.147]TASK [timesync : Generate ptp4l.conf file] *************************************************************************
skipping: [192.168.100.147]TASK [timesync : Generate ptp4l sysconfig file] ********************************************************************
skipping: [192.168.100.147]TASK [timesync : Generate phc2sys sysconfig file] ******************************************************************
skipping: [192.168.100.147]TASK [timesync : Generate timemaster.conf file] ********************************************************************
skipping: [192.168.100.147]TASK [timesync : Update network sysconfig file] ********************************************************************
changed: [192.168.100.147]TASK [timesync : Disable chronyd] **********************************************************************************
skipping: [192.168.100.147]TASK [timesync : Disable ntpd] *************************************************************************************
skipping: [192.168.100.147]TASK [timesync : Disable ntpdate] **********************************************************************************
skipping: [192.168.100.147]TASK [timesync : Disable sntp] *************************************************************************************
skipping: [192.168.100.147]TASK [timesync : Disable ptp4l] ************************************************************************************
skipping: [192.168.100.147]TASK [timesync : Disable phc2sys] **********************************************************************************
skipping: [192.168.100.147]TASK [timesync : Disable timemaster] *******************************************************************************
skipping: [192.168.100.147]TASK [timesync : Enable chronyd] ***********************************************************************************
ok: [192.168.100.147]TASK [timesync : Enable ntpd] **************************************************************************************
skipping: [192.168.100.147]TASK [timesync : Enable ptp4l] *************************************************************************************
skipping: [192.168.100.147]TASK [timesync : Enable phc2sys] ***********************************************************************************
skipping: [192.168.100.147]TASK [timesync : Enable timemaster] ********************************************************************************
skipping: [192.168.100.147]RUNNING HANDLER [timesync : restart chronyd] ***********************************************************************
changed: [192.168.100.147]PLAY RECAP *********************************************************************************************************
192.168.100.147            : ok=15   changed=4    unreachable=0    failed=0    skipped=23   rescued=0    ignored=0 [root@localhost ~]# date    //此时查看时间已经同步过来了。
2021年 08月 01日 星期日 23:07:20 EDT
[root@localhost ~]# 

注意:

如果要设置不同的时区,可以使用tzselect命令查询其他有效的值。也可以使用timedatectl命令来检查当前的时钟设置。

timesync.yml定义时间同步变量,覆盖清单中servers组内主机的角色默认值。此文件看起来类似于:

timesync_ntp_servers:- hostname: 0.rhel.pool.ntp.orgiburst: yes- hostname: 1.rhel.pool.ntp.orgiburst: yes- hostname: 2.rhel.pool.ntp.orgiburst: yes
timezone: UTC

timesync_playbook.yml的内容简化为:

- name: Time Synchronization Playhosts: serversroles:- rhel-system-roles.timesynctasks:- name: Set timezonetimezone:name: "{
   { timezone }}"

该结构可清楚地分隔角色、playbook代码和配置设置。Playbook代码简单易读,应该不需要复杂的重构。角色内容由红帽进行维护并提供支持。所有设置都以清单变量的形式进行处理。

该结构还支持动态的异构环境。具有新的时间同步要求的主机可能会放置到新的主机组中。相应的变量在YAML文件中定义,并放置到相应的group_vars(或host_vars)子目录中。

[root@centos8-1 ansible]# ansible-doc timezone    //查看模块的用法
> TIMEZONE    (/usr/lib/python3.6/site-packages/ansible/modules/system/timezone.py)This module configures the timezone setting, both of the system clock and of thehardware clock. If you want to set up the NTP, use [service] module. It isrecommended to restart `crond' after changing the timezone, otherwise the jobs mayrun at the wrong time. Several different tools are used depending on theOS/Distribution involved. For Linux it can use `timedatectl' or edit`/etc/sysconfig/clock' or `/etc/timezone' and `hwclock'. On SmartOS, `sm-set-timezone', for macOS, `systemsetup', for BSD, `/etc/localtime' is modified. On AIX,`chtz' is used. As of Ansible 2.3 support was added for SmartOS and BSDs. As ofAnsible 2.4 support was added for macOS. As of Ansible 2.9 support was added for AIX6.1+ Windows and HPUX are not supported, please let us know if you find any otherOS/distro in which this fails.* This module is maintained by The Ansible Community
OPTIONS (= is mandatory):- hwclock
[root@centos8-1 ansible]# 

3.6SELINUX角色示例

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@centos8-1 ansible]# less /usr/share/ansible/roles/rhel-system-roles.selinux/README.md
[root@centos8-1 ansible]#   //用上面的命令查看
- name: Apply SELinux roleblock:- include_role:name: rhel-system-roles.selinuxrescue:- name: Check for failure for other reasons than required rebootfail:when: not selinux_reboot_required- name: Restart managed hostreboot:- name: Reapply SELinux role to complete changesinclude_role:name: rhel-system-roles.selinux

用于配置rhel-system-roles.selinux角色的变量的详细记录位于其README.md文件中。以下示例演示了使用此角色的一些方法。

selinux_state变量设置SELinux的运行模式。它可以设为enforcing、permissive或disabled。如果未设置,则不更改模式。

selinux_state: enforcing

selinux_booleans变量取一个要调整的SELinux布尔值的列表作为值。列表中的每一项是变量的散列/字典:布尔值的name、state(它应是on还是off),以及该设置是否应在重新引导后persistent。

本例将httpd_enable_homedirs永久设为on:

selinux_booleans:- name: 'httpd_enable_homedirs'state: 'on'persistent: 'yes'

以下示例确保策略中包含一条规则,用于将/srv/www下所有文件的默认SELinux类型设为httpd_sys_content_t。

selinux_fcontexts:- target: '/srv/www(/.*)?'setype: 'httpd_sys_content_t'state: 'present'

selinux_ports变量取应当具有特定SELinux类型的端口的列表作为值。

selinux_ports:- ports: '82'setype: 'http_port_t'proto: 'tcp'state: 'present'