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 server
import_playbook: web.yml
- name: Prepare the database server
import_playbook: db.yml
还可以使用导入的playbook在主playbook中交替play。
- name: Play 1
hosts: localhost
tasks:
- debug:
msg: Play 1
- name: Import Playbook
import_playbook: play2.yml
1.4导入和包含任务
可以将任务文件中的任务列表导入或包含在play中。任务文件是包含一个任务平面列表的文件:
[root@localhost ~]# cat webserver_tasks.yml
- name: Installs the httpd package
yum:
name: httpd
state: latest
- name: Starts the httpd service
service:
name: httpd
state: started
1.4.1导入任务文件
可以使用import_tasks功能将任务文件静态导入playbook内的play中。导入任务文件时,在解析该playbook时将直接插入该文件中的任务。Playbook中的import_tasks的位置控制插入任务的位置以及运行多个导入的顺序。
---
- name: Install web server
hosts: webservers
tasks:
- import_tasks: webserver_tasks.yml
导入任务文件时,在解析该playbook时将直接插入该文件中的任务。由于import_tasks在解析playbook时静态导入任务,因此对其工作方式有一些影响。
使用import_tasks功能时,导入时设置的when等条件语句将应用于导入的每个任务
无法将循环用于import_tasks功能
如果使用变量来指定要导入的文件的名称,则将无法使用主机或组清单变量
1.4.2包含任务文件
可以使用include_tasks功能将任务文件动态导入playbook内的play中。
---
- name: Install web server
hosts: webservers
tasks:
- include_tasks: webserver_tasks.yml
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命名。