创新路
我们一直在努力

Ansible之playbook

json 语法规则

  1. 数据在名称/值对中

  2. 数据由逗号分隔

  3. 大括号保存对象

  4. 中括号保存数组

  5. json 数据的书写格式是:名称/值对。

        名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值,例如:

            "key"  : "value"

            "逗逼" : "张三"

 

json 语法规则之数组

  1. 简单类型

      { "天团":

         ["张三", "李四", "王五","赵六"]

      }

  2. 复合复杂类型

      { "天团":

        [

          {"张三":"逗逼1", "等级":"1"},

          {"李四":"逗逼2", "等级":"2"},

          {"王五":"逗逼3", "等级":"3"},

          {"赵六":"逗逼4", "等级":"4"}

        ]

      }

      注意:最后一行后面没有逗号,逗号表示后面还有数据,所以最后一行没有逗号

 

yaml 是一个可读性高,用来表达数据序列的格式。

    yaml 基础语法

        1. YAML的结构通过空格来展示

        2. 数组使用"- "来表示,短横线后面必须只有一个空格!

        3. 键值对使用": "来表示,冒号后面必须只有一个空格!

        4. YAML使用一个固定的缩进风格表示数据层级结构关系

        5. 一般每个缩进级别由两个以上空格组成

        6. # 表示注释,#后面必须只有一个空格

    注意:

        1. 不要使用tab,缩进是初学者容易出错的地方之一

        2. 同一层级缩进必须对齐

        3. 分隔符号后面必须只有一个空格!

 

Yaml键值对例子

    1. 简单类型

        "张三": "逗逼"

      – 或

        "张三":

          "逗逼"

    2.复杂YAML的键值对嵌套

      "天团":

        "张三": "逗逼”

     – 或

      "天团":

       "张三":

          "逗逼"

    3. 数组类型

      ["张三", "李四", "王五", "赵六"]

    4. 高级复合表达式

        "天团":

        – 

          "张三": "逗逼1"

          "等级": 1

        – 

          "李四": "逗逼2"

          "等级": 2

        – 

          "王五": "逗逼3"

          "等级": 3

        – 

          "赵六": "逗逼4"

          "等级": 4

 

yaml高级语法

    1. | 与 > 表示对应的值为多行字符, > 与 | 的区别是会把 \n 转换为空格

    2. ! 可以设置类型,!! 可以强制类型转换

    3. 为了维持文件的简洁,并避免数据输入的错误,YAML提供了结点参考(*)和散列合并(<<)参考到其他结点标签的锚点标记(&)。参考会将树状结构加入锚点标记的内容,并可以在所有数据结构中运作,合并只有散列表可以使用,可以将键值自锚点标记复制到指定的散列表中

 

jinja2模版

  Jinja2是基于python的模板引擎,包含 变量 和 表达式两部分,这两者在模板求值的时候会被替换为值。模板中还有标签,控制模板的逻辑。

 

jinja2 模版基本语法

1. 模板的表达式都是包含在分隔符 "{{  }}" 内的;

2. 控制语句都是包含在分隔符 "{% %}" 内的;

3. 另外,模板也支持注释,都是包含在分隔符 "{# #}"内,支持块注释。

4. 调用变量

  {{varname}}

5. 计算

  {{2+3}}

6. 判断

  {{1 in [1,2,3]}}  //1是不是在数组里面出现了

jinja2 模版控制语句

  {% if name == '逗逼1' %}

    吹牛1

  {% elif name == '逗逼2' %}

    吹牛2

  {% elif name == '逗逼3' %}

    吹牛3

  {% else %}

    吹牛4

  {% endif %}

 

jinja2 模版控制语句

  {% if name == … … %}

    … …

  {% elif name == '逗逼' %}

    {% for method in [1, 2, 3, 4, 5] %}

      {{do method}}

    {% endfor %}

    … …

  {% endif %}

 

jinja2 过滤器

  1. 变量可以通过 过滤器 修改。过滤器与变量用管道符号( | )分割,并且也 可以用圆括号传递可选参数。多个过滤器可以链式调用,前一个过滤器的输出会被作为 后一个过滤器的输入。

  2. 例如:

       把一个列表用逗号连接起来: {{ list|join(', ') }}

  3. 过滤器需要的可以查询在线文档

        http://docs.jinkan.org/docs/jinja2/templates.html#builtin-filters

 

Playbook(ansible中的脚本)

  playbook 是 ansible 用于配置,部署,和管理托管主机剧本。通过 playbook 的详细描述,执行其中的一系列 tasks,可以让远端主机达到预期的状态。

playbook 语法格式

  1. playbook由 YAML 语言编写,遵循 YAML 标准

  2. 在同一行中,#之后的内容表示注释

  3. 同一个列表中的元素应该保持相同的缩进

  4. playbook 由一个或多个 play 组成

  5. play 中 hosts,variables,roles,tasks 等对象的表示方法都是键值中间以 ": " 分隔表示

  6. YAML 还有一个小的怪癖. 所有的 YAML 文件开始行都应该是 —. 这是 YAML 格式的一部分, 表明一个文件的开始playbook语法

Playbook执行结果

  绿色代表执行成功

  黄色代表系统代表系统状态发生改变

  红色代表执行失败

 

第一个playbook

  —

  – hosts: all

    remote_user: root

    tasks:

      – ping:

# 第一行,表示开始

ansible-playbook myping.yml -f 5

    1. -f 并发进程数量,默认是 5

    2. hosts 行的内容是一个或多个组或主机的 patterns,以逗号为分隔符

    3. remote_user 就是账户名

    4. tasks

    5. 每一个 play 包含了一个 task 列表(任务列表).

    6. 一个 task 在其所对应的所有主机上(通过 host pattern 匹配的所有主机)执行完毕之后,下一个 task才会执行.

    7. 有一点需要明白的是(很重要),在一个 play 之中,所有 hosts 会获取相同的任务指令,这是 play 的一个目的所在,也就是将一组选出的 hosts 映射到 task,执行相同的操作

    8. 主机之间的执行是并发的,但是执行的任务是顺序执行的


例:

  1. 给所有主机添加用户 lxy,设置默认密码 123456

  2. 要求第一次登录修改密码

    —

    – hosts: all

      remote_user: root

      tasks:

        – name: create user lxy

        – user:

            group=wheel

            uid=1000

            name=lxy

        – shell: echo 123456 | passwd –stdin lxy

        – shell: chage -d 0 lxy

 


 

客官点个赞呗! (0)
分享到:

评论 抢沙发

评论前必须登录!

天府云博 - 做有态度的开发&运维&设计学习分享平台!

联系我们百度云主机