ansible 剧本 playbook 使用

本贴最后更新于 259 天前,其中的信息可能已经事过境迁

1.playbook 语法

临时命令可以作为一次性命令对一组目标主机运行一项简单的任务。不过,若要真正发挥 Ansible 的力量,需要了解如何使用 playbook 以便轻松重复的方式对一组目标主机执行多项复杂的任务。

play 是针对清单中选定的主机运行的一组有序任务。playbook 是一个文本文件,其中包含由一个或多个按特定顺序运行的 play 组成的列表。

Play 可以将一系列冗长而复杂的手动管理任务转变为可轻松重复的例程,并且具有可预测的成功成果。在 playbook 中,可以将 play 内的任务序列保存为人类可读并可立即运行的形式。根据任务的编写方式,任务本身记录了部署应用或基础架构所需的步骤。

1.1 格式化 Ansible Playbook

将 ansible 转换为 playbook

ansible 172.16.103.129 -m user -a 'name=runtime uid=4000 state=present'

生成的 playbook 如下方所示:

---
- name: Configure important user consistently
  hosts: 172.16.103.129
  task:
    - name: runtime exists with UID 4000
      user:
        name: runtime
        uid: 4000
        state: present

Playbook 使用空格字符缩进来表示其数据结构。YAML 对用于缩进的空格数量没有严格的要求,但有两个基本的规则:

处于层次结构中同一级别的数据元素(例如同一列表中的项目)必须具有相同的缩进量。
如果项目属于其他项目的子项,其缩进量必须大于父项
只有空格字符可用于缩进,不允许使用 tab 键。约定俗成的缩进量一般是一级 2 个空格。
Playbook 开头的一行由三个破折号(—)组成,这是文档开始标记。其末尾可能使用三个圆点(…)作为文档结束标记,尽管在实践中这通常会省略。

在这两个标记之间,会以一个 play 列表的形式来定义 playbook。YAML 列表中的项目以一个破折号加空格开头。例如,YAML 列表可能显示如下:

- apple
- orange
- grape

Play 本身是一个键值对集合。同一 play 中的键应当使用相同的缩进量。以下示例显示了具有三个键的 YAML 代码片段。前两个键具有简单的值。第三个将含有三个项目的列表作为值。

- name: just an example
  hosts: webservers
  tasks:
    - first
    - second
    - third

作为 play 中的一部分,tasks 属性按顺序实际列出要在受管主机上运行的任务。列表中各项任务本身是一个键值对集合。

---
- name: Configure important user consistently
  hosts: 172.16.103.129
  task:
    - name: runtime exists with UID 4000
      user:
        name: runtime
        uid: 4000
        state: present

还以上面创建用户的 play 为例,play 中唯一任务有两个键:

name 是记录任务用途的可选标签。最好命名所有的任务,从而帮助记录自动流程中的每一步用途。
user 是要为这个任务运行的模块。其参数作为一组键值对传递,它们是模块的子项(name、uid 和 state)。
下面再来看一个含有多项任务的 tasks 属性案例:

tasks:
  - name: web server is enabled
    service:
      name: httpd
      enabled: true
      
  - name: NTP server is enabled
    service:
      name: chronyd
      enabled: true
      
  - name: Postfix is enabled
    service:
      name: postfix
      enabled: true

playbook 中 play 和任务列出的顺序很重要,因为 Ansible 会按照相同的顺序运行它们。

1.3 运行 playbook

absible-playbook 命令可用于运行 playbook。该命令在控制节点上执行,要运行的 playbook 的名称则作为参数传递。

ansible-playbook site.yml

在运行 playbook 时,将生成输出来显示所执行的 play 和任务。输出中也会报告执行的每一项任务的结果。

以下示例中显示了一个简单的 playbook 的内容,后面是运行它的结果。

[cloudroot@office-ops-ansible ~]$cat webserver.yaml 
---
- name: play to setup web server
  hosts: webserver
  become: yes
  tasks:
  - name: latest httpd version installed
    yum:
      name: httpd
      state: latest
      
  - name: service is enabled
    service:
      name: httpd
      enabled: true
      
[cloudroot@office-ops-ansible ~]$ansible-playbook -i host webserver.yaml 

PLAY [play to setup web server] ******************************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [192.168.5.36]

TASK [latest httpd version installed] ************************************************************************************************************************
changed: [192.168.5.36]

TASK [service is enabled] ************************************************************************************************************************************
changed: [192.168.5.36]

PLAY RECAP ***************************************************************************************************************************************************
192.168.5.36               : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[cloudroot@office-ops-ansible ~]$ansible webserver -i host -m command -a "netstat -tunlp "
192.168.5.36 | CHANGED | rc=0 >>
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:58404           0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::58404                :::*                    LISTEN      -                   
udp        0      0 0.0.0.0:68              0.0.0.0:*                           -                   (Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)

在 playbook 运行时,屏幕中会显示每个 play 和任务的 name 键的值。(Gathering Facts 任务是一项特别的任务,setup 模块通常在 play 启动时自动运行这项任务。)对于含有多个 play 和任务的 playbook,设置 name 属性后可以更加轻松地监控 playbook 执行的进展。

通常而言,Ansible Playbook 中的任务是幂等的,而且能够安全地多次运行 playbook。如果目标受管主机已处于正确的状态,则不应进行任何更改。如果再次运行这个 playbook,所有任务都会以状态 OK 传递,且不报告任何更改。

1.4 提高输出的详细程度

ansible-playbook 命令提供的默认输出不提供详细的任务执行信息。ansible-playbook -v 命令提供了额外的信息,总共有四个级别。

配置 Playbook 执行的输出详细程序

选项   描述
-v    显示任务结果
-vv   任务结果和任务配置都会显示
-vvv  包含关于与受管主机连接的信息
-vvvv 增加了连接插件相关的额外详细程序选项,包括受管主机上用于执行脚本的用户以及所执行的脚本
1.5 语法验证

在执行 playbook 之前,最好要进行验证,确保其内容的语法正确无误。ansible-playbook 命令提供了一个–syntax-check 选项,可用于验证 playbook 的语法。

[cloudroot@office-ops-ansible ~]$ansible-playbook --syntax-check webserver.yaml 
[WARNING]: Could not match supplied host pattern, ignoring: webserver

语法错误的情况

[cloudroot@office-ops-ansible ~]$ansible-playbook --syntax-check webserver.yaml 
ERROR! We were unable to read either as JSON nor YAML, these are the errors we got from each:
JSON: No JSON object could be decoded

Syntax Error while loading YAML.
  did not find expected '-' indicator

The error appears to be in '/opt/cloudroot/webserver.yaml': line 5, column 2, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

  become: yes
 tasks:
 ^ here
1.6 执行空运行

可以使用-C 选项对 playbook 执行空运行。这会使 Ansible 报告在执行该 playbook 时将会发生什么更改,但不会对受管主机进行任何实际的更改。

下例演示了一个 playbook 的空运行,它包含单项任务,可确保在受管主机上安装了最新版本的 httpd 软件包。注意该空运行报告此任务会对受管主机产生的更改。

[cloudroot@office-ops-ansible ~]$ansible-playbook -C webserver.yaml 
[WARNING]: Could not match supplied host pattern, ignoring: webserver

PLAY [play to setup web server] ******************************************************************************************************************************
skipping: no hosts matched

PLAY RECAP ***************************************************************************************************************************************************

2.实施多个 play

2.1 缩写多个 play

Playbook 是一个 YAML 文件,含有由一个或多个 play 组成的列表。记住一个 play 按顺序列出了要对清单中的选定主机执行的任务。因此,如果一个 playbook 中有多个 play,每个 play 可以将其任务应用到单独的一组主机。

在编排可能涉及对不同主机执行不同任务的复杂部署时,这会大有帮助。我们可以这样进行编写:对一组主机运行一个 play,完成后再对另一组主机运行另一个 play。

缩写包含多个 play 的 playbook 非常简单。Playbook 中的各个 play 编写为 playbook 中的顶级列表项。各个 play 是含有常用 play 关键字的列表项。
以下示例显示了含有两个 play 的简单 playbook。第一个 play 针对 172.16.103.129 运行,第二个 play 则针对 172.16.103.131 运行。

---
# This is a simple playbook with two plays

- name: first play
  hosts: 172.16.103.129
  tasks:
    - name: first task
      yum:
        name: httpd
        status: present

    - name: second task
      service:
        name: httpd
        enabled: true

- name: second play
  hosts: 172.16.103.131
  tasks:
    - name: first task
      service:
        name: mariadb
        enabled: true
2.2 play 中的远程用户和特权升级

Play 可以将不同的远程用户或特权升级设置用于 play,取代配置文件中指定的默认设置。这些在 play 本身中与 hosts 或 tasks 关键字相同的级别上设置。

become: yes

2.2.1 用户属性

playbook 中的任务通常通过与受管主机的网络连接来执行。与临时命令相同,用于任务执行的用户帐户取决于 Ansible 配置文件/etc/ansible/ansible.cfg 中的不同关键字。运行任务的用户可以通过 remote_user 关键字来定义。不过,如果启用了特权升级,become_user 等其他关键字也会发生作用。

如果用于任务执行的 Ansible 配置中定义的远程用户不合适,可以通过在 play 中使用 remote_user 关键字覆盖。

remote_user: remoteuser
2.2.2 特权升级属性

Ansible 也提供额外的关键字,从而在 playbook 内定义特权升级参数。become 布尔值关键字可用于启用或禁用特权升级,无论它在 Ansible 配置文件中的定义为何。它可取 yes 或 true 值来启用特权升级,或者取 no 或 false 值来禁用它。

become: true

done

  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    946 引用 • 943 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...