playbook的使用

playbook的使用

playbook-剧本 介绍

play是针对清单中选定的主机运行的一组有序任务。playbook是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表。
playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。我们完成一个任务,例如安装部署一个httpd服务,我们需要多个模块(一个模块也可以称之为task)提供功能来完成。而playbook就是组织多个task的容器,他的实质就是一个文件,有着特定的组织格式,它采用的语法格式是YAML

playbook格式

playbook由YMAL语言编写。YAML参考了其他多种语言,包通常使用扩展名yml保存。Playbook使用空格字符缩进来表示其数据结构。YAML对用于缩进的空格数量没有严格的要求,但有两个基本的规则:
处于层次结构中同一级别的数据元素(例如同一列表中的项目)必须具有相同的缩进量。
如果项目属于其他项目的子项,其缩进量必须大于父项
只有空格字符可用于缩进,不允许使用tab键。约定俗成的缩进量一般是一级2个空格。
Playbook开头的一行由三个破折号(—)组成,这是文档开始标记。其末尾可能使用三个圆点(…)作为文档结束标记,尽管在实践中这通常会省略。
在这两个标记之间,会以一个play列表的形式来定义playbook。YAML列表中的项目以一个破折号加空格开头。例如,YAML列表可能显示如下:

- apple
- orange
- grape

playbook基础组件

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

tasks列表

1.Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务。
2.在运行playbook时(从上到下执行),如果一个host执行task失败,整个tasks都会回滚,请修正playbook中的错误,然后重新执行即可。
Task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行时幂等的,这意味着多次执行是安全的,因为其结果一致。
3.每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。如果没有定义name,‘action’的值将会用作输出信息中标记特定的task。
4.定义一个task,常见的格式:”module: options” 例如:yum: name=httpd
示例:

---
- hosts: 192.168.200.136
  tasks:
    - name: install vsftpd
      yum:
        name: vsftpd
        state: latest

    - name: vsftpd service
      service:
        name: vsftpd
        state: started
        enabled: yes
[root@localhost gg]# ansible-playbook playbook/user.yml //执行剧本命令

PLAY [192.168.200.136] ***************************************************************************

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

TASK [install vsftpd] ****************************************************************************
changed: [192.168.200.136]

TASK [vsftpd service] ****************************************************************************
changed: [192.168.200.136]

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

[root@localhost gg]# 

提高输出的详细程度

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

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

示例:

[root@localhost gg]# ansible-playbook playbook/user.yml -v
Using /opt/gg/ansible.cfg as config file

PLAY [192.168.200.136] ***************************************************************************

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

TASK [install vsftpd] ****************************************************************************
ok: [192.168.200.136] => {"changed": false, "msg": "Nothing to do", "rc": 0, "results": []}

TASK [vsftpd service] ****************************************************************************
ok: [192.168.200.136] => {"changed": false, "enabled": true, "name": "vsftpd", "state": "started", "status": {"ActiveEnterTimestamp": "Mon 2021-07-19 22:48:36 CST", "ActiveEnterTimestampMonotonic": "22516314848", "ActiveExitTimestampMonotonic": "0", "ActiveState": "active", "After": "network.target systemd-journald.socket sysinit.target basic.target system.slice", "AllowIsolate": "no", "AllowedCPUs": "", "AllowedMemoryNodes": "", "AmbientCapabilities": "", "AssertResult": "yes", "AssertTimestamp": "Mon 2021-07-19 22:48:36 CST", "AssertTimestampMonotonic": "22516299986", "Before": 
    此处省略n行
PLAY RECAP ***************************************************************************************
192.168.200.136            : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
[root@localhost gg]# 

语法验证

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

[root@localhost playbook]# ansible-playbook --syntax-check user.yml 

playbook: user.yml
[root@localhost playbook]# 

语法验证失败时,将报告语法错误。输出中包含语法问题在playbook中的大致位置。
错误playbook语法成功演示

[root@localhost playbook]# ansible-playbook --syntax-check user.yml 
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.
  mapping values are not allowed in this context

The error appears to be in '/opt/gg/playbook/user.yml': line 12, column 14, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

      name: vsftpd
        state: started
             ^ here
[root@localhost playbook]# 

执行空运行

可以使用-C选项对playbook执行空运行。这会使Ansible报告在执行该playbook时将会发生什么更改,但不会对受管主机进行任何实际的更改。测试所写的playbook会修改哪些东西。
下例演示了一个playbook的空运行,它包含单项任务,可确保在受管主机上安装了最新版本的httpd软件包。注意该空运行报告此任务会对受管主机产生的更改。

[root@localhost gg]# ansible-playbook -C playbook/user.yml 

PLAY [192.168.200.136] ***************************************************************************

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

TASK [install vsftpd] ****************************************************************************
ok: [192.168.200.136]

TASK [vsftpd service] ****************************************************************************
ok: [192.168.200.136]

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

[root@localhost gg]# 

实施多个play

Playbook是一个YAML文件,含有由一个或多个play组成的列表。记住一个play按顺序列出了要对清单中的选定主机执行的任务。因此,如果一个playbook中有多个play,每个play可以将其任务应用到单独的一组主机。
在编排可能涉及对不同主机执行不同任务的复杂部署时,这会大有帮助。我们可以这样进行编写:对一组主机运行一个play,完成后再对另一组主机运行另一个play。

- 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

play中的远程用户和特权升级

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

用户属性

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

remote_user: remoteuser

特权升级属性

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

[root@localhost playbook]# visudo //先给test1用户授权
vim playbook/aaa.yml
---
- hosts: 192.168.200.136
  tasks:
    - name: test1
      lineinfile:
        path: /etc/hosts
        line: 'hello world aabc'
        state: present

[root@localhost gg]# ansible-playbook  playbook/aaa.yml 

PLAY [192.168.200.136] ***************************************************************************
TASK [Gathering Facts] ***************************************************************************
ok: [192.168.200.136]
TASK [test1] *************************************************************************************
changed: [192.168.200.136]
PLAY RECAP ***************************************************************************************
192.168.200.136            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
[root@localhost gg]# 

[root@apache yum.repos.d]# cat /etc/hosts  //在受控主机上查看结果
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
hello world aabc
[root@apache yum.repos.d]# 

查找用于任务的模块

Ansible随附打包的大量模块为管理员提供了许多用于常见管理任务的工具。前面我们介绍了Ansible官方网站的帮助文档链接https://docs.ansible.com/。通过模块索引,可以很轻松的找到对应的模块。例如,适用于用户和服务管理的模块可以在Systems Modules下找到,而适合数据库管理的模块则可在Database Modules下找到。
对于每一个模块,Ansible官网提供了其功能摘要,以及关于如何通过模块的选项来调用各项具体功能的说明。文档还提供了实用的示例,演示各个模块的用法,以及任务中关键字的设置方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值