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