playbook介绍
playbook是由一个或多个”play”组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来将,所谓的task无法是调用ansible的一个module。将多个play组织在一个playbook中,即可以让他们联通起来按事先编排的机制同唱一台大戏。
playbook-->play-->task-->module
role
Playbook是Ansible的配置,部署,编排语言。他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合。
当执行一些简单的改动时ansible命令是非常有用的,然而它真的作用在于它的脚本能力。当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。
Playbook还开创了很多特性,它可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容并附为变量,然后在另一台机器中使用,这使得你可以实现一些复杂的部署机制,这是ansible命令无法实现的。
在如右的连接中: https://github.com/ansible/ansible-examples,有一些整套的playbooks,它们阐明了上述的这些技巧。
YAML介绍
Ansible使用标准的YAML解析器,使用YAML文件语法即可书写playbook。
YAML是一个可读性高的用来表达资料序列的格式,YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001首次发表了这种语言。
YAML Ain’t Makup Language,即YAML不是XML。不过,在开发这种语言时,YAML的意思是:Yet Another Makrup Language(仍是一种标记语言),其特性:YAML的可读性好、YAML和脚本的交互性好、YAML有一个一致的信息模型、YAML易于实现、 YAML可以基于流来处理、YAML表达能力强,扩展性好。更多的内容及规范参见www.yaml.org。
GNU GNU IS NOT UNIX
LINUX linus's mix
核心元素:
Playbooks
Variables #变量元素,可传递给Tasks/Templates使用;
Tasks #任务元素,由模块定义的操作的列表,即调用模块完成任务;
Templates #模板元素,使用了模板语法的文本文件,可根据变量动态生成配置文件;
Handlers #处理器元素,通常指在某事件满足时触发的操作;
Roles #角色元素
playbook的基础组件:
name
定义playbook或者task的名称
hosts
playbook中的每一个paly的目的都是为了让某个或某些以某个指定用户的身份执行任务。hosts用于指定要执行指定任务的主机,其可以是一个或多个由冒号分割主机组。与命令模式下的ansible匹配规则一样
user
remote_user则用于指定远程主机上的执行任务的用户,也可以使用user
tasks
任务列表
play的主体部分是task list. task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。
vars
定义变量
vars_files
定义变量文件
notify
任务执行结果如果是发生更改了的则触发定义在handler的任务执行
handlers
用于当前关注的资源发生变化时采取一定指定的操作
include
能包含的包括task,handler和playbook
可以在include的时候传递变量
示例1:简单playbook
文档以---开头,没有也可以
[root@master ~]# cd /etc/ansible/
[root@master ansible]# vim test.yml //固定后缀为yml
- hosts: all //特别注意-后面的空格 指定执行本play的主机组
user: root //指定运行本play的远程主机用户
tasks: - name: playbook_test //任务描述
shell: touch /tmp/playbook.txt //shell是ansible模块
tags: suibian //这是一个任务标记,可用来单独执行此任务
参数解释:
hosts参数指定了对哪些主机进行操作;
user参数指定了使用什么用户登录远程主机操作;
tasks指定了一个任务,其下面的name参数同样是对任务的描述,在执行过程中会打印出来。
tags:给指定的任务定义一个调用标识,形式如下
- name: NAME
module: arguments
tags: TAG_ID
语法检测:
[root@ansible ansible]# ansible-playbook --syntax-check test.yml
playbook: test.yml
测试运行
[root@master ansible]#ansible-playbook -C /path/to/playbook.yaml
可以使用如下参数:
--list-hosts
--list-tasks
--list-tags
运行Playbook:
[root@master ansible]# ansible-playbook test.yml
只运行指定标记的任务:-t tags
[root@ansible ansible]# ansible-playbook -t 标记名称 test.yml
跳过某一个被标记的任务:--skip-tags=SKIP_TAGS
[root@ansible ansible]# ansible-playbook --skip-tags=标记名称 test.yml
从某一个任务开始往下运行:--start-at-task 任务名称
[root@ansible ansible]# ansible-playbook --start-at-task "start httpd service" test.yml
示例2.每个playbook可以有多个play
[root@ansible ansible]# cat test.yml
hosts: all //play1
remote_user: root
tasks:name: install a group
group: name=mygrp system=truename: install a user
user: name=user1 group=mygrp system=truehosts: webservers //play2
remote_user: root
tasks:name: install httpd package
yum: name=httpdname: start httpd service
service: name=httpd state=started
示例3:使用变量
[root@ansible ansible]# cat create_user.yml
- name: create_user //剧本描述信息
hosts: web1
user: root
gather_facts: false
vars: - user: "msiyuetian"
tasks: - name: create user
user: name="{{ user }}"
参数解释:
name参数
对该playbook实现的功能做一个概述,后面执行过程中,会打印 name变量的值 ,可以省略;
gather_facts参数
指定了在以下任务部分执行前,是否先执行setup模块获取主机相关信息,这在后面的task会使用
到setup获取的信息时用到;
默认值为true,改成false之后在执行过程中就看不到以下信息:
TASK [Gathering Facts]
ok: [web1]
ok: [web3]
ok: [web2]
ok: [192.168.245.135]
vars参数
指定了变量,这里指字一个user变量,其值为test ,需要注意的是,变量值一定要用引号引住;
user
指定了调用user模块,name是user模块里的一个参数,而增加的用户名字调用了上面user变量的值。
运行playbook:
[root@master ansible]# ansible-playbook create_user.yml
示例4:条件执行
[root@master ansible]# vim when.yml
- hosts: web1
user: root
gather_facts: True
tasks:- name: use when
shell: touch /tmp/when.txt
when: ansible_hostname == "web1"
- name: use when
[root@ansible ansible]# cat when.yml
- hosts: web1
user: root
gather_facts: True
tasks: - name: use when
shell: touch /tmp/when.txt
when: ansible_all_ipv4_addresses[0] == "192.168.245.133"
只有当参数ansible_all_ipv4_addresses[0]为 192.168.245.133 时才在该机器上新建指定文件;意思就是只对 testhost 组中特定的主机进行操作,忽略组内其他的主机。可以通过setup模块查看各个参数的值
setup模块变量获取:
上面的变量:ansible_hostname和ansible_all_ipv4_addresses[0] 是从setup模块中获取
注意看
是:
"ansible_hostname": "web1"
还是:
"ansible_all_ipv4_addresses": [
"192.168.245.133"
]
如果变量值是用[]括起来的需要用[0]方式切片获取
[root@master ansible]# ansible-playbook when.yml
示例5:handlers:由特定条件触发的Tasks
调用及定义方式:
tasks:
- name: TASK_NAME
module: arguments
notify: HANDLER_NAME
handlers: - name: HANDLER_NAME
module: arguments
handlers示例1
[root@ansible ansible]# cat handlers.yml
- name: handlers test
hosts: web1
user: root
tasks: - name: test copy
copy: src=/etc/passwd dest=/tmp/handlers.txt
notify: test handlers
handlers:
- name: test handlers
shell: echo "www.qianfeng.com" >> /tmp/handlers.txt
说明:只有 copy 模块真正执行后,才会去调用下面的 handlers 相关的操作,追加内容。所以这种比较适合配置文件发生更改后,需要重启服务的操作。
[root@master ansible]# ansible-playbook handlers.yml
handlers示例2:
hosts: websrvs
remote_user: root
tasks:name: install httpd package
yum: name=httpd state=latestname: install conf file
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd servicename: start httpd service
service: name=httpd state=started
handlers:
- name: restart httpd service
service: name=httpd state=restarted
示例6:include参数
- name: create_user
hosts: web1
user: root
gather_facts: false
vars: - user: "msiyuetian"
tasks: - name: create user
user: name="{{ user }}" - include: handlers.yml //已经用下面的import_playbook代替
- import_playbook: handlers.yml
示例7:pause暂停
在playbook执行的过程中暂停一定时间或者提示用户进行某些操作
常用参数:
minutes:暂停多少分钟
seconds:暂停多少秒
prompt:打印一串信息提示用户操作
[root@ansible ansible]# cat wait.yml
- name: wait
hosts: web1
tasks: - name: wait on user input
pause: prompt="Warning! Detected slight issue. ENTER to continue CTRL-C a to quit" - name: timed wait
pause: seconds=30