ansible的playbook编写是yaml语言编写,掌握yaml语法是编写playbook的必要条件,格式要求和Python类似,具体教程参考以下
yaml语言教程
附上一个yaml文件转js格式文件连接
在线免费yaml内容转json格式html
ansible中yaml语法和上述教程大同小异,如下是我的简化和总结:
基本语法规则以下node
以 "---" 开头
大小写敏感
使用缩进表示层级关系
缩进时不容许使用Tab键,只容许使用空格
缩进的空格数目不重要,只要相同层级的元素左侧对齐便可
'#' 号表示注释,从这个字符一直到行尾,都会被解析器忽略;能够在一行的中间使用,注释 # 以后的内容。关于注释,须要注意是否是任意位置都能使用,当分行写时,不能放在分行的所在行git
YAML 支持的数据结构有三种:github
对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list),以 "- " 开头,有空格间隔
纯量(scalars):单个的、不可再分的值(ansible中不多用到)shell
ansible中yaml对象和计算机的中是"key-value"数据结构类似,只是表达的方式不一样,在ansible中,对能够采用两种表达方式。切记 : (冒号)以后必定要加空格,不然报错json
# 多行式 host: localhost remote_user: root # 行内式,也称为单行式,两边是大括号包围 { host: localhost, remote_user: root }
注意数组
在ansible中数组也称为列表,以 "- " 开头,有空格间隔,一样有两种表达方式。数据结构
# 多行式 - shell - copy # 单行式,内联式,两边用中括号包围 [shell, copy]
playbook中的分行写支持三种格式,分别是:app
在"key"以后使用 "|", 表示保留换行
在"key"以后使用 ">" ,表示折叠换行
采用多行缩进格式,建议从缩进的第二行用 四个 空格表示缩进。须要注意注释的位置编辑器
# 如下例子表示三种不一样的分行写格式,注意看区别 --- - hosts: lzcx tasks: - shell: echo 'Hello world' >> /tmp/test.txt creates=/tmp/haha.txt # 分行写注意缩进,同时这行的注释不能放到上一行,不然报错 - shell: | # 冒号以后要有空格 echo '张三' >> /tmp/test.txt echo '李四' >> /tmp/test.txt args: creates: /tmp/haha.txt - shell: > # 大于号以后要有空格 echo '王五' >> /tmp/test.txt creates: /tmp/haha.txt
运行效果图
模块的参数⼀般来讲是key=value格式的,有3种传递的⽅式:
直接写在模块后,此时要求使⽤"key=value"格式。这是让ansible内部去解析字符串。由于可分⾏写,因此有多种写法
写成字典型,即"key: value"。此时要求多层缩进。这是让yaml去解析字典。shell和command模块不能使用这种格式
使⽤内置属性args,而后多层缩进定义参数列表。这是让ansible明确指定⽤yaml来解析
# 参数的多种格式 --- - hosts: lzcx tasks: - shell: echo '1' > /tmp/test.txt creates=/tmp/haha.txt # 单行格式 - shell: echo '2' >> /tmp/test.txt creates=/tmp/haha.txt # 多行格式,注意缩进,,同时这行的注释不能放到上一行,不然报错 - shell: echo '3' >> /tmp/test.txt args: creates: /tmp/haha.txt # 使用内置args参数 - shell: > echo '4' >> /tmp/test.txt creates=/tmp/haha.txt # 大于号多行缩进模式 - shell: | echo '5.1' >> /tmp/test.txt echo '5.2' >> /tmp/test.txt args: creates: /tmp/haha.txt - yum: name: dos2unix state: installed
引号的做用,能够将一个字典中的value值表达式看成总体返回,这个表达式里面能够嵌套字典,playbook中定义的都是些列表和字典。绝⼤多数时候,都不须要使⽤引号,但有两个特殊状况须要考虑使⽤引号
出现⼤括号"{}"
值(value)出现冒号加空格时": ",即嵌套字典时,须要将嵌套的部分用引号看成总体返回
# 附上一个综合例子,注意每一个模板内容的区别 --- - hosts: localhost tasks: - shell: echo {{inventory_hostname}}:haha - shell: "echo {{inventory_hostname}}:haha" - shell: 'echo {{inventory_hostname}}:haha' - shell: 'echo "{{inventory_hostname}}: haha"' - shell: echo "{{inventory_hostname}}:haha" register: hello - debug: 'msg="{{hello.stdout}}: heihei"' - shell: echo {{inventory_hostname}}:haha register: hello1 - debug: msg={{hello1.stdout}}:heihei
解释
⼀个playbook中能够包含多个play。每一个play都⾄少包含有tasks和hosts这两项,还能够包含其余⾮必须项,如vars,vars_f iles,remote_user等。tasks中能够经过模块调⽤定义⼀系列的action。只不过,绝⼤多数时候,⼀个playbook都只定义⼀个play,这样作的好处是便于维护。
playbook文件中基本结构为:
playbook: [play1, play2, play3]
play: [hosts, gather_facts, connection, become, remote_user, tasks, vars...]
tasks: [变量vars、循环with_xxx、判断when、命名name、module1, module2,...]
须要注意的是,当play使用了role时,看上去没有tasks和hosts选项,实际上role里面包含了,因此有没有tasks和hosts不要紧,但没有使用role时,必定要有
--- - hosts: lzcx tasks: - shell: echo haha # 注释不能出如今task的冒号以后