文章目录
- 一、playbook引用主机方式
- 1.1 引用清单主机
- 1.2 引用主机别名
- 1.3 使用通配符引用
- 二、动态清单
- 三、管理多个清单
- 四、forks和serial
- 五、包含与导入
- 5.1 导入playbook
- 5.2 导入任务文件
- 5.3 包含任务文件
- 5.4 结合变量
一、playbook引用主机方式
- 清单文件的使用方式很多,在大型项目中清单管理尤为重要。
1.1 引用清单主机
- 在playbook中使用hosts指定要操作的受控机,可以是受控机的ip,也可以引用清单文件。
1.查看清单文件有两个组。
2.playbook中引用mq组的主机,对其下的受控机进行操控。
[root@localhost playbook]# cat qingjun.yml
---
- name: 系统初始化
gather_facts: no
hosts: mq
tasks:
- name: 测试主机
ping:
3.也可以单独写清单文件中的某个ip。
4.使用all引用清单文件中的所有主机,忽略组的概念。
5.使用ungrouped引用清单文件中所有组之外的所有主机ip。
1.2 引用主机别名
- 当有成百上千台服务器时,清单文件里填写那么多ip我们是分不出来每台机器是干什么的,所以这是可以设置主机别名,通过引用清单文件中的主机别名也可以进行对受控机操控。
- 设置ansible_host主机变量,在清单中将某一别名指向特定的IP地址,再创建host_vars/主机别名文件。
1.清单文件自定义主机别名。
2.创建host_vars目录,其下根据清单中的主机别名来创建文件,里面通过ansible_host变量写主机ip。
3.playbook中引用主机别名,可以直接使用。
[root@localhost playbook]# cat qingjun.yml
---
- name: 系统初始化
gather_facts: no
hosts: mariadb_1 #3引用清单文件中的主机别名
tasks:
- name: 测试主机
ping:
1.3 使用通配符引用
- playbook中使用通配符“ * ”可以匹配清单中所有清单名称、主机和主机组,不区别名称是DNS名、IP地址还是组,所以可能会导致一些意外的匹配。
- 通配符必须使用引号。
1.单用“ * ” 时,则直接匹配清单中的所有主机,直接忽略组的概念,与all作用相同。
2.当通配符匹配多个主机时,可以忽略组、主机别名的概念,如下是匹配以m开头的所有主机组、主机别名下的主机。
3.也可以取反匹配。
二、动态清单
为什么要使用动态清单?
- 动态清单适用管理百台服务器以上的项目,当服务器太多时使用静态清单不好管理这些服务器,因为写Ip就要写100、1000遍,这样会失去我们使用ansible的意义。
- 而动态清单就是通过外部脚本程序自动获取受控机的信息变化自动更新,不需要人工再一个一个敲,方便管理使用。
概念:
- Ansible支持动态清单脚本,这些脚本会在Ansible执行时从这些类型的来源检索当前的信息,使清单文件实时更新。动态清单脚本是可以执行的程序,能够从一些外部来源收集信息,并以JSON格式输出清单。
使用方式:
- 与静态清单文本文件一样,清单文件位置可以通过ansible配置文件ansible.cfg文件中指定,或通过-i选项指定。
编写方式:
- 从ansible社区获取,使用python语言编写,ansible社区连接
- 自定义动态清单程序,可以使用任何语言编写,但传递适当的选项时必须以JSON格式返回清单信息,可以参考社区的详细编写信息,社区参考连接。
- 可以使用ansible-inventory命令学习如何以JSON格式编写Ansible动态清单,–list参数获取内容详情。
- 动态清单脚本需要适当解释器行,例如,#!/usr/bin/python开头并且可以执行。
- 动态清单脚本必须显示清单中所有主机和组的JSON编码散列/字典。
三、管理多个清单
- 可以创建inventory目录,将所有清单文件放入该目录,执行ansible时使用-i指定目录,则会执行目录下的所有清单文件。
注意事项:
- 目录下的清单文件按照字母顺序进行解析。
- Ansible会忽略清单目录中以特定后缀结尾的文件。这可以通过在Ansible配置文件中的inventory_ignore extensions指令来控制。
1.创建目录inventory,将qingjun清单和baimu清单放入该目录,执行ansible时指定目录对这两个清单文件中的所有主机进行操控。
四、forks和serial
forks参数:
- 作用:Ansible默认以每5台主机来运行playbook,直至所有主机运行完任务。在配置文件中设置参数值。
- playbook执行流程:一个playbook中有多个任务,先是对第一批的5台受控机执行第一个任务,再对第二批的5台受控机执行第一个任务,所有受控机把第一台任务执行完后再对第一批的5台受控机执行第二个任务,直至所有任务执行完成。
- 弊端:容易导致线上服务长时间瘫痪。比如若要更新服务,则需先执行第一个任务停止服务,再执行第二个任务启动服务,当服务器过多时,执行完第一个任务需要花费几分钟,一直到所有主机执行完第一个任务后再能开始执行第二个任务启动服务,所以这几分钟内所有服务都是停止状态,线上环境处于瘫痪状态,需要避免这种情况。
- 注意事项:使用参数时,需要根据主控机上的内存资源来设置参数值,否则容易导致主控机资源性崩溃。
serial参数:
- 作用:弥补forks参数缺陷设计,在playbook中使用serial参数。
- playbook执行流程:一个playbook中有多个任务,先在前5台主机上执行playbook中的所有任务,包括handlers中的任务,所有受控机上的任务执行完成后再在第二批的5台主机上执行playbook中的所有任务,包括handlers中的任务。
五、包含与导入
基本了解:
- 若playbook很长或很复杂,我们可以将其分成较小的文件以便于管理,采用模块化方式将多个playbook组合为一个主要playbook,或者将文件中的任务列表插入playbook中,之后运行主playbook任务,这样就可以更轻松地在不同项目中重用play或任务序列。
概念:
- 包含内容是一个动态操作,在playbook运行期间,Ansible会在内容到达时处理所包含的内容。
- 导入内容是一个静态操作,在运行开始之前,Ansible在最初解析playbook时预处理导入的内容。
5.1 导入playbook
- 导入文件就是将一个大playbook按照任务模块分成很多小playbook,再使用import_playbook模块定义一个任务文件,最后使用这个任务文件启动。
- 常常用在playbook很长的情况下,可以分开写,最后再合在一起启动,方便管理阅读。
1.如下图,有3个playbook,第一个是测试主机连通性,第二个是安装httpd服务,第三个启动服。最后定义一个任务文件,依次执行这3个playbook。
2.指定任务文件执行playbook,查看结果。
3.也可以再任务文件里自定义任务play,配合上面的playbook一起使用。
[root@localhost playbook]# cat qingjun_all.yml
- name: 测试主机
import_playbook: qingjun_1.yml
- name: 安装阿帕奇
import_playbook: qingjun_2.yml
- name: 启动服务
import_playbook: qingjun_3.yml
- name: 停止服务 ##定义一个任务play,停止服务。
hosts: all
tasks:
- name: 停止阿帕奇
service:
name: httpd
state: stopped
5.2 导入任务文件
注意事项:
- 使用import_tasks模块时,导入时设置的when等条件语句将应用于导入的每个任务。
- 无法将循环用于import_tasks功能。
- 如果使用变量来指定要导入的文件的名称,则将无法使用主机或组清单变量。
- 推荐使用。
1.先定义3个任务文件,最后再定义playbook文件时使用import_tasks模块引用任务文件依次执行。
[root@localhost playbook]# cat qingjun_1.yml
- name: 测试主机连通性
ping:
[root@localhost playbook]# cat qingjun_2.yml
- name: 安装阿帕奇
yum:
name: httpd
state: present
[root@localhost playbook]# cat qingjun_3.yml
- name: 启动阿帕奇
service:
name: httpd
state: stopped
[root@localhost playbook]# cat qingjun_all.yml
---
- hosts: all
tasks:
- import_tasks: qingjun_1.yml
- import_tasks: qingjun_2.yml
- import_tasks: qingjun_3.yml
2.执行playbook,查看结果。
5.3 包含任务文件
- 可以使用include_tasks功能将任务文件动态导入playbook内的play中,作用与import_tasks模块一样。
- 使用include_tasks模块时,包含时设置的when等条件语句将确定任务是否包含在play中。
- 不能使用ansible-playbook --start-at-task从已包含任务文件中的任务开始执行playbook。
- 不能使用notify语句触发已包含任务文件中的处理程序名称。可以在包含整个任务文件的主playbook中触发处理程序,在这种情况下,已包含文件中的所有任务都将运行。
- 不推荐使用。
1.先定义3个任务文件,最后再定义playbook文件时使用inport_tasks模块引用任务文件依次执行。
[root@localhost playbook]# cat qingjun_1.yml
- name: 测试主机连通性
ping:
[root@localhost playbook]# cat qingjun_2.yml
- name: 安装阿帕奇
yum:
name: httpd
state: present
[root@localhost playbook]# cat qingjun_3.yml
- name: 启动阿帕奇
service:
name: httpd
state: started
2.执行playbook,查看结果。
3.使用ansible-playbook --list-tasks可以列出任务。当使用import_tasks模块时只列出已导入文件中定义的各个任务名称;当使用imclude_tasks模块时只会列出playbook中引入的导入任务文件的任务。
5.4 结合变量
- 结合变量可以重复使用playbook,而不需要频繁修改文件。
1.在playbook文件里定义变量,在任务文件里引用变量。
[root@localhost playbook]# cat qingjun_2.yml
- name: 安装{{ page_name }}
yum:
name: "{{ page_name }}"
state: present
[root@localhost playbook]# cat qingjun_3.yml
- name: 启动{{ service_name }}
service:
name: "{{ service_name }}"
state: started
[root@localhost playbook]# cat qingjun_all.yml
---
- hosts: all
vars:
page_name: postfix
service_name: postfix
tasks:
- import_tasks: qingjun_2.yml
- import_tasks: qingjun_3.yml
2.执行playbook,受控机查看postfix服务状态验证。
3.第二种写法,playbook+引入任务文件配合使用。
[root@localhost playbook]# cat qingjun_4.yaml
---
- hosts: all
gather_facts: no
vars:
page_name: postfix
service_name: postfix
tasks:
- name: import tasks install
import_tasks: qingjun_2.yml
- name: import tasks service
import_tasks: qingjun_3.yml