六、Playbook基本使用
6.1 Playbook介绍
ansbile-playbook是一系列ansible命令的集合,利用yaml语言编写。playbook命令根据自上而下的顺序依次执行。同时,playbok开创了很多特性,它可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容并附为变量,然后在另一台机器中使用,这使得你可以实现一些复杂的部署机制,这是Ansible adhoc是无法实现的。
adhoc与Playbook的区别?
adhoc是通过命令的方式执行ansible的任务,它一次只能执行一个任务,并且不能处理复杂的逻辑,如判断、循环。而playbook则是通过事先编写好的yaml文件来执行任务,它可以一次执行多个任务,并且可以对任务进行复杂的处理。简单的说,adhco与playbook的关系就像,Linux命令与shell脚本的关系。
6.2 YAML文件
6.2.1 YAML介绍
YAML是专门用来写配置文件的语言,非常简洁和强大,远比JSON格式方便。YAML 语言的设计目标,就是方便人类读写。
YAML Ain't Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。它的基本语法规则如下:
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- #表示注释,从#号一直到行尾。
6.2.2 YAML数据类型
- 纯量:纯量是最基本的,不可再分的值,包括
- 字符串
- 布尔值
- 整数
- 浮点数
- Null
- 时间
- 日期
boolean:
- TRUE #true,True都可以
- FALSE #false,False都可以
float:
- 3.14
- 6.8523015e+5 #可以使用科学计数法
int:
- 123
- 0b1010_0111_0100_1010_1110 #二进制表示
null:
nodeName: 'node'
parent: ~ #使用~表示null
string:
- 哈哈
- 'Hello world' #可以使用双引号或者单引号包裹特殊字符
- newline
newline2 #字符串可以拆成多行,每一行会被转化成一个空格
date:
- 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime:
- 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
- 数组:一组数据有序的排列,类似于python的列表。用
-
表示数组中的一个元素。
names:
- zhangsan
- lisi
- wangwu
也可以写成python风格
names: ['zhangsan','lisi','wangwu']
- 对象:键和对的集合,用
:
分割键和对,类似于python的字典。
user1:
name: zhangsan
age: 25
sex: man
也可以写成python风格。
user1: {'name': 'zhangsan','age': 25,'sex': 'man'}
- 嵌套结构:对象和数组嵌套使用。
users:
- zhangsan:
uid: 2000
home: /home/zhangsan
shell: /bin/bash
- lisi:
uid: 2001
home: /home/lisi
shell: /sbin/nologin
- wangwu:
uid: 2002
home: /home/wangwu
shell: /bin/bash
也可以写成python风格。
users: ['zhangsan': {'uid': 2000,'home': '/home/zhangsan','shell': '/bin/bash'},
'lisi': {'uid': 2001,'home': '/home/lisi','shell': '/sbin/nologin'},
'wangwu': {'uid': 2002,'home': '/home/wangwu','shell': '/bin/bash'}]
6.3 Playbook结构
playbook是由一个或多个play
组成的列表。play的主要功能就是对一组主机应用play中定义好的task。从根本上来讲一个task就是对ansible一个module的调用。而将多个play按照一定的顺序组织到一个playbook中,我们称之为编排。
playbook主要有以下四部分构成:
- Target section:用于定义将要执行playbook的远程主机组及远程主机组上的用户,还包括定义通过什么样的方式连接远程主机 (默认ssh)
- Variable section:定义playbook运行时需要使用的变量
- Task section:定义将要在远程主机上执行的任务列表
- Handler section:定义task执行完成以后需要调用的任务
大概结构如下:
- name: play1 # play的描述
hosts: webservers # Target section
vars: # Variable section
var xxx
tasks: # Task section
task xxx
handlers: # Handler section
handlers xxx
- name: play2 # 一个playbook可以写多个play
hosts: dbservers
vars:
var xxx
tasks:
task xxx
handlers:
handlers xxx
6.3.1 Target section
在目标区域,我们可以通过hosts
定义该play
在哪些主机和主机组中执行,选择主机与组的方法与adhoc
一致。
- name: install package
hosts: dbservers,node1
tasks:
- name: install httpd
yum:
name: httpd
state: present
我们也可以指定远程的用户、以及远程的方式和端口,ansible.cfg中的配置均可在此定义,如指定远程的用户为root。
- name: install package
hosts: dbservers,node1
remote_user: root
tasks:
- name: install httpd
yum:
name: httpd
state: present
6.3.2 Variable section
在变量区域,我们可以使用两种方式定义变量,当然,ansible还有更多的方法定义变量,我们后边再讲。
- vars:直接在playbook中定义变量
- name: test play
hosts: all
vars:
username: root
password: 123456
- vars_files:使用变量文件,需要注意变量文件也要是yaml文件格式
[root@master ansible]# cat userinfo.yml
username: root
password: 123456
调用变量文件
- name: test play
hosts: all
vars_files:
- userinfo.yml
6.3.3 Task section
任务区域是play
的主体部分,他必须是一个任务列表,任务列表中的各任务按次序逐个在hosts中指定的所有主机上执行,在所有主机上完成第一个任务后再开始第二个。在自上而下运行某playbook时,如果中途发生错误,则整个playbook会停止执行,由于playbook的幂等性,playbook可以被反复执行,所以即使发生了错误,在修复错误后,再执行一次即可。
执行多个任务
httpd
hosts: all
tasks:
- name: install httpd
yum:
name: httpd
state: present
- name: start and enabled httpd
systemd:
name: httpd
state: started
enabled: yes
当有task执行过程中报错,整个playbook会立即停止运行,如果我们不想让错误终止playbook运行,我们可以在task中加入ignore_errors: yes
来忽略报错。
- name: install httpd
hosts: all
tasks:
- name: skip error
shell: ls /var/www/html/index.html
ignore_errors: yes
- name: install httpd
yum:
name: httpd
state: present
6.3.4 Handler section
在Ansible Playbook中,handler
事实上也是个task
,只不过这个task
默认并不执行,只有在被触发时才执行。handler
通过notify
来监视某个或者某几个task
,一但task执行成功,则触发handler执行相应操作。
handler会在所有的play都执行完毕之后才会执行,这样可以避免当handler监视的多个task执行结果都发生了变化之后而导致handler的重复执行 (handler只需要在最后执行一次即可)
- name: install httpd
hosts: all
tasks:
- name: install httpd
yum:
name: httpd
state: present
notify: get_status
handlers:
- name: get_status
debug:
msg: "This is handlers"
注意:handlers的name必须和notify定义的名称一致才行。
6.4 ansible-playbook常用选项
-
打印详细信息
- -v:打印任务运行结果
- -vv:打印任务运行结果以及任务的配置信息
- -vvv:包含了远程连接的一些信息
- -vvvv:v越多,输出的信息越详细,最多4个v
-
playbook语法检测
ansible-playbook --syntax-check test.yml
- 测试运行playbook
ansible-playbook -C test.yml
测试运行,不会真的运行,可以用来检测playbook。
标签:基本,httpd,task,name,section,playbook,使用,home,Playbook From: https://www.cnblogs.com/xxth/p/17899603.html