一、YAML语法简介
YAML介绍:
YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、
Python、Perl以及电子邮件格式RFC2822等。
Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者
YAML特性:
YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML可以基于流来处理
YAML表达能力强,扩展性好
更多的内容及规范参见YAML的官方网站:http://www.yaml.org
YAML语法格式:
在单一档案中,可用连续三个连字号(——)区分多个档案。另外,还有选择性的连续三个点号,( … )用来表示档案结尾
次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
使用#号注释代码
缩进必须是统一的,不能空格和tab混用
缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小写的,k/v的值均需大小写敏感
k/v的值可同行写也可换行写。同行使用:分隔
v可是个字符串,也可是另一个列表
一个完整的代码块功能需最少元素需包括 name: task
一个name只能包括一个task
YAML文件扩展名通常为yml或yaml
YAML语法简介:
[列表]
List:列表,其所有元素均使用“-”打头
示例:
# A list of tasty fruits
– Apple
– Orange
– Strawberry
– Mango
[字典]
Dictionary:字典,通常由多个key与value构成
示例:
---
# An employee record
name: Example Developer
job: Developer
skill: Elite
也可以将key:value放置于{}中进行表示,用,分隔多个key:value
示例:
---
# An employee record
{ name: Example Developer, job: Developer, skill: Elite }
二、Ansible中的剧本Playbook用法
Playbook核心元素:
- Hosts:执行的远程主机列表
- Tasks:任务列表
- remote_user:远程登录用户名,作用于host和task
- Varniables:内置变量或自定义变量在playbook中调用
- Templates:模板,可替换模板文件中的变量并实现一些简单逻辑的文件
- Handlers:和notify结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
- tags:标签,指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性。
因此会自动跳过没有变化的部分。此时,如果确信其没有变化,就可以通过tags跳过此些代码片段
实例:
---
- hosts: websrvs # 主机分组
remote_user: root # 远程访问登录的用户名
tasks: # 执行任务列表
- name: install httpd # 执行任务名
yum: name=httpd # 执行任务ansible命令
- name: copy config file
copy: src=/app/httpd.conf dest=/ect/httpd/conf/ backup=yes
tags: start_httpd # 任务执行指定标签
notify: restart httpd # 触发特性条件,跳过以下命令,执行指定handlers任务
- name: start httpd
tags: start_httpd # 任务标签名
service: name=httpd state=started enabled=yes
handlers:
- name: restart httpd
service: name=httpd state=restarted
三、Playbook中变量的使用
变量名:仅能由字母、数字和下划线组成,且只能以字母开头
变量来源:
ansible all -m setup 远程主机的所有变量都可直接调用
在/etc/ansible/hosts中定义
普通变量:主机组中主机单独定义,优先级高于公共变量
host分组变量:针对主机组中所有主机定义统一变量
通过命令行指定变量,优先级最高
例如:ansible-playbook –e varname=value
在playbook中定义
vars: – var1: value1 – var2: value2
在role中定义
变量定义:key=value
示例:http_port=80
变量调用方式:
通过{
{ variable_name }} 调用变量,且变量名前后必须有空格,
有时用”{
{ variable_name }}”才生效
变量调用优先级:
命令行-e > playbook定义 > hosts普通变量 > host分组变量
实例
1:命令行变量赋值
vim var2.yml
—--
– hosts: websrvs
remote_user: root
tasks:
– name: install package
yum: name={
{ pkname }}
– name: start service
service: name={
{ pkname }} state=started enabled=yes
ansible-playbook -e ‘pkname=vsftpd’ var2.yml
2:playbook中赋值变量
vim var1.yml
---
– hosts: websrvs
remote_user: root
vars:
– pkname1: httpd
– pkname2: vsftpd
tasks:
– name: install package
yum: name={
{ pkname1 }}
– name: install package
yum: name={
{ pkname2 }}
ansible-playbook var1.yml
3:hosts文件中定义普通变量
vim /etc/ansible/hosts
192.168.30.11 httpd_port=81
192.168