VPS测评 VPS推荐 VPS优惠
Linux运维

Ansible Playbook的核心组件详解

Playbook剧本是由一个或多个”play”组成的列表。它的主要功能在于,将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作。Playbook文件使用Yaml语言。


YAML 语言

YAML 语言介绍

官方网站:http://www.yaml.org

YAML:YAML Ain’t Markup Language,即YAML不是标记语言。不过,在开发的这种语言时,YAML的意思其实是:”Yet Another Markup Language”(仍是一种标记语言)。

YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingydöt Net与Oren Ben-Kiki也是这语言的共同设计者,目前很多最新的软件流行采用YAML格式的文件存放配置信息,如:ubuntu,anisble,docker,kubernetes等。

YAML 语言特性

  • YAML的可读性好
  • YAML和脚本语言的交互性好
  • YAML使用实现语言的数据类型
  • YAML有一个一致的信息模型
  • YAML易于实现
  • YAML可以基于流来处理
  • YAML表达能力强,扩展性好

YAML语法简介

  • 在单一文件第一行,用连续三个连字号”-” 开始,还有选择性的连续三个点号( … )用来表示文件的结尾
  • 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
  • 使用#号注释代码
  • 缩进必须是统一的,不能空格和tab混用
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
  • YAML文件内容是区别大小写的,key/value的值均需大小写敏感
  • 多个key/value可同行写也可换行写,同行使用,分隔
  • key后面冒号要加一个空格 比如: key: value
  • value可是个字符串,也可是另一个列表
  • YAML文件扩展名通常为yml或yaml

支持的数据类型

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

scalar 标量

key对应value

name: qinwa
age: 20

使用缩进的方式

name:
  qinwa
age:
  20

Dictionary 字典

字典由多个key与value构成,key和value之间用 冒号分隔,并且冒号后面有一个空格。

可以写在同一行也可以不同行。

account: {name: root, password: 123456}
account:
  name: root
  password: 123456

List列表

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

course: [linux,golang,python]
course: 
  - linux
  - golang
  - python

playbook 命令

ansible-playbook <filename.yml> ... [options]

选项

--syntax-check #语法检查,可缩写成--syntax,相当于bash -n
-C --check #模拟执行,只检测可能会发生的改变,但不真正执行操作,dry run
--list-hosts #列出运行任务的主机
--list-tags #列出所有标签
--list-tasks #列出所有任务
--limit 主机列表 #只针对主机列表中的特定主机执行
-i INVENTORY #指定主机清单文件,通常一个项目对应一个主机清单文件
--start-at-task START_AT_TASK #从指定task开始执行,而非从头开始,START_AT_TASK为任务的name
-v -vv -vvv #显示过程 

Playbook 核心组件

官方文档:https://docs.ansible.com/ansible/latest/reference_appendices/playbooks_keywords.html

下面会列举anible-playbook中的常用组件。

hosts 组件

A list of groups, hosts or host pattern that translates into a list of hosts that are the play’s target.

指定要执行任务的主机,需要在主机清单中提前定义。

- hosts: webservers

remote_user 组件

User used to log into the target via the connection plugin.

用来登录目标主机的用户。

- hosts: webservers
  remote_user: root

tasks组件

Main list of tasks to execute in the play, they run after roles and before post_tasks.

PLAY中执行的主要任务清单。

task按次序在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task。

task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的。

每个task都应该有它的name,用于playbook执行结果的输出,如果未提供,则action的结果将用于输出。

支持两种格式

action: module arguments
module: arguments

范例:

action: shell wall "hello world"
shell: wall "hello world"

ignore_errors组件

Boolean that allows you to ignore task failures and continue with play. It does not affect connection errors.

当某个task执行失败,忽略这次失败,继续往下执行。

---
- hosts: webservers
  tasks:
    - name: error
      command: /bin/false
      ignore_errors: yes
    - name: continue
      command: wall continue

/bin/false 会输出失败信息导致下面的任务无法执行,可以用ignore_errors跳过失败的任务,然后继续往下执行。

handlers组件

A section with tasks that are treated as handlers, these won’t get executed normally, only when notified after each section of tasks is complete. A handler’s listen field is not templatable.

只有被触发才会执行的任务。

注意:

  • 如果多个task通知了相同的handlers, 此handlers仅会在所有tasks结束后运行一 次
  • 只有notify对应的task发生改变了才会通知handlers, 没有改变则不会触发handlers
  • handlers 是在所有前面的tasks都成功执行才会执行,如果前面任何一个task失败,会导致handler跳过执行,可以使用force_handlers: yes 强制执行handler

案例:

当httpd的配置文件内容发生改变,会触发重启服务和广播消息。

---
- hosts: webservers
  gather_facts: no
  force_handlers: yes
  tasks: 
    - name: Install Httpd
      yum: name=httpd state=present
    - name: Copy Config File
      copy: src=/tmp/httpd.conf dest=/etc/httpd/conf
      notify: 
        - restart service
        - wall

  handlers:
    - name: restart service
      service: name=httpd state=restarted 
    - name: wall
      shell: wall "Config File changed"

tags组件

Tags applied to the task or included tasks, this allows selecting subsets of tasks from the command line.

tags用于为特定的任务设置标签,运行playbook时可以只运行指定标签的任务。

一个task可以有多个tag,也可以多个task对应一个tag。

关键字:

  • tagged 运行已标记
  • untagged 运行未标记
  • all 运行所有任务

案例:

假设我写了一个httpd.yml

---
- hosts: webservers
  gather_facts: no
  force_handlers: yes
  tasks: 
    - name: Install Httpd
      yum: name=httpd state=present
      tags: yum
    - name: Copy Config File
      copy: src=/tmp/httpd.conf dest=/etc/httpd/conf
      notify: 
        - restart service
        - wall
      tags: config  
  handlers:
    - name: restart service
      service: name=httpd state=restarted 
    - name: wall
      shell: wall "Config File changed"

列出所有的tags

ansible-playbook --list-tags httpd.yml 

只安装服务不修改配置

ansible-playbook -t yum httpd.yml
未经允许不得转载:青蛙主机 » Ansible Playbook的核心组件详解

VPS相关常用工具

PING测试工具自用毛子接码站