优势特点:
1)实现自动化功能更加全面
2)可以更好的控制逻辑关系
3)剧本展现命令语法更直观
4)拥有持久反复执行的特性
剧本作用:
管理多个主机,完成多个任务操作
剧本编写规范:
1)使用空格:
每个两个空格表示一个层级,剧本中拥有缩进关系
2)使用冒号 :
指定具体参数的信息 →→ name:(空)说明信息
冒号后面需要有空格信息,但是如果冒号后面没有内容,冒号后不再需要空格
3)短横线
添加多个项目列表
构成列表需要加上短横线,后面需要加上一个空格
模式:
-hosts
tasks:
- name
1.playbook
简介:playbook是ansible中的一个术语,它指的是用于配置管理的脚本。
1.1 YAML格式的playbook
ansible的playbook是使用YAML语法编写的,YAML是一种类似于json的文件格式,不过YAML更适合人来读写。
1.2 文件起始
YAML文件以三个减号开头用于标记文档的开始
---
不过。如果往日在playbook文件开头键入三个减号,并不会影响ansible的运行
1.3 注释
注释以井号开始一直到本行结束,这与shell、Python以及ruby是一样的。
示例
This is a YAML comment
1.4 字符串
一般而言。YAML字符串不需要使用引号引起来。加上引号也是没有问题的。即便字符串中含有空格,也是不需要引号的。
this is YAML comment
等价于json格式为:
“this is YAML comment”
当然在ansible中有几种情况也是比较特殊的,需要对字符串使用引号。
1.5 布尔型
YAML具有内置的布尔类型,并且提供了很多种释义为true和false的字符串。在ansible playbook中使用True和False的占大多数,所以我们在“是”“否”中使用True和False就就可以。
示例
YAML中的布尔型
True
等同于json格式的
true
1.6 列表
YAML中的列表就好像JSON中的数组或者Python中的列表。严格的来说,在YAML中它应该被叫做序列。但为了和官方文件保持一致,我们还是成为列表。
列表使用减号“-”作为定界符
- My fair lady
- ok
- the is
等价于JSON格式为:
{
"My fair lady",
"ol",
"the is"
}
1.7 为什么在有的地方使用True,而其他地方又使用Yes**
如何在playbook中表示“是”和“否”这一点上ansible是非常灵活的。严格来说,模块参数(例如,update_cache=yes)的处理方式不同于playbook中其他地方的值(例如,sudo:True )。这是因为其他地方有YAML解析器来处理,所以只能说用YAML的真实性值得约定:
YAML“是”值
true True TRUE yes Yes YES on On ON y Y
YAML“否”值
false False FALSE no No NO off Off OFF n N
模块参数是作为字符串传递的,因此 使用ansible的内置约定:
模块参数为“真”
yes on 1 true
模块参数为“假”
no off 0 false
应该倾向于遵从ansible官方文档的示例,向模块传递参数是使用yes和no(这是因为为了保持和模块官方文档一致),而playbook中其他地方使用了True和False
1.8 主机/主机组名称如何定义
1)all: 清单里面的所有主机都进行管理
2)主机组名称: 清单里面指定主机组中的主机进行管理
3)主机名称/ip地址:清单里面指定的单个主机
4)localhost 只管理自己
2.0 剧本编写
2.1 参数:
play:角色,定义的是主机信息
- hosts:all #处理所有服务器,找到所有服务器 - (空)hosts:(空)
tasks: #剧本所要干的事情 (空)(空)tasks:
- name: #注释名称 (空)(空)(空)(空)-(空)name:(空)
file: #模块名称 (空)(空)(空)(空)(空)(空)file: (空)
remote_user: root #以什么身份管理主机 (空)(空)
{{ }}:填写变量信息
stdout_lines:标准输出,优化了下格式
vars:在剧本中定义变量
--extra-vars=EXTRA_VARS:在命令行定义变量
register:注册变量
--syntax-check 进行剧本配置信息语法检查
-C:模拟剧本执行(彩排)
ignore_errors: yes #忽略错误,剧本先整体执行,忽略部分操作错误
简单剧本格式
PS:就是不断的堆积模块信息,但是一般需要加上注释 ,一个name信息下面只能写一个任务内容
2.2 剧本执行过程
1)先对剧本语法进行检查
ansible-playbook --syntax-check test01.yml
2)先对剧本进行模拟执行
第一步:定义主机信息
第二部:收集主机信息
第三部:执行具体任务
第四部:执行结果
3)真实执行剧本
4)进行检查确认
3. ansible-playbook定义变量的方法
意义:重复信息设置变量方便调用调整
定义变量的方法说明:
1)在ansible程序剧本中进行定义 (次优先)
vars:
file_name: file_var.txt
2)利用执行参数赋值变量 (最优先)
--extra-vars=EXTRA_VARS=file_name=oldboy.txt
#格式
ansible-playbook --extra-vars=file_name=file_ext.txt test03.yml
#简写格式
ansible-playbook -e file_name=file_ext.txt test03.yml
3)在ansible程序主机清单中定义 (最后执行)
[server:vars] file_name=oldboy.txt
[oldboy:vars]
file_name=file_host.txt
4)采用注册方式定义变量
#register
目的:让我们执行剧本的时候输出一些信息
- hosts: oldboy
tasks:
- name: bianliang
shell: hostname shell:执行命令
register: aaa 将shell命令的结果,注册授权变量aaa
- name: info
debug: msg={{ aaa.stdout_lines }} 利用debug模块,命令 msg,调用变量将变 量显示出来,stdout_lines:标准输出,优化了下格式
4. 实现剧本的循环功能
4.1 定义:
完成多件相同任务可以循环 with_items
示例
循环下载软件
- name: Installed Pkg
yum:
name: ['wget','tree','lrzsz'] #8个空格
state: present
循环创建用户
user: name={{ item.name }} groups={{ item.groups }} state=present
with_items:
- { name: 'gou1', groups: 'bin' }
- { nam e: 'gou2', groups: 'root' }
将信息放在文件里进行循环
shell: echo {{ item }} >>/oldboy.txt
with_items:
- gou1
- gou2
5. 利用标签功能,只执行剧本中指定任务
5.1 定义:
剧本完成多个任务可以灵活的执行 tags
tags:t? ?(任何数)
示例
#指定执行那个标签的任务
ansible-playbook --tags=t3,t1,t2 test07.yml
#跳过指定的标签任务
ansible-playbook --skip-tags=t3
-t t1
5.2 定义方式
1)一对一定义:一个任务对应一个标签
2)一对多定义:一个任务对应多个标签
3)多对一定义:多个任务对应一个标签
6. 忽略错误
定义:
先整体执行剧本内容,忽略部分操作错误
ignore_errors: yes
7. 触发器 handlers
handlers:触发器,剧本完成什么操作就触发相应操作
** notify: rsync restart 监控模块里的内容是否发生变化**
handlers:
- name: rsync restart
service: name=rsyncd.service state=restarted
8. ansible将多个剧本进行整合的方法:动态汇总
8.1 方法一:汇总剧本信息
- hosts: all
remore_user: root
tasks:
- include_tasks: test08.yml
- include_tasks: test07.yml
剧本中不可以存在重复的变量,
需要在执行的剧本重新编写
8.2 方法二:
ansible-playbook summary02.yml
- include: test07.yml
- include: test08.yml
8.3方法三:
ansible-playbook summary03.yml (入口文件-puppet)
- import_playbook: test07.yml
- import_playbook: test08.yml
9. ansible剧本编写错误排除思路
第一个历程:
检查剧本的语法格式
第二个历程: 对剧本错误task进行标记
a 排除标记的操作, 检查是否还有其他问题
b 重新执行标记任务
第三个历程: 利用模块方式执行操作
单独对一个远程主机进行测试操作
第四个历程: 将模块中的操作在远程主机上直接运行
将模块中的操作转换成命令, 在远程主机测试
setenforce 0 无法反复
第五个历程: 将一些不是很验证问题,进行忽略
10 综合架构批量管理(roles角色)
概念:将剧本中的角色和任务进行拆分,让批量管理更加灵活
角色文件编写应用:可以应用在大规模环境中应用
10. 1 编写角色剧本信息:
将原有剧本中所有信息进行拆分细化
细化之后需要创建不同的目录进行管理不同的数据信息
10.2 目录结构
site.yml:任务服务目录:定义角色名称
合并文件目录- hosts: backup #主机信息
remote_user: root #以什么身份运行
roles: #需要的动作
handlers:任务触发目录:用于存放文件 ;至少应该包含一个名为main.yml的文件,其他的文件需要在此文件中通过include进行包含
tasks:任务文件目录:具体信息任务存放
main.yml 用于存放整合的目录
- include_tasks: directory.yml
- include_tasks: directory01.yml
templates:任务模板目录:模板文件存放 ;查找所需要模块文件的目录
vars:任务变量目录:具体变量文件存放 ;定义的是变量,至少应该包含一个名为main.yml的文件,其他的文件需要在此文件中通过include进行包含;
files:任务文件目录:用于存放原文件配置文件 ;存放copy或script模块等调用的文件
批量创建所需要的目录
mkdir {nfs,rsync,web,sersync}/{vars,tasks,templates,handlers,files}/
10.3 角色设置变量的方法
1)在相应角色信息vars目录中的main.yml中定义变量信息 (最先执行)
nfs: oldboy123 (以这种形式书写在文件中)
2)在相应的roles目录(角色目录)中创建group_vars:作为变量目录 (次优先)
vim all (会跟/etc/ansible/hosts文件进行匹配)使用hosts模块进行定义文件名称
backup: woaini (变量名称):(变量内容)
10.4 执行过程ansible-playbook site.yml
1)先加载site文件
2)加载目录文件(tasks)下的main.yml文件
3)如果main.yml文件中有变量会先到vars中寻找变量
4)如果vars中没有变量,就回到roles目录下寻找group_vars下寻找有没有该主机组的 变量
标签:name,YAML,ansible,playbook,剧本,yml
From: https://www.cnblogs.com/megshuai/p/18489140