大家好,我是早九晚十二,目前是做运维相关的工作。写博客是为了积累,希望大家一起进步!
play-book的介绍
play-book是由一个或者多个play组成的列表。play的主要功能是将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上讲,所谓task无非是调用ansible的一个moudle。将多个play组织在一个playbook里,即可以让它们连同起来按照事先编排的机制同唱一台大戏。
playbook采用的是YAML语言编写,后缀可以使yml也可以yaml
play-book 的执行顺序
YAML的介绍
YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XMLC语言、
Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另
外Ingy dot Net与Oren Ben-Kiki也是这语言的共同设计者YAML Ain't Markup Language,即
YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是 :
"Yet Another Markup Language"( 仍是一种标记语言 )
特性
YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML可以基于流来处理
YAML表达能力强,扩展性好
YAML官方网站:http://www.yaml.org
语法简介(YAML)
以以下剧本为例
---
- hosts: all
remote_user: root
gather_facts: false
become: yes
tasks:
- name: copy test
copy:
src: "{
{item.src}}"
dest: "{
{item.dest}}"
owner: root
group: root
mode: 0755
with_items:
- {
src: "/root/ansible/hostname.sh",dest: "/tmp"}
...
语法介绍
- 在单一档案中,可以用三个连字号(---)区分多个档案,另外还有选择性的联系三个点号(...)结尾
- 次行开始正常写playbook的内容,一般建议写明该playbook的功能
- 使用#做注释
- 缩进必须是统一的,不能tab和空格混用
- 缩进的级别也必须一致,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进和换行实现的
- YAML文件内容和Linux系统大小写判断方式一致:即区分大小写,k/v的值均需大小写敏感
- k/v的值也可同行也可换行,同行用:分隔
- v可以是字符串,也可以是另一个列表
- 一个完整的代码块功能最小需要包括name和task
- 一个name只能包含一个task
- YAML文件扩展名通常为yml或者yaml
元素介绍
- List:列表,其所有元素均使用“-”打头,如
- name: copy test
- hosts: all
- Dictionary:字典,通常由多个key与value组成,如:
src: "{ {item.src}}"
dest: "{ {item.dest}}"
注意,yaml的语法和其他高阶语言类似,可以简单的表达清单,散列表,标量等数据结构。其结构通过空格来展示,序列里的项用“-”代表,map里的键值用“:”分隔。
playbook的核心元素
元素 | 介绍 |
---|---|
Hosts | 执行任务的远程主机列表 |
Tasks | 任务集 |
Varniables | 内置变量或者自定义变量,在playbook中调用 |
Templates | 模板,可替换模板文件中的变量并实现一些简单的逻辑 |
Handlers和notity | 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行 |
tags | 标签,指定某条任务执行,由于选择运行playbook的部分代码。ansible具有幂等性,因此会跳过没有变化的部分,即使如此,有些代码未测试其确实没有发生变化的时间依然会非常的长。此时,如果确认没有发生变化,就可以用tags跳过。执行方法:ansible-playbook -t tagsname test.yml |
Hosts
playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,必须先定义在主机清单中。
可能是如下形式:
test.example.com
test1.exxample.com:test2.example.com
192.168.1.1
192.168.*.*
test:test1 两个组并集
test:&test1 两个组交集
test:!test1 在test,但是不在test1
示例:- hosts: test:test1
remote_user
可用于host和task中,也可以通过指定其通过sudo的方式在远程主机上执行任务,可用于play全局或者某任务。此外,甚至也可以在sudo时使用sudo_user指定sudo时切换的用户。
- hosts: all
remote_user: root
sudo: yes #默认sudo为root
sudo_user: haha #sudo为haha
tasks
任务列表,格式包含以下两种
action:module arguments
module:arguments #建议使用
某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers。也可以通过“tags”打标签,而后可在ansible-playbook命令上使用-t指定进行调用。
执行问题忽略
如果playbook中命令或者脚本的退出码不为0,可以使用如下方式替代
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand||/bin/true
或者使用ignore_errors
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand
ignore_errors: True
playbook的常用选项
运行playbook的方式
ansible-playbook <filename.yml> ... [options]
常见选项
选项 | 含义 |
---|---|
--check | 只检测可能会发生的改变,但不真正执行操作 |
--list-hosts | 列出运行任务的主机 |
--limit | 主机列表,只针对主机列表中的主机执行 |
-v | 显示过程,-vv,-vvv更详细 |
--check | 只检测可能会发生的改变,但不真正执行操作 |
[root@master ansible]# ansible-playbook copy.yml --list-hosts
playbook: copy.yml
play #1 (all): all TAGS: []
pattern: [u'all']
hosts (1):
192.168.1.1
[root@master ansible]# ansible-playbook copy.yml --list-tasks
playbook: copy.yml
play #1 (all): all TAGS: []
tasks:
copy test TAGS: []
playbook中可以指定相对路径,相对路径的默认目录在/root/.ansible中