4、yaml语法应用

ansible的playbook编写是yaml语言编写,掌握yaml语法是编写playbook的必要条件,格式要求和Python相似,具体教程参考如下

yaml语言教程

附上一个yaml文件转js格式文件链接

在线免费yaml内容转json格式

4.1、 ansible中的yaml语法应用

ansible中yaml语法和上述教程大同小异,以下是个人简化和总结:

基本语法规则如下

以 "---" 开头

大小写敏感

使用缩进表示层级关系

缩进时不允许使用Tab键,只允许使用空格

缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

'#' 号表示注释,从这个字符一直到行尾,都会被解析器忽略;可以在一行的中间使用,注释 # 之后的内容。关于注释,需要注意是不是任意位置都能使用,当分行写时,不能放在分行的所在行

YAML 支持的数据结构有三种:

对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)

数组:一组按次序排列的值,又称为序列(sequence) / 列表(list),以 "- " 开头,有空格间隔

纯量(scalars):单个的、不可再分的值(ansible中很少用到)

4.2、对象简介

ansible中yaml对象和计算机的中是"key-value"数据结构相似,只是表达的方式不同,在ansible中,对象可以采用两种表达方式。切记 : (冒号)之后一定要加空格,否则报错

# 多行式
host: localhost
remote_user: root
# 行内式,也称为单行式,两边是大括号包围
{ host: localhost, remote_user: root }

注意

  • 在一行表示中,字典的值,可以嵌套其他字典,但是需要用引号包围起来代表一个整体值,返回的是整体而且不是直接嵌套字典,下面引号部分会给实际案例解释。
  • 冒号加空格加内容即": haha"这个格式代表的是字典的表达式,这个是yaml语法规定的;冒号加内容即":haha",代表的是普通的表达式,没有特殊意义,所以定义对象需要注意,但是这种普通表达式,有一些情况会用到,例如下文中引号的例子中

4.3、数组简介

在ansible中数组也称为列表,以 "- " 开头,有空格间隔,同样有两种表达方式。

# 多行式
- shell
- copy
# 单行式,内联式,两边用中括号包围
[shell, copy]

4.4、分行写

playbook中的分行写支持三种格式,分别是:

在"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

运行效果图

4.5、向模块传递参数

模块的参数⼀般来说是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

4.6、playbook中的引号使用

引号的作用,可以将一个字典中的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

解释

  1. 前面三个shell模块,字典的value都是普通的表达式,有引号和无引号,结果是一样的,需要注意的是":"冒号之后没有空格,而是直接跟上内容,这种表达式不是字典,实际上可以把这个冒号当作普通的字符串看待
  2. 第四个shell模块中,因为value值嵌套了字典,而且还使用了大括号引用变量,这种表达式需要将整个表达

    式括起来,因此需要用单引号将整个表达式括起来,用整体当作一个值赋值给模块。理解这两点剩下的模块也是一样的意思
  3. 从打印的结果看,": "和":"的区别是,当字典的值嵌套了字典时,即使用": "时,打印也会按照这个格式打印,也就是冒号的下一个字符串是空格,而":"这个普通的格式则是跟上内容

4.7、playbook和play的关系

⼀个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时,一定要有

4.8、yaml编写总结

  1. 缩进:关于缩进,空格的多少无关,注重的是层级一致性,个人习惯缩进4或2个空格区分
  2. 对象的冒号:列表编写,"-"加内容编写完之后,换行时会自动对齐到"-"列,这是错误的,需要手动对齐"- "后的内容所在列,例如:tasks后添加冒号":"时,会自动对齐"-",实际上所有的冒号添加之后换行时,编辑器默认对齐上一行的第一个字符串位置,需要自行手动对齐
  3. 注释:关于注释,经测试,不能出现在对象的值value上,否则报错。例如不能放tasks的冒号之后之后
---
- hosts: lzcx
tasks:
- shell: echo haha # 注释不能出现在task的冒号之后

ansible中yaml语法应用的更多相关文章

  1. k8s中yaml文常见语法

    在k8s中,所有的配置都是 json格式的.但为了读写方便,通常将这些配置写成yaml 格式,其运行的时候,还是会靠yaml引擎将其转化为json,apiserver 也仅接受json的数据类型. y ...

  2. ansible yaml 语法

    yet another markup language -- 另外的一种标记语言 yaml 语法: 序列:同一个类型的数据有多个,用"-" 来区分,叫序列 映射:价值对,用&quo ...

  3. Ansible 小手册系列 八(Yaml 语法格式)

    YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类读写.它实质上是一种通用的数据串行化格式. 它的基本语法规则如下. • 大小写敏感 • 使用缩进表示层级关系 • 缩进时不允许使用Ta ...

  4. 第3天:YAML语法

    YAML是一种可读性很强的数据格式语言.正是由于YAML良好的可读性,其广泛引用于软件配置中. 语法规则 YAML文件中的第一行为"---",表示这是一个YAML文件: YAML中 ...

  5. ansible中playbook使用

    palybook使用 ####yaml语法ansible中使用的yaml基础元素:变量Inventory条件测试迭代 playbook的组成结构InventoryModulesAd Hoc Comma ...

  6. ansible-playbook的YAML语法学习

    YAML:可以将你打算对多机器的批量操作放到一个文件中,顺序执行,可以根据机器做到根据机器信息判断执行,其他命令执行结果判断执行. YAML有着严格的层级要求,稍微有个缩进问题就会无法运行,所以学习过 ...

  7. Ansible之YAML语言

    playbook写yml语句,若干模块发给Ansible,变成一个一个play,多个片段组合起来变成大片. 最终还是要读取主机清单,来确定作用在哪些机器上. YAML语言 YAML是一个可读性高的用来 ...

  8. YAML 语法

    YAML 语法 来源:yaml 这个页面提供一个正确的 YAML 语法的基本概述, 它被用来描述一个 playbooks(我们的配置管理语言). 我们使用 YAML 是因为它像 XML 或 JSON ...

  9. saltstack实战3--配置管理之YAML语法

    本文来自如下链接http://docs.saltstack.cn/topics/yaml/index.html 了解YAML 默认的SLS文件的renderer是YAML renderer.YAML是 ...

随机推荐

  1. jquery ajax post请求实例

    function test(){ $.ajax({ //提交数据的类型 POST GET type:"POST", //提交的网址 url:"testLogin.aspx ...

  2. HDU 2340 Obfuscation (暴力)

    题意:给定一篇文章,将每个单词的首尾字母不变,中间顺序打乱,然后将单词之间的空格去掉,得到一个序列,给出一个这样的序列,给你一个字典,将原文翻译出来. 析:在比赛的时候读错题了,忘记首尾字母不变了,一 ...

  3. 【性能测试】服务器资源监测工具sar安装

    [root@yyy ~]# sar Cannot open /var/log/sa/sa19: No such file or directory 在Linux系统中,运行sar命令,发现无法执行: ...

  4. bzoj 2456: mode【瞎搞】

    这题加个#include都会MLE-- 神思路,每个数抵消宇哥和它不同的数,最后剩下的就是众数 #include<cstdio> int n,la,x,tot; int main() { ...

  5. 我的周记5——"侵略如火,不动如山"

    这周发生的事儿 最近同事晋升的参加答辩,还有的同事要转岗走了.难受... 有时候自己常常想,我是不是应该也要走了. 这儿的人好优秀呀,又舍不得离开.但是这里太安逸了,接触不到技术,靠自学呢 又感觉力不 ...

  6. POJ 2833 The Average(优先队列)

    原题目网址:http://poj.org/problem?id=2833 本题中文翻译: 描述 在演讲比赛中,当选手完成演讲时,评委将对他的演出进行评分. 工作人员删除最高成绩和最低成绩,并计算其余成 ...

  7. SpringMVC Model,ModelMap ModelAndView

    SpringMVC 调用方法之前会创一个隐含的模型对象(即Model,ModelMap ModelAndView) //@ModelAttribute 先于login方法执行 @ModelAttrib ...

  8. Python之Linux下的virtualenv&&virtualenvwrapper

    virtualenv 可以在系统中建立多个不同并且相互不干扰的虚拟环境. #指定清华源下载pip的包 pip3 install -i https://pypi.tuna.tsinghua.edu.cn ...

  9. poj 1258 Agri-Net prim模板 prim与dijkstra的区别

    很裸地求最小生成树的题目.题意就不多说了,最重要的就是记录一下学会了prim算法. 初学prim,给我的第一感觉就是和dijkstra好像啊,感觉两者的区别还是有的: 1:prim是求最小生成树的算法 ...

  10. 455 Assign Cookies 分发饼干

    假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干.对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸:并且每块饼干 j ,都有一个尺寸 ...