playbook
文章目录
介绍:
playbook-剧本
playbook使用yml标记语言,这是一种标记语言,这种标记语言在文件的最开始需要使用三个“-”来说明文件开始,然后使用缩进来说明代码块的范围。playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。
核心元素
Tasks:任务,由模板定义的操作列表
Variables:变量
Templates:模板,即使用模板语法的文件
Handlers:处理器 ,当某条件满足时,触发执行的操作
Roles:角色
常用格式
ansible-playbook [yaml文件名、也可以yml结尾]
常用参数:
-k(–ask-pass) 用来交互输入ssh密码
-K(-ask-become-pass) 用来交互输入sudo密码
-u 指定用户
[root@localhost playbook]# vim text.yml
--- #标记文件的开始
- name: #项目名称,可写可不写
hosts: 192.168.240.40 #指定主机组,可以是一个或者多个组
taskk: #任务列表
- name: disenaled fireallwd #关闭防火墙
service: #调用模块
name: firewalld.service #任务名称
state: stopped #防火墙状态设置为关闭状态
enabled: yes #设置防火墙开机不自启
[root@localhost playbook]# ansible-playbook text.yml #执行模块
PLAY [192.168.240.40] *********************************************************************
TASK [Gathering Facts] ********************************************************************
ok: [192.168.240.40]
TASK [disenaled fireallwd] ****************************************************************
changed: [192.168.240.40]
PLAY RECAP ********************************************************************************
192.168.240.40 : 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是以YAML格式编写的文本文件,通常使用扩展名yml保存。Playbook使用空格字符缩进来表示其数据结构。YAML对用于缩进的空格数量没有严格的要求,但有两个基本的规则:
-
处于层次结构中同一级别的数据元素(例如同一列表中的项目)必须具有相同的缩进量。
-
如果项目属于其他项目的子项,其缩进量必须大于父项
只有空格字符可用于缩进,不允许使用tab键。约定俗成的缩进量一般是一级2个空格。
Playbook开头的一行由三个破折号(—)组成,这是文档开始标记。其末尾可能使用三个圆点(…)作为文档结束标记,尽管在实践中这通常会省略。
在这两个标记之间,会以一个play列表的形式来定义playbook。YAML列表中的项目以一个破折号加空格开头。
输出的详细程度
ansible-playbook命令提供的默认输出不提供详细的任务执行信息。ansible-playbook -v命令提供了额外的信息,总共有四个级别。
选项 | 描述 |
---|---|
-v | 显示任务结果 |
-vv | 任务结果和任务配置都会显示 |
-vvv | 包含关于与受管主机连接的信息 |
-vvvv | 增加了连接插件相关的额外详细程序选项,包括受管主机上用于执行脚本的用户以及所执行的脚本 |
语法验证
在执行playbook之前,最好要进行验证,确保其内容的语法正确无误。ansible-playbook命令提供了一个–syntax-check选项,可用于验证playbook的语法。
[root@localhost playbook]# ansible-playbook --syntax-check text.yml #验证text.yml是否有语法验证
playbook: text.yml #验证成功
[root@localhost playbook]# ansible-playbook --syntax-check text.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.
did not find expected '-' indicator
The error appears to be in '/etc/ansible/playbook/text.yml': line 6, column 5, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
- name: disenaled fireallwd
service:
^ here
执行空运行
可以使用-C选项对playbook执行空运行。这会使Ansible报告在执行该playbook时将会发生什么更改,但不会对受管主机进行任何实际的更改。
[root@localhost playbook]# ansible-playbook --syntax-check text.yml #执行空运行
playbook: text.yml
[root@localhost playbook]# ansible-playbook -C text.yml
PLAY [192.168.240.40] *********************************************************************
TASK [Gathering Facts] ********************************************************************
ok: [192.168.240.40]
TASK [disenaled fireallwd] ****************************************************************
ok: [192.168.240.40]
PLAY RECAP ********************************************************************************
192.168.240.40 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
执行多个playbook
Playbook是一个YAML文件,含有由一个或多个play组成的列表。记住一个play按顺序列出了要对清单中的选定主机执行的任务。因此,如果一个playbook中有多个play,每个play可以将其任务应用到单独的一组主机。
在编排可能涉及对不同主机执行不同任务的复杂部署时,这会大有帮助。我们可以这样进行编写:对一组主机运行一个play,完成后再对另一组主机运行另一个play。
缩写包含多个play的playbook非常简单。Playbook中的各个play编写为playbook中的顶级列表项。各个play是含有常用play关键字的列表项。
[root@localhost playbook]# cat lamp.yml
---
- name: ewqe
hosts: 192.168.240.40
tasks:
- name: creat user for ttxx
yum:
name: httpd
state: present
- name: jiaoben
copy:
src: "/etc/ansible/httpd.conf"
dest: "/etc/httpd/conf/httpd.conf"
- name: php
hosts: 192.168.240.50
tasks:
- name: gpg
yum:
name: php*
state: present
- name: jiaoben
copy:
src: "/etc/ansible/www.conf"
dest: "/etc/php-fpm.d/www.conf"
- name: mysql
hosts: 192.168.240.60
tasks:
- name: create mysql
yum:
name: mysql*
state: present
- name: firewalle
service:
name: firewalld.service
state: stopped
enabled: no
[root@localhost ansible]# ansible-playbook playbook/lamp.yml #运行playbook
PLAY [ewqe] **********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.240.40]
changed: [192.168.240.40]
PLAY [php] ***********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.240.50]
TASK [create mysql] **************************************************************************************************
changed: [192.168.240.60]
TASK [firewalle] *****************************************************************************************************
changed: [192.168.240.60]
PLAY RECAP ***********************************************************************************************************
192.168.240.40 : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.240.50 : ok=6 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.240.60 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
远程用户和特权升级
Play可以将不同的远程用户或特权升级设置用于play,取代配置文件中指定的默认设置。这些在play本身中与hosts或tasks关键字相同的级别上设置。
用户属性
playbook中的任务通常通过与受管主机的网络连接来执行。与临时命令相同,用于任务执行的用户帐户取决于Ansible配置文件/etc/ansible/ansible.cfg中的不同关键字。运行任务的用户可以通过remote_user关键字来定义。不过,如果启用了特权升级,become_user等其他关键字也会发生作用。
如果用于任务执行的Ansible配置中定义的远程用户不合适,可以通过在play中使用remote_user关键字覆盖。
remote_user: 用户名
特权升级
Ansible也提供额外的关键字,从而在playbook内定义特权升级参数。become布尔值关键字可用于启用或禁用特权升级,无论它在Ansible配置文件中的定义为何。它可取yes或true值来启用特权升级,或者取no或false值来禁用它。
启用特权升级:become:rue
启用特权升级过后,便可以使用become_method关键字来定义play期间要使用的特权升级方法
启用sudo特权升级:become_method:sudo
启用了特权升级时,become_user关键字可定义特定play上下文内要用于特权升级的用户帐户。
启用特权升级用户账户:become_user: privileged_user
[root@localhost playbook]# ansible-playbook become.yml #在play中使用这些关键字
PLAY [become] ********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.240.40]
TASK [lineinfile] ****************************************************************************************************
changed: [192.168.240.40]
PLAY RECAP ***********************************************************************************************************
192.168.240.40 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@localhost playbook]# cat become.yml
---
- name: become
hosts: 192.168.240.40
remote_user: ttxx
become: yes
tasks:
- name:
lineinfile:
path: /opt/dd
line: '123456789'
state: present
playbook语法
YAML注释
注释也可以用于提高可读性。在YAML中,编号或井号字符(#)右侧的所有内容都是注释。如果注释的左侧有内容,请在该编号符号的前面加一个空格。
[root@localhost playbook]# cat become.yml
---
- name: become #这是一个注释
hosts: 192.168.240.40
remote_user: ttxx
become: yes
tasks:
- name:
lineinfile:
path: /opt/dd
line: '123456789'
state: present
YAML字符串
YAML中的字符串通常不需要放在引号里,即使字符串中包含空格。字符串可以用双引号或单引号括起。
编写多行字符串有两种方式。可以使用管道符表示要保留字符串中的换行字符。
要编写多行字符串,还可以使用大于号字符来表示换行字符转换成空格并且行内的引导空白将被删除。这种方法通常用于将很长的字符串在空格字符处断行,使它们跨占多行来提高可读性。
YAML字典
大多数情况下应避免内联块格式,因为其可读性较低。不过,至少有一种情形中会较常使用它。当playbook中包含角色列表时,较常使用这种语法,从而更加容易区分play中包含的角色和传递给角色的变量。
下面是一个简单的字典形式:
name: svcrole
svcservice: httpd
svcport: 80
字典也可以使用以大括号括起的内联块格式编写
{name: svcrole, svcservice: httpd, svcport: 80}
YAML列表
最简单的列表
text:
-ttxx1
-ttxx2
-ttxx3
列表也有以中括号括起的内联格式
tetx: [ttxx1,ttxx2,ttxx3]
列表也有以中括号括起的内联格式
tetx: [ttxx1,ttxx2,ttxx3]
playbook书写格式
普通形式的行数较多,但更容易操作。任务的关键字垂直堆叠,更容易区分。阅读play时,眼睛直接向一扫视,左右运动较少。而且,普通语法是原生的YAML。
tasks:
- name: disabled firealld
service:
name:firewalld.service
enabled: no
state: stopped