Ansible系列(三):YAML语法和playbook写法分分快三全

作者:电脑系统

豆蔻梢头经ansible遇见错误就能够中断tasks,那么我们就必要在tasks中增加忽视错误

注:若您认为那篇小说勉强选取请点击下右下角的推荐,有了您的支撑技术激励笔者更加大的创作热情,非常多谢!

1.6 playbook和play的关系

二个playbook中得以饱含七个play。种种play都起码含有有tasks和hosts这两项,还是能富含其余非必需项,如vars,vars_files,remote_user等。tasks中得以因此模块调用定义一五花八门的action。只可是,绝大繁多时候,四个playbook都只定义三个play。

为此,大概关系为:

  • playbook: [play1,play2,play3]
  • play: [hosts,tasks,vars,remote_user...]
  • tasks: [module1,module2,...]

也正是说,各类顶尖列表都是叁个play。比方,下边包车型大巴playbook中包含了八个play。

---
    - name: list1
      hosts: localhost
      remote_user: root
      tasks:

    - hosts: 192.168.100.65
      remote_user: root
      sudo: yes
      tasks:

内需在意,某些时候play中央银行使了role,只怕看起来没有tasks,那是因为role本身就是整合playbook的,所以并未有也没涉及。但绝非使用role的时候,必须得含蓄hosts和tasks。举个例子:

---
  - hosts: centos
    remote_user: root
    pre_tasks: 
        - name: config the yum repo for centos 7
          yum_repository:
              name: epel
              description: epel
              baseurl: http://mirrors.aliyun.com/epel/7/$basearch/
              gpgcheck: no
          when: ansible_distribution_major_version == "7"

        - name: config the yum repo for centos 6
          yum_repository:
              name: epel
              description: epel
              baseurl: http://mirrors.aliyun.com/epel/6/$basearch/
              gpgcheck: no
          when: ansible_distribution_major_version == "6"

    roles: 
        - nginx

    post_tasks:
      - shell: echo 'deploy nginx/mysql over'
        register: ok_var
      - debug: msg='{{ ok_var.stdout }}'

yaml 不或然识别tab产生的空格,惯用vim写python的童鞋 必定十分受茶毒,作者正是个例证

1.7 playbook中曾几何时利用引号

playbook中定义的都以些列表和字典。绝大许多时候,都不须求选择引号,但有几个奇特别情报况供给思索接收引号。

  • 出现大括号"{}"。
  • 现身冒号加空格时": "。

大括号要使用引号包围,是因为不应用引号时会被yaml拆解解析成内联字典。比如要采取大括号援用变量的时候,甚至想出口大括号符号的时候。

---
    - hosts: localhost
      tasks:
        - shell: echo "{{inventory_hostname}}:haha"

冒号尾随空格时要接收引号包围,是因为它会被拆解解析为"key: value"的花样。而且包围冒号的引号还更严谨。举例上面包车型大巴debug模块中不怕使用了引号也是谬误的。

---
    - hosts: localhost
      tasks:
        - shell: echo "{{inventory_hostname}}:haha"
          register: hello
        - debug: msg="{{hello.stdout}}: heihei"

因为它把{{...}}当成key,heihei当成value了。由此,必需将总体debug模块的参数都包围起来,显式钦定这大器晚成段是模块的参数。但那样会和原本的双引号冲突,由此使用单引号。

---
    - hosts: localhost
      tasks:
        - shell: echo "{{inventory_hostname}}:haha"
          register: hello
        - debug: 'msg="{{hello.stdout}}: heihei"'

但是,要是将shell模块中的冒号后也尾随上空格,即写成echo "{{inventory_hostname}}: haha",那么shell模块也会报错。由此也要使用多个引号,正确的如下:

---
    - hosts: localhost
      tasks:
        - shell: 'echo "{{inventory_hostname}}: haha"'
          register: hello
        - debug: 'msg="{{hello.stdout}}: heihei"'

再次来到体系文章大纲:http://www.cnblogs.com/f-ck-need-u/p/7048359.html

1.7 playbook中哪天使用引号

playbook中定义的都以些列表和字典。绝大好些个时候,都无需动用引号,但有多少个独特情形要求思谋动用引号。

  • 出现大括号"{}"。
  • 并发冒号加空格时": "。

大括号要接纳引号包围,是因为不接受引号时会被yaml分析成内联字典。比如要动用大括号引用变量的时候,以致想出口大括号符号的时候。

---
    - hosts: localhost
      tasks:
        - shell: echo "{{inventory_hostname}}:haha"

冒号尾随空格时要动用引号包围,是因为它会被深入解析为"key: value"的花样。而且包围冒号的引号还更严格。举个例子上面包车型大巴debug模块中固然使用了引号也是谬误的。

---
    - hosts: localhost
      tasks:
        - shell: echo "{{inventory_hostname}}:haha"
          register: hello
        - debug: msg="{{hello.stdout}}: heihei"

因为它把{{...}}当成key,heihei当成value了。因而,必需将全部debug模块的参数都包围起来,显式钦赐那豆蔻梢头段是模块的参数。但诸有此类会和原先的双引号冲突,因而使用单引号。

---
    - hosts: localhost
      tasks:
        - shell: echo "{{inventory_hostname}}:haha"
          register: hello
        - debug: 'msg="{{hello.stdout}}: heihei"'

而是,假使将shell模块中的冒号后也尾随上空格,即写成echo "{{inventory_hostname}}: haha",那么shell模块也会报错。由此也要接受几个引号,正确的如下:

---
    - hosts: localhost
      tasks:
        - shell: 'echo "{{inventory_hostname}}: haha"'
          register: hello
        - debug: 'msg="{{hello.stdout}}: heihei"'

2、playbook书写格式

1.5 向模块传递参数

模块的参数常常的话是key=value格式的,有3种传递的办法:

  • 直白写在模块后,当时必要使用"key=value"格式。那是让ansible内部去解析字符串。因为可分行写,所以有各个写法。
  • 写成字标准,即"key: value"。那时候供给多层缩进。那是让yaml去分析字典。
  • 接收内置属性args,然后多层缩进定义参数列表。那是让ansible鲜明内定用yaml来深入分析。

例如:

---
    - hosts: localhost
      tasks: 
        - yum: name=unix2dos state=installed    # key=value直接传递
        - yum: 
            name: unxi2dos
            state: installed            # "key: value"字典格式传递
        - yum: 
          args:                               # 使用args传递
            name: unix2dos
            state:installed

但要注意,当模块的参数是free_form时,即格式不定,比如shell和command模块钦赐要实施的通令,它不大概写成key/value格式,那个时候不能够运用方面包车型客车第三种方法。约等于说,上边第二个模块是未可厚非的,第一个模块是指鹿为马的,因为shell模块的下令"echo haha"是即兴格式的,不可能写成key/value格式。

---
    - hosts: localhost
      tasks: 
        - yum: 
            name: unxi2dos
            state: installed
        - shell: 
            echo haha
            creates: /tmp/haha.txt

故此,调用三个模块的点子就有了种种情势。举个例子:

---
    - hosts: localhost
      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
        - 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

Ansible类别小说:http://www.cnblogs.com/f-ck-need-u/p/7576137.html**

注:破编辑器没有yaml

1.1 早先评释

以叁个粗略的playbook为例,表达yaml的中坚语法。

---
    - hosts: 192.168.100.59,192.168.100.65
      remote_user: root
      pre_tasks: 
        - name: set epel repo for Centos 7
          yum_repository: 
            name: epel7
            description: epel7 on CentOS 7
            baseurl: http://mirrors.aliyun.com/epel/7/$basearch/
            gpgcheck: no
            enabled: True

      tasks: 
# install nginx and run it
        - name: install nginx
          yum: name=nginx state=installed update_cache=yes
        - name: start nginx
          service: name=nginx state=started

      post_tasks: 
        - shell: echo "deploy nginx over"
          register: ok_var
        - debug: msg="{{ ok_var.stdout }}"
  1. yaml文件以---始发,以标注那是一个yaml文件,就疑似xml文件在先导使用<?xml version="1.0" encoding="utf-8"?>宣示它是xml文件生龙活虎律。但哪怕未有行使---始于,也不会有如何影响。

  2. yaml中使用"#"作为注释符,能够注释整行,也得以注释行内从"#"初步的剧情。

  3. yaml中的字符串平时并非加其他引号,即便它富含了几许特殊字符。但稍事景况下,必需加引号,最广泛的是在援用变量的时候。具体见后文。

  4. 有关布尔值的书写格式,即true/false的表明形式。其实playbook中的布尔值类型特别灵活,可分为二种意况:

  5. 模块的参数: 这个时候布尔值作为字符串被ansible深入拆解分析。接纳yes/on/1/true/no/off/0/false,那时被ansible拆解剖析。例如地点示例中的update_cache=yes

  6. 非模块的参数: 当时布尔值被yaml解释器解析,完全信守yaml语法。选取不区分轻重缓急写的true/yes/on/y/false/no/off/n。比方地点的gpgcheck=noenabled=True

    提议服从ansible的官方正规,模块的布尔参数选取yes/no,非模块的布尔参数接收True/False。

1.2 列表

行使"- "(减号加三个或四个空格)作为列表项,也等于json中的数组。yaml的列表在playbook中极首要,必需得搞理解它的写法。

例如:

 - zhangsan
 - lisi
 - wangwu

还扶植内联写法:使用中括号。

[zhangsan,lisi,wangwu]

它们等价于json格式的:

[
    "zhangsan",
    "lisi",
    "wangwu"
]

再例如:

- 班名: 初中1班
  人数: 35
  班主任: 隔壁老张
  今天的任务: 扫操场

- 班名: 初中2班
  人数: 38
  班主任: 隔壁老王
  今天的任务: 搬桌子

切切实实在ansible playbook中,列表所陈述的是部分景况,它不必然要盛名称,不自然要从同贰本性能开始,只要采用"- ",它就象征圈定二个限量,范围内的项都归属该列表。比方:

---
    - name: list1              # 列表1,同时给了个名称
      hosts: localhost         # 指出了hosts是列表1的一个对象
      remote_user: root        # 列表1的属性
      tasks:                   # 还是列表1的属性

    - hosts: 192.168.100.65    # 列表2,但是没有为列表命名,而是直入主题
      remote_user: root
      sudo: yes
      tasks:

唯风流洒脱要用心的是,每贰个playbook中必得满含"hosts"和"tasks"项。更严苛地说,是每个play的一等列表必须含有这两项。有如上边包车型地铁例证中,就象征该playbook中隐含了两个play,每一个play的头号列表都带有了hosts和tasks。其实大多景色下,二个playbook中都只定义贰个play,所以唯有三个一流列表项。头号列表的各样,其实能够将其当作是ansible-playbook运维时的取舍

除此以外,playbook中某项是一个动作、叁个对象或二个实体时,平时都定义成列表的花样。见下文。

playbook 卓殊管理

ansible的playbook选拔yaml语法,它归纳地落实了json格式的事件描述。yaml之于json好似markdown之于html相似,极其简化了json的书写。在读书ansible playbook以前,很有不可贫乏把yaml的语法格式、引用格局做个梳理。

1.1 开始申明

以一个简练的playbook为例,表达yaml的大旨语法。

---
    - hosts: 192.168.100.59,192.168.100.65
      remote_user: root
      pre_tasks: 
        - name: set epel repo for Centos 7
          yum_repository: 
            name: epel7
            description: epel7 on CentOS 7
            baseurl: http://mirrors.aliyun.com/epel/7/$basearch/
            gpgcheck: no
            enabled: True

      tasks: 
# install nginx and run it
        - name: install nginx
          yum: name=nginx state=installed update_cache=yes
        - name: start nginx
          service: name=nginx state=started

      post_tasks: 
        - shell: echo "deploy nginx over"
          register: ok_var
        - debug: msg="{{ ok_var.stdout }}"
  1. yaml文件以---发端,以申明那是一个yaml文件,就好像xml文件在早先使用<?xml version="1.0" encoding="utf-8"?>声称它是xml文件少年老成律。但不怕未有动用---始发,也不会有何样震慑。

  2. yaml中使用"#"作为注释符,能够注释整行,也足以注释行内从"#"以前的剧情。

  3. yaml中的字符串日常而不是加任何引号,即便它饱含了好几特殊字符。但稍事情形下,必需加引号,最广泛的是在引用变量的时候。具体见后文。

  4. 关于布尔值的书写格式,即true/false的表明情势。其实playbook中的布尔值类型非常灵活,可分为二种情状:

  5. 模块的参数: 此时布尔值作为字符串被ansible深入剖析。选取yes/on/1/true/no/off/0/false,这时候被ansible拆解深入分析。举例地点示例中的update_cache=yes

  6. 非模块的参数: 当时布尔值被yaml解释器深入分析,完全信守yaml语法。接纳不区分朗朗上口写的true/yes/on/y/false/no/off/n。例如地点的gpgcheck=noenabled=True

    建议坚决守住ansible的法定正式,模块的布尔参数选择yes/no,非模块的布尔参数接收True/False。

1、命令串

1.3 字典

官方手册上如此称呼,其实正是key=value的另后生可畏种写法。使用"冒号 空格"分隔,即key: value。它常常当做列表项的性质。

例如:

- 班名: 初中1班
  人数: 
    总数: 35
    男: 19
    女: 16
  班主任: 
    大名: 隔壁老张
    这厮多大: 39
    这厮任教多少年: 15
  今天的任务: 扫操场

- 班名: 初中2班
  人数: 
    总数: 38
    男: 19
    女: 19
  班主任: 
    大名: 隔壁老王
    这厮多大: 30
    喜调戏女老师: True
  今天的任务: 搬桌子
     未完成任务怎么办:
        - 继续搬,直到完成
        - 写检讨

具体到playbook中,平时"虚构性"的原委都足以透过字典的措施书写,而实体化的、动作性的、对象性的剧情则应该定义为列表情势。

---
    - hosts: localhost              # 列表1
      remote_user: root
      tasks:
        - name: test1               # 子列表,下面是shell模块,是一个动作,所以定义为列表,只不过加了个name
          shell: echo /tmp/a.txt
          register: hi_var
        - debug: var=hi_var.stdout  # 调用模块,这是动作,所以也是列表
        - include: /tmp/nginx.yml   # 同样是动作,包含文件
        - include: /tmp/mysql.yml
        - copy:                     # 调用模块,定义为列表。但模块参数是虚拟性内容,应定义为字典而非列表
            src: /etc/resolv.conf   # 模块参数1
            dest: /tmp              # 模块参数2

    - hosts: 192.168.100.65           # 列表2
      remote_user: root
      vars:
        nginx_port: 80                # 定义变量,是虚拟性的内容,应定义为字典而非列表
        mysql_port: 3306
      vars_files: 
        - nginx_port.yml              # 无法写成key/value格式,且是实体文件,因此定义为列表
      tasks:
        - name: test2
          shell: echo /tmp/a.txt
          register: hi_var            # register是和最近一个动作绑定的
        - debug: var=hi_var.stdout

从下面示例的copy模块可以得出,模块的参数是虚构性内容,也能利用字典的点子定义。

字典格式的key/value,也支撑内联格式写法:使用大括号。

{大名: 隔壁老王,这厮多大: 30,喜调戏女老师: True}
{nginx_port: 80,mysql_port: 3306}

那等价于json格式的:

{
    "大名": "隔壁老王",
    "这厮多大": 30,
    "喜调戏女老师": "True"
}
{
    "nginx_port": 80,
    "mysql_port": 3306
}

再结合其父项,于是调换到json格式的剧情:

"班主任": {
    "大名": "隔壁老王",
    "这厮多大": 30,
    "喜调戏女老师": "True"
}

"vars": {
    "nginx_port": 80,
    "mysql_port": 3306
}

再拉长列表项(使用中括号),于是:

[
  {
    "hosts": "192.168.100.65",
    "remote_user": "root",
    "vars": {
      "nginx_port": 80,
      "mysql_port": 3306
    },
    "vars_files": [
      "nginx_port.yml"
    ],
    "tasks": [
      {
        "name": "test2",
        "shell": "echo /tmp/a.txt",
        "register": "hi_var"
      },
      {
        "debug": "var=hi_var.stdout"
      }
    ]
  }
]

ansible的playbook选取yaml语法,它大约地促成了json格式的风云描述。yaml之于json犹如markdown之于html类似,非常简化了json的书写。在上学ansible playbook在此以前,很有要求把yaml的语法格式、援用方式做个梳理。

1 --- #可有可无
2 - hosts: study #hosts: 是固定格式。study是hosts配置文件中定义的主机组
3   tasks: #任务,有模板定义的操作列表
4   - name: Copy shellscript.sh #- name:必不可少,否则检测不通过。这行就是一个描述作用
5     copy: #执行copy 操作。如果你需要其他操作,ansible-doc -l 里面是可以写入playbook的,其他的不行
6       #一下内容为参数
7       src: /abc/123.sh #文件原路径,本机路径
8       dest: /cde/123.sh #文件目的路径,拷贝到目标主机
9       mode: 0644

1.2 列表

应用"- "(减号加叁个或三个空格)作为列表项,也正是json中的数组。yaml的列表在playbook中极重大,必需得搞驾驭它的写法。

例如:

 - zhangsan
 - lisi
 - wangwu

还扶助内联写法:使用中括号。

[zhangsan,lisi,wangwu]

它们等价于json格式的:

[
    "zhangsan",
    "lisi",
    "wangwu"
]

再例如:

- 班名: 初中1班
  人数: 35
  班主任: 隔壁老张
  今天的任务: 扫操场

- 班名: 初中2班
  人数: 38
  班主任: 隔壁老王
  今天的任务: 搬桌子

实际在ansible playbook中,列表所叙述的是有个别处境,它不必然要知名称,不必然要从同叁脾性能开端,只要利用"- ",它就表示圈定二个范围,范围内的项都归属该列表。举个例子:

---
    - name: list1              # 列表1,同时给了个名称
      hosts: localhost         # 指出了hosts是列表1的一个对象
      remote_user: root        # 列表1的属性
      tasks:                   # 还是列表1的属性

    - hosts: 192.168.100.65    # 列表2,但是没有为列表命名,而是直入主题
      remote_user: root
      sudo: yes
      tasks:

唯生机勃勃要注意的是,每二个playbook中必需含有"hosts"和"tasks"项。更严谨地说,是每种play的头等列表必需包括这两项。就如上面包车型客车例子中,就代表该playbook中蕴藏了四个play,各样play的超级列表都蕴含了hosts和tasks。其实超越二分之一状态下,一个playbook中都只定义二个play,所以只有贰个大器晚成品列表项。头号列表的种种,其实可以将其看成是ansible-playbook运转时的选项

别的,playbook中某项是一个动作、一个目的或七个实体时,日常都定义成列表的款型。见下文。


 

转发请申明出处:http://www.cnblogs.com/f-ck-need-u/p/7113610.html

1.4 分行写

playbook中有3种办法进行续行。

  • 在"key: "的前边使用大于号。
  • 在"key: "的末端使用竖线。这种情势能够像脚本同样写过多行语句。
  • 多层缩进。

例如,下面的3中方法。

---
    - hosts: localhost
      tasks: 
        - shell: echo 2 >>/tmp/test.txt
            creates=/tmp/haha.txt          # 比模块shell缩进更多
        - shell: >                         # 在"key: "后使用大于号
            echo 2 >>/tmp/test.txt
            creates=/tmp/haha.txt
        - shell: |                         # 指定多行命令
            echo 2 >>/tmp/test.txt
            echo 3 >>/tmp/test.txt
          args:
            creates: /tmp/haha.txt
1 ---
2 - hosts: study
3   tasks:
4   - name: execute glibc-update.sh
5     script: /study/glibc-update.sh
6     ignore_errors: yes #这里对异常做了处理,遇见error也能继续执行
7   - name: test
8     shell: echo "Hello Python"

1 #playbook执行
2 #ansible-playbook playbook文件 -f 并发进程数,注意这里并发的是进程数,不是异步,设置的时候请考量自己运维主控机计算资源
3 ansible-playbook  study.yaml -f 2

1.6 playbook和play的关系

三个playbook中能够分包七个play。每一个play都起码含有有tasks和hosts这两项,还是能包括其余非必需项,如vars,vars_files,remote_user等。tasks中得以经过模块调用定义生机勃勃各个的action。只不过,绝大比非常多时候,几个playbook都只定义二个play。

因而,大概关系为:

  • playbook: [play1,play2,play3]
  • play: [hosts,tasks,vars,remote_user...]
  • tasks: [module1,module2,...]

也正是说,种种拔尖列表都以三个play。举个例子,下边包车型客车playbook中含有了七个play。

---
    - name: list1
      hosts: localhost
      remote_user: root
      tasks:

    - hosts: 192.168.100.65
      remote_user: root
      sudo: yes
      tasks:

必要专一,有些时候play中选择了role,或然看起来未有tasks,那是因为role本人正是构成playbook的,所以并未有也没涉及。但从不利用role的时候,必需得含蓄hosts和tasks。比方:

---
  - hosts: centos
    remote_user: root
    pre_tasks: 
        - name: config the yum repo for centos 7
          yum_repository:
              name: epel
              description: epel
              baseurl: http://mirrors.aliyun.com/epel/7/$basearch/
              gpgcheck: no
          when: ansible_distribution_major_version == "7"

        - name: config the yum repo for centos 6
          yum_repository:
              name: epel
              description: epel
              baseurl: http://mirrors.aliyun.com/epel/6/$basearch/
              gpgcheck: no
          when: ansible_distribution_major_version == "6"

    roles: 
        - nginx

    post_tasks:
      - shell: echo 'deploy nginx/mysql over'
        register: ok_var
      - debug: msg='{{ ok_var.stdout }}'

1.5 向模块传递参数

模块的参数平日的话是key=value格式的,有3种传递的方法:

  • 直接写在模块后,此时需要利用"key=value"格式。那是让ansible内部去深入分析字符串。因为可分行写,所以有各类写法。
  • 写成字规范,即"key: value"。当时必要多层缩进。那是让yaml去深入分析字典。
  • 使用内置属性args,然后多层缩进定义参数列表。那是让ansible显著钦赐用yaml来深入分析。

例如:

---
    - hosts: localhost
      tasks: 
        - yum: name=unix2dos state=installed    # key=value直接传递
        - yum: 
            name: unxi2dos
            state: installed            # "key: value"字典格式传递
        - yum: 
          args:                               # 使用args传递
            name: unix2dos
            state:installed

但要注意,当模块的参数是free_form时,即格式不定,举例shell和command模块钦定要进行的下令,它不恐怕写成key/value格式,这时候不能应用方面包车型客车第二种方法。也即是说,上面第一个模块是确实无疑的,第贰个模块是错误的,因为shell模块的授命"echo haha"是随机格式的,不恐怕写成key/value格式。

---
    - hosts: localhost
      tasks: 
        - yum: 
            name: unxi2dos
            state: installed
        - shell: 
            echo haha
            creates: /tmp/haha.txt

所以,调用二个模块的法子就有了各个情势。举个例子:

---
    - hosts: localhost
      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
        - 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
#copy文件
#ansible host文件中的主机组 -m 模块名 -a "src=ansible主控绝对路径 dest=被控绝对路径"
ansible study -m copy -a "src=/study-a/123.txt dest=/study-b/123.txt"

#shell命令
#ansible host文件中的主机组 -m 模块名 -a shell命令
ansible study -m shell -a "ls -al /study"

#command 执行非系统默认命令,如:jps
ansible study -m command -a "jps"

#script执行脚本
#ansible host文件中的主机组 -m 模块名 -a ansible主控机脚本所在绝对路径
ansible study -m script -a "/study/superpython.py"

1.4 分行写

playbook中有3种情势开展续行。

  • 在"key: "的背后使用大于号。
  • 在"key: "的前面使用竖线。这种办法可以像脚本近似写过多行语句。
  • 多层缩进。

例如,下面的3中方法。

---
    - hosts: localhost
      tasks: 
        - shell: echo 2 >>/tmp/test.txt
            creates=/tmp/haha.txt          # 比模块shell缩进更多
        - shell: >                         # 在"key: "后使用大于号
            echo 2 >>/tmp/test.txt
            creates=/tmp/haha.txt
        - shell: |                         # 指定多行命令
            echo 2 >>/tmp/test.txt
            echo 3 >>/tmp/test.txt
          args:
            creates: /tmp/haha.txt

1.3 字典

法定手册上如此称呼,其实正是key=value的另生龙活虎种写法。使用"冒号 空格"分隔,即key: value。它常常当做列表项的性子。

例如:

- 班名: 初中1班
  人数: 
    总数: 35
    男: 19
    女: 16
  班主任: 
    大名: 隔壁老张
    这厮多大: 39
    这厮任教多少年: 15
  今天的任务: 扫操场

- 班名: 初中2班
  人数: 
    总数: 38
    男: 19
    女: 19
  班主任: 
    大名: 隔壁老王
    这厮多大: 30
    喜调戏女老师: True
  今天的任务: 搬桌子
     未完成任务怎么办:
        - 继续搬,直到完成
        - 写检讨

实际到playbook中,通常"虚构性"的始末都足以经过字典的主意书写,而实体化的、动作性的、对象性的内容则应当定义为列表情势。

---
    - hosts: localhost              # 列表1
      remote_user: root
      tasks:
        - name: test1               # 子列表,下面是shell模块,是一个动作,所以定义为列表,只不过加了个name
          shell: echo /tmp/a.txt
          register: hi_var
        - debug: var=hi_var.stdout  # 调用模块,这是动作,所以也是列表
        - include: /tmp/nginx.yml   # 同样是动作,包含文件
        - include: /tmp/mysql.yml
        - copy:                     # 调用模块,定义为列表。但模块参数是虚拟性内容,应定义为字典而非列表
            src: /etc/resolv.conf   # 模块参数1
            dest: /tmp              # 模块参数2

    - hosts: 192.168.100.65           # 列表2
      remote_user: root
      vars:
        nginx_port: 80                # 定义变量,是虚拟性的内容,应定义为字典而非列表
        mysql_port: 3306
      vars_files: 
        - nginx_port.yml              # 无法写成key/value格式,且是实体文件,因此定义为列表
      tasks:
        - name: test2
          shell: echo /tmp/a.txt
          register: hi_var            # register是和最近一个动作绑定的
        - debug: var=hi_var.stdout

从上边示例的copy模块能够摄取,模块的参数是设想性内容,也能选用字典的方法定义。

字典格式的key/value,也支撑内联格式写法:使用大括号。

{大名: 隔壁老王,这厮多大: 30,喜调戏女老师: True}
{nginx_port: 80,mysql_port: 3306}

那等价于json格式的:

{
    "大名": "隔壁老王",
    "这厮多大": 30,
    "喜调戏女老师": "True"
}
{
    "nginx_port": 80,
    "mysql_port": 3306
}

再结合其父项,于是调换到json格式的内容:

"班主任": {
    "大名": "隔壁老王",
    "这厮多大": 30,
    "喜调戏女老师": "True"
}

"vars": {
    "nginx_port": 80,
    "mysql_port": 3306
}

再增多列表项(使用中括号),于是:

[
  {
    "hosts": "192.168.100.65",
    "remote_user": "root",
    "vars": {
      "nginx_port": 80,
      "mysql_port": 3306
    },
    "vars_files": [
      "nginx_port.yml"
    ],
    "tasks": [
      {
        "name": "test2",
        "shell": "echo /tmp/a.txt",
        "register": "hi_var"
      },
      {
        "debug": "var=hi_var.stdout"
      }
    ]
  }
]

此地写点笔者在ansible常用成效

正文目录:
1.1 开首证实
1.2 列表
1.3 字典
1.4 分行写
1.5 向模块传递参数
1.6 playbook和play的关系
1.7 playbook中怎样时候利用引号

Ansible 是近来特别盛行的DevOps工具
结构什么的本身就不在此赘述了,网络风度翩翩找一群

在推行一些升任脚本时频频心余力绌得到平常的结果,可是大家早已做到了颇负的任务。

本文由分分快三计划发布,转载请注明来源

关键词: 分分快三计划 Linux服务篇