82.学习Ansible[5]:YAML文件格式浅析,ansibleyaml


文章目录

  • 关于YAML
  • Ansible中的YAML
    • 列表
    • 字典
    • 复杂格式
  • Ansible中不常用的YAML特性
    • 布尔型值
    • 跨行
    • 特殊字符处理
    • Ansible的变量替换

掌握Ansible的ad-hoc command、inventory管理后,可以继续深入了解playbook的编写。在学习playbook之前,我们先了解一下playbook使用的YAML的语法格式。

关于YAML

Ansible的Playbook之所以采用YAML,是因为YAML可读性强,比XML、JSON易编写。另外,大多数语言有成熟的YAML解析工具。

  • YAML档案以---开头,结尾(可选,如果多个YAML档案保存在一个文件,建议用结尾,这样在流式传输中不用关闭流就知道遇到了档案结尾)。
  • 使用#(井号加一个空格)作为单行注释的开头,YAML没有多行注释。
  • 只能使用空格缩进,不能使用tab
  • 字符串不必用引号括起。如果用双引号括起来,支持特殊字符的转义。

Ansible中的YAML

Ansible几乎所有的YAML档案的最顶层都是列表,列表中的每个元素是key/value对(字典)。

列表

YAML中,列表的所有元素,都是同样缩进、以-(短横线和空格,或者短横线和换行符)开头的一行,例如:

---
# A list of fruits
fruits:
 - Apple
 - Orange
 - Mango
…

无所谓缩进的空格数量,只要保证同样层级的元素缩进量一样就可以。

字典

字典按照key: value(冒号后面跟一个空格,或者冒号后跟一个换行符)的格式定义:

# An employee record
mars:
    name: mars loo
    job: qa
    skill: ansible

复杂格式

列表和字典可以互相嵌套,比如字典的列表、字典的值是列表或者两种情况的混合:

# Employee records
 - mars:
        name: mars loo
        job: qa
        skill:
            - ansible
            - python
 - loo:
        name: loo mars
        job: rd
        skill:
            - java
            - C++

字典和列表可以简写:

---
mars: {name: mars loo, job: qa, skill: ansible}
fruits: ['Apple', 'Orange', 'Mango']

Ansible中不常用的YAML特性

布尔型值

表示布尔型的true/false有多种形式:

create_key: yes
need_agent: no
knows_oop: True
like_vim: TRUE
use_cvs: false

跨行

一行文字长度过长可以跨行:|会包含换行符和尾随空格,>会把换行符替换为空格,并去掉多余的尾随空格。两种情况下,缩进的空格都会被忽略。例如:

include_newlines: |
            exactly as you see
            will appear these three
            lines of poetry

fold_newlines: >
            this is really a
            single line of text
            despite appearances

特殊字符处理

YAML中字符串不需要用引号扩起来,内容可以是任意值。某些场景下为了保留特殊字符可能需要用引号括起来,例如:

--- 
windows_drive: "C:"

否则C:后面跟了一个换行符,会被认为是一个字典。或者需要转义:

--- 
windows_drive: "C:\\a\\b"

Ansible的变量替换

Ansible使用{{ var }}表示变量,但是在YAML中,冒号后面跟着花括号会被认为是一个字典,所以需要用双引号括起来。如果一个值以{{ var }}的形式开头,则整个值都需要用双引号括起来,而不仅仅是{{ var }}的部分:

--- 
foo: "{{ variable }}/additional/string/literal"
foo2: "{{ variable }}\\backslashes\\are\\also\\special\\characters"
foo3: "even if it's just a string literal it must all be quoted"

如下字符都不能用于未被引号括起来的标量的开头:[] {} > | * & ! % # @ , ' "。虽然YAML规定? : -后面如果跟的不是空白字符,可以作为未被引号括起来的标量的开头,但是不同YAML解析器的实现不同,最好也都用引号括起来。
其他明确需要字符串的场景,也可以把标量中引号括起来,例如:

version : "1.0"

避免版本号1.0被解析成浮点数。

YAMLLint网站可以检查YAML文件的格式,并给出优化后的YAML定义。

至此,我们掌握的内容对于编写playbook已经足够,建议继续阅读下一篇博客:学习Ansible[6]:playbook。

相关内容

    暂无相关文章