Ansible—剧本
剧本playbook
playbook是由一个或多个“play”组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏
YAML简介
YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者
YAML Ain't Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)
基本格式:
- --- :表示一个档案
- ... :表示档案结尾
- # :注释
- : :分割k/v(键/值)
- 缩进必须是统一的,不能空格和tab混用,一般习惯建议2个空格缩进
- 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
- k/v(键/值)的值均需大小写敏感
- v(值)可以是字符串,也可以是嵌套另一个列表
- 文件的后缀通常为yml或yaml
- - :列表
- Dictionary:字典由多个key与value构成
组成playbook的核心元素
1、主机列表:Hosts
playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中。
remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户
--- - hosts: all remote_user: root tasks: - name: see hostname command: hostname
2、任务集:Tasks和action
play的主体部分是task list。task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在运行自下而下某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在更正playbook后重新执行一次即可
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致
每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出
格式:module: arguments ,但是command模块和shell模块后直接写命令
--- - hosts: websrvs
remote_user: root
tasks: #任务 - name: install httpd package #action yum: name=httpd #调用yum模块,并向yum模块传递name=httpd的参数 - name: copy configuration file for httpd copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf - name: start httpd service service: name=httpd state=started
如果命令或脚本的退出码不为零,使用 ignore_errors:True 来忽略错误信息
3、变量:Variables
变量名:仅能由字母、数字和下划线组成,且只能以字母开头
变量:facts,setup模块到主机上收集的所有信息保存为变量,可以直接引用,列如 ansible_fqdn 变量用来保存主机名
[root@centos6 /]#ansible all -m setup |grep ansible_fqdn
"ansible_fqdn": "localhost.localdomain",
"ansible_fqdn": "localhost.localdomain",
"ansible_fqdn": "centos6",
"ansible_fqdn": "centos.miaosen",
自定义变量赋值:
3.1.命令行直接赋值
ansible-playbook -e 'var=value'
3.2.在playbook中定义变量
vars:
- varname: value
3.3.在主机清单中定义变量
主机变量,直接在主机后定义,只对定义主机有效,优先级高于公共变量
host var=value
公共变量,对主机组内所有主机有效
[groupname:vars] 为指定主机组自定义变量,vars为关键字
varname=value
3.4.roles中变量在 ansible/roles/object/vars/main.yml 文件中直接定义
var:value
var2:value2
3.5.在.yml文件中直接定义,使用vars_files 关键字引用,例如:
# vim vars.yml var1: httpd var2: vstfpd # vim testvar.yml --- - hosts: all remote_user: root vars_files: - vars.yml tasks: - name: install package yum: name={{ var1 }} state=present - name: create file file: name=/data/{{ var2 }}.log state=touch
变量引用:命令行中定义的变量优先级最高
{{ varname }}
--- - hosts: websrvs remote_user: root vars: - package_name: httpd tasks: - name: install httpd package yum: name={{ package_name }} - name: copy configuration file for httpd copy: src=files/httpd.conf dest=/etc/httpd/conf/httpd.conf - name: start httpd service service: name={{ package_name }} state=started
4、模板:Templates
我们为了对不同配置的主机配置不同的配置,我们不可能每次都要修改配置文件,所有就出现了模板技术,这样我们只要定义好一份模板,以后推送配置文件时会自动将配置文件模板中的变量替换为目标主机的参数
templates功能:根据模块文件动态生成对应的配置文件,ansible中模板使用jinja2语言编写
要求:
- templates文件必须存放于templates目录下且命名为 .j2 结尾
- yaml/yml 文件需和templates目录平级
- 在playbook中使用template关键字调用模板
[root@centos6 ansible]# vim templates/httpd.conf.j2 ServerRoot "/etc/httpd" Listen 80 Include conf.modules.d/*.conf User apache Group apache ServerAdmin root@localhost ServerName {{ ansible_fqdn }}:80
[root@centos6 ansible]# vim temp_httpd.yml --- - hosts: all remote_user: root vars: - package_name: httpd - service_name: httpd tasks: - name: install package yum: name={{ package_name }} - name: copy config file template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf notify: restart service - name: start service service: name={{ service_name }} state=started handlers: - name: restart service service: name={{ service_name }} state=started
[root@centos6 /etc/ansible]#tree
.
├── *****
├── *****
├── *****
├── *****
├── temp_httpd.yml
└── templates
└── httpd.conf.j2
2 directories, 5 files
ansible_fqdn 变量代表主机名,是setup模块返回的变量,可以直接使用
5、触发器:Handlers和notify
Handlers是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作;
notify这个action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。
--- - hosts: websrvs
remote_user: root tasks: - name: install httpd package yum: name=httpd - name: copy configuration file for httpd copy: src=files/httpd.conf dest=/etc/httpd/conf/httpd.conf notify: restart service - name: start httpd service service: name=httpd state=started handlers: - name: restart service service: name=httpd state=restarted
当copy的配置文件发生改变时则执行重启服务的功能,这是必须的
6、标签:Tags
为action打上一个标签,可以使用ansible-playbook -t 来指定标签名,用来只执行单个action
--- - hosts: websrvs
remote_user: root tasks: - name: install httpd package yum: name=httpd - name: copy configuration file for httpd copy: src=files/httpd.conf dest=/etc/httpd/conf/httpd.conf tags: put_config_file - name: start httpd service service: name=httpd state=started tags: start_service
使用 ansible-playbook --list-tags httpd.yml 命令查看playbook中的标签