Ansible 2.1:Playbook 中遵循的 YAML 一般语法

2.1:Playbook 中遵循的 YAML 一般语法

YAML官方网站:https://yaml.org/

Ansible YAML 语法介绍:https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html

YAML 是一种数据格式,与其它数据格式(XML、JSON等)相比,可读性更好,而且大多数的编程语言都提供了可用于YAML数据格式的库。

XML、JSON、YAML数据格式的比较:

  • XML:Extensible Markup Language(可扩展标记语言),用于数据交换和配置。
  • JSON:JavaScript Object Notation(JS 对象简谱),是一种轻量级的数据交换格式,用于数据交换和配置,不支持注释。
  • YAML:YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
    主要用于配置。

Ansible 2.1:Playbook 中遵循的 YAML 一般语法

可以通过工具对三种数据格式进行相互转换,比如JSON和 YAML的互相转换,可以用:

  • https://www.json2yaml.com/
  • http://www.bejson.com/json/json2yaml/

整个YAML数据格式的语法比较繁杂,Playbook中经常用到的也不多,下边对Playbook编写时需要遵循的、经常用到的YAML一般语法进行基本的说明。

2.1.1:首先:

  • Playbook中数据的基本元素都是“key: value”形式的标量(Scalar),其中“冒号”后必须要跟一个“空格”。
  • 标量(Scalar)可以组合成不同的数据结构。
    Playbook数据结构的组织方式有三种:
    • 列表(List)
    • 字典(Dictionary)
    • 二者混合
  • YAML使用严格的缩进级别来组织多个层级的数据结构,所以在编写Playbook时,同一数据结构层级中,成员的缩进级别必须统一。

2.1.2:其次:

以一个简单的Playbook为例,说明在编写Playbook时需要遵循的一般YAML语法,以及列表(List)+字典(Dictionary)混合数据结构是怎么组织的。

#在playbook的第一行用“---”表示开始(这是约定俗成的,不是强制性的标准)。
---	

#以“#”号开头的行表示注释(这里是将这个playbook的功能进行说明)。
#Install httpd Server			

#playbook的正式内容几乎都以列表开头,列表中的成员以“- ”开头。
#比如这个playbook是以“- host: websrvs"开头的,相当于整个plabook是一个大的列表,”- host: websrvs“是列表中的一个成员。
- hosts: websrvs
  remote_user: root				
  
  tasks: 						
    - name: Install httpd		
      yum: name=httpd
    - name: Config file
      copy: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
      notify: Restart httpd
    - name: Web file
      copy: src=index.html dest=/var/www/html/index.html
    - name: Start service
      service: name=httpd state=started enabled=yes

  handlers:
    - name: Restart httpd
      service: name=httpd state=restarted
      
#在playbook的最后一行用“...”表示结尾(也是约定俗成的,不是强制性的标准)
...		

上述playbook的整个数据结构是这样组织的:

  • 第一层级:整个playbook是一个大的列表

    成员1个:- hosts: websrvs(字典)

    • 第二层级:hosts: websrvs(字典)

      成员3个:remote_user: root(标量)、tasks:(列表)、handlers:(列表)

      • 第三层级:remote_user: root(标量)

        标量是单个的,不可再分的值,所以不可能再有成员

      • 第三层级:tasks:(列表)

        成员是4个字典,而这4个字典又各自包含多个成员,分别为:

        • name: Install httpdyum: name=httpd
        • name: Config filecopy: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.confnotify: Restart httpd
        • name: Web filecopy: src=index.html dest=/var/www/html/index.html
        • name: Start serviceservice: name=httpd state=started enabled=yes
      • 第三层级:handlers:(列表)

        成员是1个字典,这个字典包含的成员为:

        • name: Restart httpdservice: name=httpd state=restarted

2.1.3:最后:

  • Playbook中标量的格式除了上述playbook中用到的key: value形式外,还可以用多行缩进的方式表示,即:

    key:
      value
    
  • Playbook中列表的格式除了上述playbook中用到的多行表示方式,即:

    list:
      - mem_key1: mem_value1
      - mem_key2: mem_value2
      - mem_key3: mem_value3
    

    之外,还可以将单个列表写成一行,即:

    list: [ mem_key1: mem_value1, mem_key2: mem_value2, mem_key3: mem_value3 ]
    

    列表的所有成员用中括号[ ]括起来(为了美观,可以在两侧中括号内各加一个空格);
    成员之间使用,分隔(注意逗号后有一个空格)。

  • 字典的格式除了上述playbook中用到的多行表示方式,即:

    dictioary:
      mem_key1: mem_value1
      mem_key2: mem_value2
      mem_key3: mem_value3
    

    同样可以将单个字典写成一行,即:

    dictioary: { mem_key1: mem_value1, mem_key2: mem_value2, mem_key3: mem_value3 }
    

    字典中的所有成员用大括号{ }括起来(为了美观,可以在两侧大括号内各加一个空格);
    成员之间使用,分隔(注意逗号后有一个空格)。

  • YAML数据格式是对大小写敏感的,所以在Playbook编写时要特别注意大小写的区分。

  • Playbook文件名一般以ymlyaml结尾,以表示这是一个YAML格式的文件。

上一篇:ansible下playbook介绍


下一篇:云运维-任务5.2-Ansible(2)playbook的使用-20201222