1. 实施playbook

1.1 Ansible Playbook与临时命令

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

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

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

1.2 格式化Ansible Playbook

前面我们学习了临时命令模块,下面以一条命令做为案例来讲解下其在playbook中是如何编写的。

ansible 192.168.23.117 -m user -a 'name=jlin uid=1717 state=present'

这个任务可以将其编写为一个单任务的play并保存在playbook中。生成的playbook如下方所示:

---
- name: Configure important user consistentlyhosts: 192.168.23.117task:- name: jlin exists with UID 1717user:name: jlinuid: 1717state: present

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

  • 处于层次结构中同一级别的数据元素(例如同一列表中的项目)必须具有相同的缩进量。
  • 如果项目属于其他项目的子项,其缩进量必须大于父项

只有空格字符可用于缩进,不允许使用tab键。约定俗成的缩进量一般是一级2个空格。

Playbook开头的一行由三个破折号(—)组成,这是文档开始标记。其末尾可能使用三个圆点(…)作为文档结束标记,尽管在实践中这通常会省略。

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

- apple
- orange
- grape

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

- name: deploy apachehosts: webservertasks:- first- second- third

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

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

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

下面再来看一个含有多项任务的tasks属性案例:

tasks:- name: install httpdyum:name: httpdstate: present- name: deploy httpd.serviceservice:name: httpdstate: startedenabled: yes

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

1.3 运行playbook

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

ansible-playbook index.yml

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

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

[root@JLin lamp]# vim mysql/mysql.yml
---
- name: deploy mysqlhosts: sqlservertasks:- name: install mariadbyum:name=mariadb state=presentname=mariadb-server state=present- name: deploy mariadbservice:name=maridab state=started enabled=yes
[root@JLin lamp]# ansible-playbook mysql/mysql.ymlPLAY [deploy mysql] *************************************************************************TASK [Gathering Facts] **********************************************************************
ok: [sqlserver]TASK [install mariadb] **********************************************************************
changed: [sqlserver]TASK [deploy mariadb] ***********************************************************************
changed: [sqlserver]PLAY RECAP **********************************************************************************
sqlserver                  : ok=3    changed=2    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传递,且不报告任何更改。

1.4 提高输出的详细程度

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

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

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

1.5 语法验证

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

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

[root@JLserver playdemo]# ansible-playbook --syntax-check webserver.yml
playbook: webserver.yml

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

下例演示了一个playbook语法验证失败的情况:

[root@JLin lamp]# ansible-playbook index.yml
ERROR! We were unable to read either as JSON nor YAML, these are the errors we got from each:
JSON: Expecting value: line 1 column 1 (char 0)Syntax Error while loading YAML.mapping values are not allowed in this contextThe error appears to be in '/lamp/mysql/mysql.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: mariadb-serverstate: present^ here

1.6 执行空运行

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

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

ansible-playbook -C webserver.yml

2. 实施多个play

2.1 缩写多个play

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

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

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

以下示例显示了含有两个play的简单playbook。第一个play针对192.168.23.117运行,第二个play则针对172.16.103.131运行。

---
# This is a simple playbook with two plays- name: first playhosts: 192.168.23.117tasks:- name: first taskyum:name: httpdstatus: present- name: second taskservice:name: httpdenabled: true- name: second playhosts: 172.16.103.131tasks:- name: first taskservice:name: mariadbenabled: true

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

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

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

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

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

become_method: sudo

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

become_user: privileged_user

以下示例演示了如何在play中使用这些关键字:

- name: /etc/hosts is up to datehosts: 192.168.23.117remote_user: automationbecome: yestasks:- name: 192.168.23.117 in /etc/hostslineinfile:path: /etc/hostsline: '192.168.23.117 web1.example.com'state: present

2.3 查找用于任务的模块

2.3.1 模块文档

Ansible随附打包的大量模块为管理员提供了许多用于常见管理任务的工具

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

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

ansible-doc -l

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

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

ansible-doc命令还提供-s选项,它会生成示例输出,可以充当如何在playbook在使用特定模块的示范。此输出可以作为起步模板,包含在实施该模块以执行任务的playbook中。输出中包含的注释,提醒管理员各个选项的用法。下例演示了yum模块的这种输出:

ansible-doc -s yum

使用ansible-doc命令可以查找和了解如何使用模块。尽管command、shell和raw模块的用法可能看似简单,但在可能时,应尽量避免在playbook中使用它们因为它们可以取胜任意命令,因此使用这些模块时很容易写出非幂等的playbook。

例如,以下使用shell模块的任务为非幂等。每次运行play时,它都会重写/etc/resolv.conf,即使它已经包含了行nameserver 172.16.103.2。

- name: Non-idepotent approach with shell moduleshell: echo "nameserver 172.16.103.2" > /etc/resolv.conf

可以通过多种方式编写以幂等方式使用shell模块的任务,而且有时候进行这些更改并使用shell是最佳的做法。但更快的方案或许是使用ansible-doc发现copy模块,再使用它获得所需的效果。

在以下示例中,如果/etc/resolv.conf文件已包含正确的内容,则不会重写该文件:

- name: Idempotent approach with copy modulecopy:dest: /etc/resolv.confcontent: "nameserver 172.16.103.2\n"

copy模块可以测试来了解是否达到了需要的状态,如果已达到,则不进行任何更改。shell模块容许非常大的灵活性,但需要格外小心,从而确保它以幂等方式运行。

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

2.3.2 Playbook语法变化

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

# This is a YAML comment
some data # This is also a YAML comment

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

this is a string'this is another string'"this is yet another a string"

编写多行字符串有两种方式。可以使用管道符表示要保留字符串中的换行字符。

include_newlines: |Example Company123 Main StreetAtlanta, GA 30303

要编写多行字符串,还可以使用大于号字符来表示换行字符转换成空格并且行内的引导空白将被删除。这种方法通常用于将很长的字符串在空格字符处断行,使它们跨占多行来提高可读性。

fold_newlines: >This is an exampleof a long string,that will becomea single sentence once folded.

YAML字典
下面是一个简单的字典形式:

name: svcrole
svcservice: httpd
svcport: 80

字典也可以使用以大括号括起的内联块格式编写,如下所示:

{name: svcrole, svcservice: httpd, svcport: 80}

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

YAML列表
最简单的列表如下:

hosts:- servera- serverb- serverc

列表也有以中括号括起的内联格式,如下所示:

hosts: [servera, serverb, serverc]

我们应该避免使用此语法,因为它通常更难阅读。

2.3.3 过时的“键=值” playbook简写

某些playbook可能使用较旧的简写方法,通过将模块的键值对放在与模块名称相同的行上来定义任务。例如,你可能会看到这种语法:

    - name: start php-fpm serviceservice: name: php-fpm state: started enabled: yes

通常我们应该将这样的语法编写为如下所示:

    - name: start php-fpm serviceservice:name: php-fpmstate: startedenabled: yes

通常我们应避免简写形式,而使用普通形式。

Ansible-playbook的使用相关推荐

  1. ansible笔记(11):初识ansible playbook(二)

    ansible笔记(11):初识ansible playbook(二)有前文作为基础,如下示例是非常容易理解的:--- - hosts: test211remote_user: roottasks:- ...

  2. Python+Django+Ansible Playbook自动化运维项目实战(二)

    Python+Django+Ansible Playbook自动化运维项目实战 一.资产管理,自动化发现.扫描 1.服务端资产探测.扫描发现 1)资产管理的资产: 2)抽象与约定: 2.探测协议和模块 ...

  3. Python+Django+Ansible Playbook自动化运维项目实战:资产管理

    Python+Django+Ansible Playbook自动化运维项目实战 一.资产管理,自动化发现.扫描 1.服务端资产探测.扫描发现 1)资产管理的资产: 2)抽象与约定: 2.探测协议和模块 ...

  4. Ansible playbook

    1.什么是playbook playbook :定义一个文本文件,以yml为后缀结尾,那playbook组成如下. play:定义的是主机的角色 task: 定义的是具体执行的任务 总结:playbo ...

  5. Ansible 学习总结(2)—— Ansible playbook 入门详解

    一.Ansible playbook 简单概述 playbook 是 ansible 用于配置,部署,和管理被控节点的剧本.通过 playbook 的详细描述,执行其中的一系列 tasks ,可以让远 ...

  6. Ansible playbook

    一.Ansible playbook 简介和使用场景 1.简介 playbook 是 ansible 用于配置,部署,和管理被控节点的剧本. 通过 playbook 的详细描述,执行其中的一系列 ta ...

  7. ansible playbook详细教程(笔记)

    ctrl F  执行playbook命令   ansible ­playbook -­i "inventory文件名" playbook.yml ­f 10 (并行级别10) 加参 ...

  8. ansible———playbook剧本

    ansible--playbook剧本 文章目录 ansible--playbook剧本 一.主机清单 二.Yaml文件 三.playbook剧本 四.Handlers介绍 五.条件测试 一.主机清单 ...

  9. Seventh5: YAML syntax Ansible Playbook Ansible variables summaries and QQS | Cloud computing

    云计算专题目录 Catalogue | Cloud computing Seventh5: YAML syntax & Ansible Playbook & Ansible varia ...

  10. ansible playbook脚本获取系统版本信息

    ansible playbook脚本获取系统版本信息 执行环境说明 脚本执行过程中实测系统为 redhat6.redhat7 suse11 suse12: [root@ansible_host ~]# ...

最新文章

  1. MPB:扬州大学王梦芝组-反刍动物瘤胃原虫18S rRNA测序分析技术
  2. oracle右对齐,Oracle 学习笔记(基础)
  3. win10+tensorflow:ImportError: No module named '_pywrap_tensorflow_internal',这波操作真让人窒息
  4. 自然语言理解难在哪儿?
  5. Python DataFrame删除某一列中包含的特定元素所在的行
  6. location 匹配规则 (NGINX)
  7. Silverlight 解谜游戏 之四 粒子特效
  8. Linux: chm转HTML How to Convert chm files to HTML or PDF files
  9. java 判断一个词是不是成语_Java 判断字符串a和b是否互为旋转词
  10. python程序设计教程上海交通大学_上海交通大学 python程序设计课程PPT Ch2.ppt
  11. IE选项中的高级选项卡“启用内存保护帮助减少联机攻击”是灰色的,不能把前面的勾选取消掉
  12. 阿里重磅开源中后台UI解决方案Fusion
  13. Tensorflow——placeholder(矩阵运算小实例)
  14. python心跳包原理_Python 用心跳(UDP包)探测不活动主机
  15. git删除中间某个commit
  16. Spring Boot集成Spring Data Reids和Spring Session实现Session共享(多个不同的应用共用一个Redis实例)...
  17. 计算机表格折线图添加图例,如何将Excel表格中插入的折线图中的圆圈设置为方块或三角形...
  18. 细胞亚器互作综述解读~~~The secret conversations inside cells
  19. DIV+CSS中标签dl dt dd常用的用法
  20. 如何用u盘安装win7系统安装步骤教程

热门文章

  1. spring 内部类注入方式
  2. 人工智能的基本概念与分类
  3. AP3266 DC-DC大功率同步降压恒流芯片 过EMC三级 摩托电动汽车灯IC
  4. javascript之奇淫巧技
  5. 奇淫巧技,springboot 全局日期格式化处理,有点香!
  6. html过滤器作用,vue.js过滤器有什么用?
  7. vivado:解读xdc约束文件
  8. easyswoole数据库连接池_easyswoole快速实现一个网站的api接口程序
  9. mysql sum()函数及减法
  10. 使用Java实现串口通信(二)