目录
编写playbook
一,Ansible playbook
临时命令可以作为一次性对一组主机运行简单的任务。不过,若要真正发挥Ansible的力量,需要了解如何使用playbook可以轻松重复的方式对一组主机执行多项复杂的任务。
play是针对对清单中选定的主机运行一组有序任务。playbook是一个文本文件,其中包含有一个或者多个按特定顺序运行的play组成的列表。
play可以让您将一系列冗长而复杂的手动管理任务转变为可轻松重复的例程,并且具有可预测的成果。在playbook中,您可以将play内的任务序列保存为人类可读并可立即运行的形式。根据任务的编写方式,任务本身记录了部署应用或者架构所需的步骤。
二,yaml 标记语言
YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者,目前很多软件中采有此格式的文件,如:ubuntu,anisble,docker,k8s等 YAML:YAML Ain’t Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)
YAML 语言特性
- YAML的可读性好
- YAML和脚本语言的交互性好
- YAML使用实现语言的数据类型
- YAML有一个一致的信息模型
- YAML易于实现
- YAML可以基于流来处理
- YAML表达能力强,扩展性好
1,YAML的三种数据结构
对象: 键值对的集合,又称为映射、哈希、字典
数组: 一组按次序排列的值,又称为序列/列表
纯量: 单个的、不可再分的值
对象:
(1)yaml语法
Key:value
Key1:value1
key:
key1: vaule1
key2: vaule2
(2)流式风格语法
是指用花括号包裹,逗号加空格分割的写法,和json类似
key: {key1: value1,key2: value2}
(3)JSON
"key":"value"
"key":"{"key1":"value1","key2":"value2"}
数组:
key:
- value1
- value2
或者:
key:[value1,value2]
纯量:
字符串
布尔值
整数
浮点数
时间
日期
NULL
Int: 12
Float: 12.3
String: pets
Bool: TRUE
冒号后面有一个空格,杠后面也有一个空格;
布尔值,空值,数值不用加双引号
2,YAML语法格式
- name:
- 在单一文件第一行,用连续三个连字号“-” 开始,还有选择性的连续三个点号( … )用来表示文件的结尾
- 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
- 使用#号注释代码
- 缩进必须是统一的,不能空格和tab混用 (以空格的缩进来控制层级关系只要是左对齐的一列数据,都是同一个层级的,)
- 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
YAML文件内容是区别大小写的,key/value的值均需大小写敏感
- 多个key/value可同行写也可换行写,同行使用,分隔
- v可是个字符串,也可是另一个列表
- 一个完整的代码块功能需最少元素需包括 name 和 tasks
- 一个name只能包括一个task
- YAML文件扩展名通常为yml或yaml
注:
play中的第一行开头是以破折号开头加空格(表示play列表中的第一项),而后是第一个键,即name属性。
name这标识该play的用途。name键是可选的,但建议使用它,因为它有助于记录您的playbook。这在playbook中包含多个play时特别有用。
hosts,它指定对其运行play中的任务的主机。与用于ansible命令的参数相似,hosts属性将主机模式取为值,如清单中受管主机或组的名称。
tasks属性,其值指定要为该play运行的任务的列表。
案例1
(1)创建目录/day04/playbook ,并切换到当前目录下面
[root@server playbook]# pwd
在当前目录下面编译ansible.cfg文件
[root@server playbook]# vim ansible.cfg
[defaults]
inventory=./inventory
编辑inventory文件
[root@server playbook]# vim inventory
[test1]
node1
[test2]
node2
(2)编辑剧本文件playbook.yml
[root@server playbook]# vim playbook.yml
---
- name: play1
hosts: all
tasks:
- name: 创建文件new1
file:
path: /new1
state: touch
mode: 644
owner: root
group: root
- name: 创建用户lisi,指定uid为1111
user:
name: lisi
uid: 1111
- name: 编辑文件new1内容
copy:
dest: /new1
content: "this is file\n"
...
(3)检测剧本文件是否有语法错误
[root@server playbook]# ansible-playbook --syntax-check playbook.yml
(4)空执行,假设执行,并不会在受控主机上真正运行
[root@server playbook]# ansible-playbook -C playbook.yml
(5)执行剧本playbbook.yml
[root@server playbook]# ansible-playbook playbook.yml
(6)在node1主机上查看剧本创建的文件new1
[root@node1 ~]# ls -l /new1
[root@node1 ~]# cat /new1
(7)在node2主机上查看剧本创建的文件new1
[root@node2 ~]# ll /new1
[root@node2 ~]# cat /new1
三,playbook结果语法检测
-v 显示任务结果 |
-vv 任务结果和任务配置 |
-vvv 包含有关受管主机的连接信息 |
-vvvv 增加了连接插件相关的额外详细程度选项,包含受管主机上用与执行脚本的用户以及所有执行的脚本 |
--syntax-check 用于检验playbook语法是否有问题 |
-C 执行空运算 可以检测将会发生什么更改但是并没有对受管主机进行实际更改 |
--list-tasks 查看playbook中的任务 |
1,--syntax-check 用于检验playbook语法是否有问题
检测剧本文件是否有语法错误
[root@server playbook]# ansible-playbook --syntax-check playbook.yml
2,-C 执行空运算 可以检测将会发生什么更改但是并没有对受管主机进行实际更改
空执行,假设执行,并不会在受控主机上真正运行
[root@server playbook]# ansible-playbook -C playbook.yml
3,--list-tasks 查看playbook中的任务
查看剧本中的任务
[root@server playbook]# ansible-playbook --list-tasks playbook.yml
案例2
通过剧本在受控端主机上完成以下操作
web服务
1,配置yum源,安装对应的服务软件 http
2,ip通过自定义端口访问网站内容/www
3,创建资源文件
4,重启服务
5,防火墙
6,selinux
7,测试
1,在当前用户的家目录下面编辑隐藏文件.vimrc;定义tab键的缩进;
(全局生效在/etc/vimrc最后面编辑)
自动命令,文件类型为yaml 设置长度,宽度,结束
autocmd FileType yaml setlocal ai ts=2 dw=2 et
2,在控制端主机server上创建控制文件
[root@server playbook]# vim httpd.conf
Listen 8909
<Directory /www>
AllowOverride none
Require all granted
</Directory>
<VirtualHost *:8909>
DocumentRoot /www
</VirtualHost>
3,创建剧本文件web.yml
---
- name: configure web server
hosts: test1,test2
tasks:
- name: 挂载
mount:
src: /dev/sr0
path: /mnt
fstype: iso9660
state: mounted
- name: Base-yum源配置
yum_repository:
name: BaseOS
description: RHEL8-BaseOS
baseurl: file:///mnt/BaseOS
gpgcheck: no
file: BaseOS
- name: App-yum源配置
yum_repository:
name: AppStream
description: RHEL8-AppStream
baseurl: file:///mnt/AppStream
gpgcheck: no
file: AppStream
- name: 安装httpd
dnf:
name: httpd
state: installed
- name: 创建配置文件
copy:
src: /day04/playbook/httpd.conf
dest: /etc/httpd/conf.d/vhosts.conf
- name: 创建目录
file:
path: /www
state: directory
- name: 网页文件
copy:
dest: /www/index.html
content: "everything will be ok\n"
- name: 启动防火墙
service:
name: firewalld
state: restarted
enabled: yes
- name: 配置防火墙
firewalld:
port: 8909/tcp
permanent: yes
immediate: yes
state: enabled
- name: 开启selinux
selinux:
state: enforcing
policy: targeted
- name: 配置selinux的端口
seport:
ports: 8909
proto: tcp
setype: http_port_t
state: present
- name: selinux文件的标签
sefcontext:
target: '/www(/.*)?'
setype: httpd_sys_content_t
state: present
- name: 重启服务
service:
name: httpd
state: restarted
enabled: yes
- name: 测试web界面
hosts: node1
tasks:
- name: 测试node1主机
uri:
url: http://192.168.206.111:8909
return_content: yes
- name: 测试node2主机
uri:
url: http://192.168.206.222:8909
return_content: yes
4,检查语法是否有错:
[root@server playbook]# ansible-playbook --syntax-check web.yml
5,执行剧本:
[root@server playbook]# ansible-playbook web.yml
四,yaml注释
#this is YAML (顶格开始写注释,#后直接加内容)
Same data # This is also a YAML comment (内容后写注释,#加空格加内容)
五,yaml字符串 和多行字符串表示方式
(1)单行字符串中间有空格可以不放在引号中。字符串也可以通过单引号或者双引号括起来
(2)编写多行换行操作可以通过|竖线保留字符串中的换行符
(3) >表示换行字符转换成空格并且行内的引导空白将被删除。这种方法通常用于将很长的字符串在空格字符处断行,使他们跨占多行来提高可读性。
“|” 保留内容中换行符 | |
[student@localhost ~]$ cat /etc/host1 192.168.100.111 server.example.com server | |
“>” 将换行符转换为空格字符一行显示 | |
[student@localhost ~]$ cat /etc/host1 192.168.100.111 server.example.com server |
重要:
只有空格字符作为缩进不能用制表符,如果您使用vi编辑器可以在$HOME/.vimrc文件中添加一下行以便更轻松的编辑playbook,以下配置实现的是在按下Tab键是执行一个双空格缩进,并在换行后自动缩进后续行。
自动命令,文件类型为yaml 设置长度,宽度,结束
autocmd FileType yaml setlocal ai ts=2 dw=2 et
1,“|” 保留内容中换行符
(1)编辑剧本,在content后面使用符号 |
- name: 网页文件
copy:
dest: /www/index.html
content: |
this is line1
this is line2
this is line3
(2)访问网页
[root@node1 ~]# curl http://192.168.206.111:8909
2,“>” 将换行符转换为空格字符一行显示
(1)编辑剧本,在content后面使用符号 >
- name: 网页文件
copy:
dest: /www/index.html
content: >
this is line1
this is line2
this is line3
(2)访问网页
[root@node1 ~]# curl http://192.168.206.111:8909