Skip to content
SRE运维进阶之路SRE运维进阶之路
devops
github icon
    • Ansible 学习笔记
      • 1 初识Ansible
        • 2 Ansible Inventory配置详解
            • 4.1 Playbook的结构及handler用法
              • 4.2 Playbook循环语句
                • 4.3 Playbook条件语句
                  • 4.4 Playbook高级用法
                    • 4.5 Playbook之tags
                      • 4.6 巧用Roles
                        • 4.7 Jinja2 模板
                          • 4.8 yaml语法
                            • playbook的语法:YAML
                              • 对象
                                • 数组
                                  • 字典
                                    • 复合结构
                                      • 字符串续行
                                  • 6 Ansible使用优化
                                    • 7 常见问题

                                    4.8 yaml语法

                                    author iconClaycalendar icon2020年3月20日category icon
                                    • 自动化工具
                                    tag icon
                                    • Ansible
                                    timer icon大约 3 分钟

                                    此页内容
                                    • playbook的语法:YAML
                                      • 对象
                                      • 数组
                                      • 字典
                                      • 复合结构
                                      • 字符串续行

                                    # 4.8 yaml语法

                                    # playbook的语法:YAML

                                    ansible的playbook采用yaml语法,它以非常简洁的方式实现了json格式的事件描述。

                                    yaml之于json就像markdown之于html一样,极度简化了json的书写。

                                    YAML文件后缀通常为.yaml或.yml。

                                    YAML在不少工具里都使用,学习它是"一次学习、终生受益"的,所以很有必要把yaml的语法格式做个梳理,系统性地去学一学。

                                    YAML的基本语法规则如下:

                                    (1).使用缩进表示层级关系

                                    (2).缩进时不允许使用Tab键,只允许使用空格

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

                                    (4).yaml文件以"---"作为文档的开始,以表明这是一个yaml文件

                                    即使没有使用---开头,也不会有什么影响

                                    (5).# 表示注释,从这个字符一直到行尾,都会被解析器忽略

                                    (6).字符串不用加引号,但在可能产生歧义时,需加引号(单双引号皆可),比如引用变量时

                                    (7).布尔值非常灵活,不分区大小写的true/false、yes/no、on/off、y/n、0和1都允许

                                    YAML支持三种数据结构:

                                    (1).对象:key/value格式,也称为哈希结构、字典结构或关联数组

                                    (2).数组:也称为列表

                                    (3).标量(scalars):单个值

                                    可以去找一些在线YAML转换JSON网站,比如 http://yaml-online-parser.appspot.comopen in new window 通过在线转换可以验证或查看自己所写的YAML是否出错以及哪里出错。

                                    # 对象

                                    一组键值对,使用冒号隔开key和value。注意,冒号后必须至少一个空格。

                                    name: clay
                                    
                                    1

                                    等价于json:

                                    {
                                    	"name": "clay"
                                    }
                                    
                                    1
                                    2
                                    3

                                    # 数组

                                    ---
                                    - Shell
                                    - Perl
                                    - Python
                                    
                                    1
                                    2
                                    3
                                    4

                                    等价于json:

                                    ["Shell","Perl","Python"]
                                    
                                    1

                                    也可以使用行内数组(内联语法)的写法:

                                    ---
                                    ["Shell","Perl","Python"]
                                    
                                    1
                                    2

                                    再例如:

                                    ---
                                    - lang1: Shell
                                    - lang2: Perl
                                    - lang3: Python
                                    
                                    1
                                    2
                                    3
                                    4

                                    等价于json:

                                    [
                                        {"lang1": "Shell"},
                                        {"lang2": "Perl"},
                                        {"lang3": "Python"}
                                    ]
                                    
                                    1
                                    2
                                    3
                                    4
                                    5

                                    将对象和数组混合:

                                    ---
                                    languages:
                                      - Shell
                                      - Perl
                                      - Python
                                    
                                    1
                                    2
                                    3
                                    4
                                    5

                                    等价于json:

                                    {
                                    	"languages": ["Shell","Perl","Python"]
                                    }
                                    
                                    1
                                    2
                                    3

                                    # 字典

                                    ---
                                    person1:
                                      name: clay
                                      age: 18
                                      gender: male
                                    
                                    person2:
                                      name: wangchi
                                      age: 19
                                      gender: female
                                    
                                    1
                                    2
                                    3
                                    4
                                    5
                                    6
                                    7
                                    8
                                    9
                                    10

                                    等价于json:

                                    {
                                      "person2": {
                                        "gender": "female",
                                        "age": 19,
                                        "name": "clay"
                                      },
                                      "person1": {
                                        "gender": "male",
                                        "age": 18,
                                        "name": "wangchi"
                                      }
                                    }
                                    
                                    1
                                    2
                                    3
                                    4
                                    5
                                    6
                                    7
                                    8
                                    9
                                    10
                                    11
                                    12

                                    也可以使用行内对象的写法:

                                    ---
                                    person1: {name: clay, age: 18, gender: male}
                                    
                                    1
                                    2

                                    # 复合结构

                                    ---
                                    - person1:
                                      name: clay
                                      age: 18
                                      langs:
                                        - Perl
                                        - Ruby
                                        - Shell
                                    
                                    - person2:
                                      name: xiaofanggao
                                      age: 19
                                      langs:
                                        - Python
                                        - Javascript
                                    
                                    1
                                    2
                                    3
                                    4
                                    5
                                    6
                                    7
                                    8
                                    9
                                    10
                                    11
                                    12
                                    13
                                    14
                                    15

                                    等价于json:

                                    [
                                        {
                                            "langs": [
                                            "Perl",
                                            "Ruby",
                                            "Shell"
                                            ],
                                            "person1": null,
                                            "age": 18,
                                            "name": "clay"
                                        },
                                        {
                                            "person2": null,
                                            "age": 19,
                                            "langs": [
                                            "Python",
                                            "Javascript"
                                            ],
                                            "name": "xiaofanggao"
                                        }
                                    ]
                                    
                                    1
                                    2
                                    3
                                    4
                                    5
                                    6
                                    7
                                    8
                                    9
                                    10
                                    11
                                    12
                                    13
                                    14
                                    15
                                    16
                                    17
                                    18
                                    19
                                    20
                                    21

                                    # 字符串续行

                                    字符串可以写成多行,从第二行开始,必须至少有一个单空格缩进。换行符会被转为空格。

                                    str: hello
                                      world
                                      hello world
                                    
                                    1
                                    2
                                    3

                                    等价于json:

                                    {
                                      "str": "hello world hello world"
                                    }
                                    
                                    1
                                    2
                                    3

                                    也可以使用 > 换行,它类似于上面的多层缩进写法。此外,还可以使用|在换行时保留换行符。

                                    that: >
                                      Foo
                                      Bar
                                    this: |
                                      Foo
                                      Bar
                                    
                                    1
                                    2
                                    3
                                    4
                                    5
                                    6

                                    等价于json:

                                    {'that': 'Foo Bar', 'this': 'Foo\nBar\n'}
                                    
                                    1

                                    参考链接:

                                    https://blog.51cto.com/cloumn/blog/1543

                                    edit icon编辑此页open in new window
                                    上次编辑于: 2023/4/19 13:50:36
                                    贡献者: clay-wangzhi
                                    上一页
                                    4.7 Jinja2 模板
                                    备案号:冀ICP备2021007336号
                                    Copyright © 2023 Clay