playbook

tech2024-07-28  61

playbook

实施playbook

palybook和临时命令的区别

临时命令可以作为一次性命令对一组目标主机运行一项简单的任务。playbook可以将一系列冗长而复杂的手动管理任务转变为可轻松重复的例程,并且具有可预测的成功成果。

palybook的编写格式

Playbook是以YAML格式编写的文本文件,通常使用扩展名yml保存。Playbook使用空格字符缩进来表示其数据结构。YAML对用于缩进的空格数量没有严格的要求,但有两个基本的规则: 处于层次结构中同一级别的数据元素必须具有相同的缩进量,使用缩进来表示层级关系,缩进量一般是一级2个空格,不能使用TAB键如果项目属于其他项目的子项,其缩进量必须大于父项 如果冒号后面有内容则冒号后面必须有一个空格-表示列表,-的后面必须有一个空格Playbook开头的一行由三个破折号(—)组成,这是文档开始标记。其末尾可能使用三个圆点(…)作为文档结束标记,实际环境中一般省略不写Play本身是一个键值对集合。同一play中的键应当使用相同的缩进量。

示例:

//首先创建一个用于存放palybook的目录,并在目录中创建以.yml结尾的文件 [root@ansible ~]# mkdir playbook && cd playbook && touch myplay.yml [root@ansible playbook]# ls myplay.yml //编写playbook [root@ansible playbook]# vim myplay.yml --- //开始标记 - name: control postfix service //任务描述(可选值,建议写) hosts: 192.168.86.132 //要在那台受管主机上执行 tasks: //任务内容 - name: stop postfix service //任务描述(可选值,建议写) service: //任务要使用的模块 name: postfix //参数 state: stopped //参数 enabled: no //参数

注意:在执行playbook时会按照任务编写的顺序执行(从上往下)

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

运行playbook

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

[root@ansible playbook]# ansible-playbook myplay.yml PLAY [control postfix service] ******************************************************************************************************************************************* TASK [Gathering Facts] *************************************************************************************************************************************************** ok: [192.168.86.132] TASK [stop postfix service] ********************************************************************************************************************************************** changed: [192.168.86.132] PLAY RECAP *************************************************************************************************************************************************************** 192.168.86.132 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 //详解 ok:表示完成的任务 changed:表示改变的 unreachable:表示不可读的任务 failed:表示失败的任务 skipped:表示跳过的任务 ignored:表示忽略的任务 在playbook运行时,屏幕中会显示每个play和任务的name键的值。(Gathering Facts任务是一项特别的任务,setup模块通常在play启动时自动运行这项任务。)对于含有多个play和任务的playbook,设置name属性后可以更加轻松地监控playbook执行的进展。Playbook中的任务是幂等的,而且能够安全地多次运行playbook。如果目标受管主机已处于正确的状态,则不应进行任何更改。如果再次运行这个playbook,所有任务都会以状态OK传递,且不报告任何更改。

提高输出的详细程度

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

-v #显示任务结果

-vv #任务结果和任务配置都会显示

-vvv #包含关于与受管主机连接的信息

-vvvv #增加了连接插件相关的额外详细程序选项,包括受管主机上用于执行脚本的用户以及所执行的脚本


语法验证

ansible-playbook --syntax-check选项,可用于验证playbook的语法 [root@ansible playbook]# ansible-playbook --syntax-check httpd.yml playbook: httpd.yml 如果语法错误,输出信息中会报告语法问题的大致位置。

执行空运行

可以使用-C选项对playbook执行空运行。这会使Ansible报告在执行该playbook时将会发生什么更改,但不会对受管主机进行任何实际的更改,可以理解为测试运行。 [root@ansible playbook]# ansible-playbook -C httpd.yml

实施多个play

编写多个play

Playbook是一个YAML文件,含有由一个或多个play组成的列表,如果一个playbook中有多个play,每个play可以将其任务应用到单独的一组主机。编写包含多个play的playbook非常简单。Playbook中的各个play编写为playbook中的顶级列表项。各个play是含有常用play关键字的列表项。 //示例: - name: download CentOS 7 yum hosts: 192.168.86.132 tasks: - name: download yum get_url: url: https://mirrors.aliyun.com/repo/Centos-7.repo dest: /etc/yum.repos.d - name: change CentOS 7 yum file command: sed -i 's/\$releasever/7/g' /etc/yum.repos.d/Centos-7.repo - name: install httpd hosts: 192.168.86.134 tasks: - name: install httpd yum: name: httpd state: present

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

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

用户属性

运行任务的用户可以通过remote_user关键字来定义。如果启用了特权升级,become_user等其他关键字也会发生作用。如果用于任务执行的Ansible配置中定义的远程用户不合适,可以通过在play中使用remote_user关键字覆盖。 remote_user: remoteuser

特权升级属性

Ansible也提供额外的关键字,从而在playbook内定义特权升级参数。become布尔值关键字可用于启用或禁用特权升级,使用yes或true值来启用特权升级,或者取no或false值来禁用它。 become: true 如果启用了特权升级,则可以使用become_method关键字来定义特定play期间要使用的特权升级方法。 become_method: sudo //推荐使用sudo 启用了特权升级时,become_user关键字可定义特定play上下文内要用于特权升级的用户帐户。 become_user: privileged_user //这个值一般为root

示例:

--- - hosts: 192.168.86.132 tasks: - name: useradd xx user: name: xx state: present - hosts: 192.168.86.132 remote_user: xx become: yes tasks: - name: 1.1.1.1 in /etc/hosts lineinfile: path: /etc/hosts line: '1.1.1.1 www.123.com' state: present

注意:如果要使用特权升级,还有在sudo配置文件中添加相应的权限委派,如果sudo文件设置了切换用户时不需要输入密码,则可以直接执行playbook,如果没有设置,则在执行playbook时需要加-K选项来输入密码,之后才能正常运行


任务模块的帮助文档

获取帮助文档的方式有两种:

查阅官方在线文档

查看Ansible本地帮助文档

ansible-doc -l命令可以查看模块名称列表以及其功能的概要 [root@ansible playbook]# ansible-doc -l 使用ansible-doc [module name]命令来显示模块的详细文档 [root@ansible playbook]# ansible-doc user ansible-doc命令还提供-s选项,它会生成示例输出,可以充当如何在playbook在使用特定模块的示范。 [root@ansible playbook]# ansible-doc -s user

注:应避免使用command、shell和raw模块,因为它们可以取代任意命令,因此使用这些模块时很容易写出非幂等的playbook。


playbook语法变化

YAML注释

在YAML中,分号或井号字符(#)右侧的所有内容都是注释。如果注释的左侧有内容,请在该分号符号的前面加一个空格。

YAML字符串

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

YAML字典

简单的字典形式 //键值对 name: svcrole service: httpd port: 80 字典也可以使用以大括号括起的内联块格式编写 {name: svcrole, svcservice: httpd, svcport: 80}

应避免内联块格式,因为其可读性较低。


YAML列表

简单的列表 hosts: - servera - db - webservice 列表也有以中括号括起的内联格式 hosts: [servera, db, webservice]

应该避免使用此语法,因为其可读性较低

playbook简写

某些playbook可能使用较旧的简写方法,通过将模块的键值对放在与模块名称相同的行上来定义任务。 tasks: - name: stop firewalld service: name=firewalld enabled=no state=stopped 我们应该将这样的语法编写 tasks: - name: stop firewalld service: name: firewalld enabled: no state: stopped

playbook简写

某些playbook可能使用较旧的简写方法,通过将模块的键值对放在与模块名称相同的行上来定义任务。 tasks: - name: stop firewalld service: name=firewalld enabled=no state=stopped 我们应该这样编写语法 tasks: - name: stop firewalld service: name: firewalld enabled: no state: stopped

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

最新回复(0)