playbook

https://www.ywcsb.vip/blog/135.html

https://blog.csdn.net/qq_41960479/article/details/124983995

YAML语法简介:

在单一文件第一行,用连续三个连字号"-" 开始,还有选择性的连续三个点号( ... )用来表示文件的结尾
次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
使用#号注释代码
缩进必须是统一的,不能空格和tab混用
缩进的空格数不重要,只要相同层级的元素左对齐即可,使用缩进表示层级关系。
YAML文件内容是区别大小写的,key/value的值均需大小写敏感
多个key/value可同行写也可换行写,同行使用,分隔
key后面冒号要加一个空格 比如: key: value
value可是个字符串,也可是另一个列表
YAML文件扩展名通常为yml或yaml

 

数据类型

YAML 支持以下几种数据类型:

对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
纯量(scalars):单个的、不可再分的值
 

YAML 数组

列表由多个元素组成,且所有元素前均使用“-”打头。并且 - 后有一个空格, 或者将所有 元素用 [ ] 括起来放在同一行

- Apple
- Orange
- Strawberry
- Mango

[Apple,Orange,Strawberry,Mango]

YAML 字典

字典由多个key与value构成,key和value之间用 :分隔, 并且 : 后面有一个空格,所有k/v可以放在一 行,或者每个 k/v 分别放在不同行

范例:

#使用缩进的方式
martin:
  name: Martin D'vloper
  job: Developer
  skill: Elite
#key对应value,字典列表
- martin:
    name: Martin D'vloper
    job: Developer
    skills:
      - python
      - perl
      - pascal
- tabitha:
    name: Tabitha Bitumen
    job: Developer
    skills:
      - lisp
      - fortran
      - erlang
#流集合
---
martin: {name: Martin D'vloper, job: Developer, skill: Elite}
fruits: ['Apple', 'Orange', 'Strawberry', 'Mango']
#几种形式指定布尔值(true/false)
create_key: yes
needs_agent: no
knows_oop: True
likes_emacs: TRUE
uses_cvs: false

 

#使用yaml表示一个家庭
name: John Smith
age: 41
gender: Male
spouse: { name: Jane Smith, age: 37, gender: Female } # 写在一行里
 name: Jane Smith   #也可以写成多行
 age: 37
 gender: Female
children: [ {name: Jimmy Smith,age: 17, gender: Male}, {name: Jenny Smith, age: 
13, gender: Female}, {name: hao Smith, age: 20, gender: Male } ]  #写在一行
 - name: Jimmy Smith    #写在多行,更为推荐的写法
   age: 17
   gender: Male
 - {name: Jenny Smith, age: 13, gender: Female}
 - {name: hao Smith, age: 20, gender: Male }

 

三种常见的数据格式:

XML:Extensible Markup Language, 可扩展标记语言,可用于数据交换和配置。

JSON:JavaScript Object Notation,JavaScript对象标记法,主要用来数据交换或配置,不支持注释

YAML:主要用来配置,大小写敏感,不支持tab。

 可以用工具互相转换:https://www.json2yaml.com

 

官方文档

https://docs.ansible.com/ansible/latest/reference_appendices/playbooks_keywords.html

一个playbook中由多个组件组成,其中所用到的常见组件类型如下:

Hosts 执行的远程主机列表
Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最 少元素需包括 name 和 task,一个name只能包括一个task
Variables 内置变量或自定义变量在playbook中调用
Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此 会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地 长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断

 

hosts组件

Hosts:playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用 于指定要执行指定任务的主机,须事先定义在主机清单中

one.example.com
one.example.com:two.example.com
192.168.1.50
192.168.1.*
Websrvs:dbsrvs     #或者,两个组的并集
Websrvs:&dbsrvs   #与,两个组的交集
webservers:!dbsrvs  #在websrvs组,但不在dbsrvs组

 案例:

- hosts: websrvs:appsrvs

 

remote_user组件

remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可 用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户

---
- hosts: websrvs
 remote_user: root #指定任务执行默认用户
  
 tasks:
   - name: test connection
     ping:
     remote_user: xiang
     sudo: yes #默认sudo为root
     sudo_user:Test    #sudo为Test

 

task列表和action组件

play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主 机上执行,即在所有主机上完成第一个task后,再开始第二个task task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着 多次执行是安全的,因为其结果均一致

每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。 如果未提供name,则action的结果将用于输出

task的两种格式

action: module arguments  #示例: action: shell wall hello 
module: arguments   #建议使用 #示例: shell: wall hello 

 注意:

shell和command模块后面跟命令,而非key=value

---
- hosts: websrvs
  remote_user: root
  gather_facts: no
  
  tasks:
   - name: install httpd
     yum: name=httpd 
   - name: start httpd
     service: name=httpd state=started enabled=yes

 




 

posted @ 2022-06-05 17:36  linuxws  阅读(191)  评论(0编辑  收藏  举报