目 录CONTENT

文章目录

Playbook

ZiChen D
2021-07-20 / 0 评论 / 0 点赞 / 362 阅读 / 6,152 字 / 正在检测是否收录...

实施Playbook

Playbook的介绍

playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。。

Playbook的基础组件

Hosts:运行执行任务(task)的目标主机
Remote_user:在远程主机上执行任务的用户
Tasks:任务列表
Handlers:任务,与tasks不同的是只有在接受到通知时才会被触发
Templates:使用模板语言的文本文件
Variables:变量,变量替换

Playbook的特性

Playbook是以YAML格式编写的文本文件,通常使用扩展名yml保存。Playbook使用空格字符缩进来表示其数据结构。YAML对用于缩进的空格数量没有严格的要求,但有两个基本的规则:

  1. 同一级别的数据元素,缩进量必须一致
  2. 不同级别的数据元素,子项要比父项缩进量大(一般都是缩进2个字节)
  3. 只有空格字符可用于缩进,不允许使用tab键。

Playbook的语法

Playbook开头的一行由三个破折号(---)组成
只能使用空格键缩进,不允许使用tab键缩进
K/V的值可同行写,可换行写,同行使用分隔,换行以-分隔

Playbook的使用

运行Playbook

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

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

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

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

[root@master ansible]# vim /root/test.yml 
[root@master ansible]# cat /root/test.yml 
---
- hosts: 192.168.159.3          //执行任务的主机
  tasks: 			//下方输入任务
    - name: create a user       //使用的模块
      user:			//用户模块
        name: dzc		//用户名称
        uid: 3000		//指定UID
        state: present		//执行状态
[root@master ansible]# ansible-playbook /root/test.yml 

PLAY [192.168.159.3] ***************************************************************************************************************************************************************

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

TASK [create a user] ***************************************************************************************************************************************************************
changed: [192.168.159.3]

PLAY RECAP *************************************************************************************************************************************************************************
192.168.159.3              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

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

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

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

选项描述
-v显示任务结果
-vv任务结果和任务配置都会显示
-vvv包含关于与受管主机连接的信息
-vvvv增加了连接插件相关的额外详细程序选项

语法验证

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

下例演示了一个playbook成功通过语法验证:

[root@master ansible]# ansible-playbook --syntax-check /root/test.yml

playbook: /root/test.yml

执行空运行

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

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

[root@master ansible]# ansible-playbook -C /root/test.yml

PLAY [192.168.159.3] ***************************************************************************************************************************************************************

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

TASK [create a user] ***************************************************************************************************************************************************************
ok: [192.168.159.3]

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

实施多个play

缩写多个play

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

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

缩写包含多个play的playbook非常简单。Playbook中的各个play编写为playbook中的顶级列表项。各个play是含有常用play关键字的列表项。

示例:

[root@master ansible]# vim /root/test.yml 
[root@master ansible]# cat /root/test.yml 
---
- hosts: 192.168.159.3
  tasks: 
    - name: create a file
      file:
        name: ddd
        path: /root/dzc/
        state: present

    - name: Delete file
      file: 
        name: ddd
        path: /root/dzc/
        state: absent
      
- hosts: 192.168.159.6
  tasks: 
    - name: Create a directory and specify permissions
      file: 
        path: /root/dzc/
        state: directory
        mode: 0755

    - name: delete directory
      file: 
        path: /root/dzc/
        state: absent
[root@master ansible]# ansible-playbook --syntax-check /root/test.yml

playbook: /root/test.yml

用户属性与特权升级属性

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

become: true

如果启用了特权升级,则可以使用become_method关键字来定义特定play期间要使用的特权升级方法。

以下示例中指定sudo用于特权升级:

become_method: sudo

此外,启用了特权升级时,become_user关键字可定义特定play上下文内要用于特权升级的用户帐户。

become_user: privileged_user

查找模块

Ansible随附打包的大量模块为管理员提供了许多用于常见管理任务的工具。前面我们介绍了Ansible官方网站的帮助文档链接https://docs.ansible.com/。通过模块索引,可以很轻松的找到对应的模块。例如,适用于用户和服务管理的模块可以在Systems Modules下找到,而适合数据库管理的模块则可在Database Modules下找到。

对于每一个模块,Ansible官网提供了其功能摘要,以及关于如何通过模块的选项来调用各项具体功能的说明。文档还提供了实用的示例,演示各个模块的用法,以及任务中关键字的设置方法。

前面我们用到过ansible-doc -l命令。这将显示模块名称列表以及其功能的概要。
ansible-doc -l

使用ansible-doc [module name]命令来显示模块的详细文档。与Ansible官网一样,该命令提供模块功能的概要、其不同选项的详细信息,以及示例。

ansible-doc yum			//显示yum模块的帮助文档

幂等的playbook可以重复运行,确保系统处于特定的状态,而不会破坏状态已经正确的系统。

Playbook的语法变化

YAML注释

注释也可以用于提高可读性。在YAML中,编号或井号字符(#)右侧的所有内容都是注释。如果注释的左侧有内容,请在该编号符号的前面加一个空格。

YAML字符串

YAML中的字符串通常不需要放在引号里,即使字符串中包含空格。字符串可以用双引号或单引号括起。

YAML字典

字典也可以使用以大括号括起的内联块格式编写,大多数情况下应避免内联块格式,因为其可读性较低。不过,至少有一种情形中会较常使用它。当playbook中包含角色列表时,较常使用这种语法,从而更加容易区分play中包含的角色和传递给角色的变量。

YAML列表

列表也有以中括号括起的内联格式,我们应该避免使用此语法,因为它通常更难阅读。

0

评论区