ansible中yaml语法应用

四、yaml语法应用

ansible的playbook编写是yaml语言编写,掌握yaml语法是编写playbook的必要条件,格式要求和Python类似,具体教程参考以下
yaml语言教程
附上一个yaml文件转js格式文件连接
在线免费yaml内容转json格式html

4.一、 ansible中的yaml语法应用

ansible中yaml语法和上述教程大同小异,如下是我的简化和总结:
基本语法规则以下node

以 "---" 开头
大小写敏感
使用缩进表示层级关系
缩进时不容许使用Tab键,只容许使用空格
缩进的空格数目不重要,只要相同层级的元素左侧对齐便可
'#' 号表示注释,从这个字符一直到行尾,都会被解析器忽略;能够在一行的中间使用,注释 # 以后的内容。关于注释,须要注意是否是任意位置都能使用,当分行写时,不能放在分行的所在行git

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

对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list),以 "- " 开头,有空格间隔
纯量(scalars):单个的、不可再分的值(ansible中不多用到)shell

4.二、对象简介

ansible中yaml对象和计算机的中是"key-value"数据结构类似,只是表达的方式不一样,在ansible中,对能够采用两种表达方式。切记 : (冒号)以后必定要加空格,不然报错json

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

注意数组

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

4.三、数组简介

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

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

4.四、分行写

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

运行效果图
分行写

4.五、向模块传递参数

模块的参数⼀般来讲是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.六、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.七、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.八、yaml编写总结

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