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: lzcxtasks:- shell: echo 'Hello world' >> /tmp/test.txtcreates=/tmp/haha.txt            # 分行写注意缩进,同时这行的注释不能放到上一行,否则报错- shell: |                                  # 冒号之后要有空格echo '张三' >> /tmp/test.txtecho '李四'  >> /tmp/test.txtargs:creates: /tmp/haha.txt- shell: >                                  # 大于号之后要有空格echo '王五' >> /tmp/test.txtcreates: /tmp/haha.txt

运行效果图

4.5、向模块传递参数

模块的参数⼀般来说是key=value格式的,有3种传递的⽅式:

直接写在模块后,此时要求使⽤"key=value"格式。这是让ansible内部去解析字符串。因为可分⾏写,所以有多种写法
写成字典型,即"key: value"。此时要求多层缩进。这是让yaml去解析字典。shell和command模块不能使用这种格式
使⽤内置属性args,然后多层缩进定义参数列表。这是让ansible明确指定⽤yaml来解析

# 参数的多种格式
---- hosts: lzcxtasks:- shell: echo '1' > /tmp/test.txt creates=/tmp/haha.txt  # 单行格式- shell: echo '2' >> /tmp/test.txtcreates=/tmp/haha.txt           # 多行格式,注意缩进,,同时这行的注释不能放到上一行,否则报错- shell: echo '3' >> /tmp/test.txtargs: creates: /tmp/haha.txt           # 使用内置args参数- shell: >echo '4' >> /tmp/test.txtcreates=/tmp/haha.txt           # 大于号多行缩进模式- shell: |echo '5.1' >> /tmp/test.txtecho '5.2' >> /tmp/test.txtargs:creates: /tmp/haha.txt- yum:name: dos2unixstate: installed

4.6、playbook中的引号使用

引号的作用,可以将一个字典中的value值表达式当作整体返回,这个表达式里面可以嵌套字典,playbook中定义的都是些列表和字典。绝⼤多数时候,都不需要使⽤引号,但有两个特殊情况需要考虑使⽤引号

出现⼤括号"{}"
值(value)出现冒号加空格时": ",即嵌套字典时,需要将嵌套的部分用引号当作整体返回

# 附上一个综合例子,注意每个模板内容的区别
---- hosts: localhosttasks:- 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}}:haharegister: 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: lzcxtasks:- shell: echo haha   # 注释不能出现在task的冒号之后

转载于:https://www.cnblogs.com/AutoSmart/p/10273164.html

ansible中yaml语法应用相关推荐

  1. 学习ansible playbook之前先了解下YAML语法

    YAML 语法 本文来自于:http://www.ansible.com.cn/docs/YAMLSyntax.html 这个页面提供一个正确的 YAML 语法的基本概述, 它被用来描述一个 play ...

  2. Linux九阴真经之九阴白骨爪残卷5(ansible用法二之Playbook和YAML语法)

    playbook是由一个或多个"play"组成的列表 play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色.从根本上来讲,所谓task无 ...

  3. yaml语法格式,springboot中yaml的使用

    yaml语法格式,springboot中yaml的使用 yaml 1.yaml语法格式 2.数据类型表示 springboot中yaml的使用 1. @ConfigurationProperties注 ...

  4. 使用Ansible中的playbook

    使用Ansible中的playbook 1 playbook的功能 2 YMAL 2.1 简介 2.2 特点 2.3 语法简介 2.4 YAML列表 2.5 YAML的字典 3 playbook执行命 ...

  5. 【ansible4】Ansible中的变量及加密(jinjia模板使用等,图文详解)

    Ansible中的变量及加密 一.变量的设定 一.变量命名规则 二.变量级别 三.变量设定和使用方式 二.JINJIA2模板 一.简介 二.使用方法 三.jinjia2模板的for循环,if用法 一. ...

  6. Springboot之YAML语法

    概述 YAML是 JSON 的超集,因此,它是用于指定分层配置数据的便捷格式.只要 class 路径上有SnakeYAML library,SpringApplication class 就会自动支持 ...

  7. K8S-网络模型、POD/RC/SVC YAML 语法官方文档

    2019独角兽企业重金招聘Python工程师标准>>> K8S-网络模型.POD/RC/SVC YAML 语法官方文档 博客分类: Kubernetes K8S-网络模型.POD/R ...

  8. k8s查看pod的yaml文件_【大强哥-k8s从入门到放弃04】Yaml语法解析

    依然小福利[Python-零基础入门]2020感谢走进我的生命,Python!(已更新至206集)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com 一.K8S名称 ...

  9. k8s:资源类型及yaml语法

    k8s资源类型 yaml语法 一定是空格!!! 单引号在yml中就类似于转义符

最新文章

  1. 摘:设置向文件中的输出格式
  2. Exchange 2010和Exchange 2016共存部署-3:Exchange2016部署系统要求
  3. 烂泥:学习Nagios(三): NRPE安装及配置
  4. javascript学习-创建json对象数据,遍历
  5. IDEA的使用注释编程时,出现报错解决方案
  6. 开发人员:月薪过万与年薪百万之间的差距
  7. python决策树逻辑回归_百面机器学习(逻辑回归以及决策树,leetcode)
  8. 墨迹天气语音包_广州天气|冷空气到货,任性吃火锅的理由又有了
  9. c语言编程车,C语言编程之自动类型转化
  10. html5扫面二维码逻辑
  11. python异步io协程读文件_Python协程中的并行异步IO
  12. 【Axure组件库】Axure移动端小程序组件库 移动端高交互元件库
  13. Oracle数据脱敏REPLACE()和SUBSTR()
  14. 微弱信号检测matlab代码,微弱信号检测方法研究
  15. 驱动精灵(Driver Genius Professional Edition 2007) v7.1.622 完美注册版(可升级)
  16. Five-degree-of-freedom manipulation of an untethered magnetic device in fluid using a single permane
  17. 布局 flex让元素一个靠左一个靠右
  18. 【网络】如何扫描局域网内所有设备的ip和mac地址
  19. UML类图关系(C++)
  20. 基于web的科研项目管理系统设计与实现

热门文章

  1. 双网卡oracle rac,Linux+Oracle 10g RAC双网卡绑定和解除绑定的实现(2)
  2. Servlet体系结构
  3. css实现元素在div底部显示
  4. [Js-开发常识]为什么定义实体类属性建议用 Ineger 而不是 int
  5. This dependency was not found: * !!vue-style-loader!css-loader?……解决方案
  6. mysql 安装目录说明
  7. 蒙提霍尔悖论(三门问题)终极分析(补充)附完整源码
  8. 大话设计模式笔记 享元模式
  9. effective c++条款11扩展——关于拷贝构造函数和赋值运算符
  10. 根文件系统构建(Yocto方式)