一、playbook的使用
1.ansible的playbook与临时命令
临时命令可以对一组目标主机进行一项简单的任务。要发挥ansible的真正力量,还需要了解如何使用playbook轻松的对一组目标主机执行多项复杂的任务
playbook是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表
Play可以将一系列冗长而复杂的手动管理任务转变为可轻松重复的例程,并且具有可预测的成功成果。在playbook中,可以将play内的任务序列保存为人类可读并可立即运行的形式。根据任务的编写方式,任务本身记录了部署应用或基础架构所需的步骤
2.临时命令改写为playbook
之前所熟知的ansible临时命令都可以使用playbook来编写
下面我们举一个例子,看看这条命令在playbook中如何编写
[root@ansible ~]# ansible all -m user -a 'name=tongxue uid=4999 state=present'
这个命令用playbook应该这样写:
[root@ansible ~]# vim user.yml
[root@ansible ~]# cat user.yml
---
- name: create user
hosts: all
tasks:
- name: create user tongxue uid 4999
user:
name: tongxue
uid: 4999
state: present
[root@ansible ~]#
Playbook是以YAML格式编写的文本文件,通常以.yml结尾。Playbook使用空格字符缩进来表示其数据结构。YAML对用于缩进的空格数量没有严格的要求,但有两个基本的规则:
-
处于层次结构中同一级别的数据元素(例如同一列表中的项目)必须具有相同的缩进量。
-
如果项目属于其他项目的子项,其缩进量必须大于父项
不过我们在编写playbook时,通常以2的倍数来进行缩进子项的缩进比它的父项的缩进要多两个,这样做更加的易读
playbook的开头一行由三个—(—)来进行分隔,这是文档开头的标记。其中的每个项目用一个—(-)来开头,所以playbook编写的格式如下:
---
- name1: name
hosts: 1.1.1.1
tasks:
- tasks1
- tasks2
- name2
hosts: 2.2.2.2
tasks:
- tasks3
- tasks4
- name3
hosts: 3.3.3.3
tasks:
- tasks5
- tasks6
其中tasks是按顺序实际列出要在受管主机上运行的任务。列表中各项任务本身是一个键值对集合。
以上面创建用户的playbook为例,play中唯一任务有两个键:
- name是记录任务用途的可选标签。最好命名所有的任务,从而帮助记录自动流程中的每一步用途。
- user是要为这个任务运行的模块。其参数作为一组键值对传递,它们是模块的子项(name、uid和state)。
下面再来看一个含有多项任务的tasks属性案例:
---
- name: test
hosts: all
tasks:
- name: create user tongxue uid 4999
user:
name: tongxue
uid: 4999
state: present
- name: web server is enable
service:
name: httpd
enabled: yes
- name: ntp server is enable
service:
name: chronyd
enabled: yes
- name: vsftpd server is enable
service:
name: vsftpd
enabled: yes
playbook中play和任务列出的顺序很重要,因为Ansible会按照相同的顺序运行它们
3.运行playbook
absible-playbook命令可用于运行playbook。该命令在控制节点上执行,要运行的playbook的名称则作为参数
[root@ansible ~]# ansible-playbook test.yml
以下示例中显示了一个简单的playbook的内容,后面是运行它的结果
[root@ansible ~]# cat test.yml
---
- name: setup web server
hosts: 192.168.10.201
tasks:
- name: install httpd
yum:
name: httpd
state: latest
- name: service is enabled
service:
name: httpd
state: started
enabled: yes
[root@ansible ~]# ansible-playbook test.yml
PLAY [setup web server] **********************************************************************************
TASK [Gathering Facts] ***********************************************************************************ok: [192.168.10.201]
TASK [install httpd] *************************************************************************************ok: [192.168.10.201]
TASK [service is enabled] ********************************************************************************changed: [192.168.10.201]
PLAY RECAP ***********************************************************************************************192.168.10.201 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@ansible ~]#
请注意,在playbook运行时,屏幕中会显示每个play和任务的name键的值。(Gathering Facts任务是一项特别的任务,setup模块通常在play启动时自动运行这项任务。)对于含有多个play和任务的playbook,设置name属性后可以更加轻松地监控playbook执行的进展。
通常而言,Ansible Playbook中的任务是幂等的,而且能够安全地多次运行playbook。如果目标受管主机已处于正确的状态,则不应进行任何更改。如果再次运行这个playbook,所有任务都会以状态OK传递,且不报告任何更改。
4.提高输出的详细程度
ansible-playbook命令提供的默认输出不提供详细的任务执行信息。ansible-playbook -v命令提供了额外的信息,总共有四个级别
配置Playbook执行的输出详细程序
选项 | 描述 |
---|---|
-v | 显示任务结果 |
-vv | 任务结果和任务配置都会显示 |
-vvv | 包含关于与受管主机连接的信息 |
-vvvv | 增加了连接插件相关的额外详细程序选项,包括受管主机上用于执行脚本的用户以及所执行的脚本 |
5.语法验证
在执行playbook之前,最好要进行验证,确保其内容的语法正确无误。ansible-playbook命令提供了一个–syntax-check选项,可用于验证playbook的语法。
下面是一个playbook的成功验证:
[root@ansible ~]# ansible-playbook --syntax-check test.yml
playbook: test.yml
[root@ansible ~]#
下面是一个playbook的验证失败:
[root@ansible ~]# ansible-playbook --syntax-check test.yml
ERROR! conflicting action statements: service, enabled
The error appears to be in '/root/test.yml': line 10, column 7, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
- name: service is enabled
^ here
[root@ansible ~]#
6.执行空运行
可以使用-C来对playbook进行空运行。这会使Ansible报告在执行该playbook时将会发生什么更改,但不会对受管主机进行任何实际的更改
注意加入该参数不会对受管主机进行任何的更改
[root@ansible ~]# ansible-playbook -C test.yml
PLAY [setup web server] **********************************************************************************
TASK [Gathering Facts] ***********************************************************************************ok: [192.168.10.201]
TASK [install httpd] *************************************************************************************ok: [192.168.10.201]
TASK [service is enabled] ********************************************************************************ok: [192.168.10.201]
PLAY RECAP ***********************************************************************************************192.168.10.201 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@ansible ~]#
7.play中的远程用户和特权升级
Play可以将不同的远程用户或特权升级设置用于play,取代配置文件中指定的默认设置。这些在play本身中与hosts或tasks关键字相同的级别上设置。
7.1 用户属性
playbook中的任务通常通过与受管主机的网络连接来执行。与临时命令相同,用于任务执行的用户帐户取决于Ansible配置文件/etc/ansible/ansible.cfg中的不同关键字。运行任务的用户可以通过remote_user关键字来定义。不过,如果启用了特权升级,become_user等其他关键字也会发生作用。
如果用于任务执行的Ansible配置中定义的远程用户不合适,可以通过在play中使用remote_user关键字覆盖
remote_user: remoteuser
7.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: setup web server
hosts: 192.168.10.201
remote_user: tongxue ##使用的用户
become: yes ##特权升级
tasks:
- name: install httpd
yum:
name: httpd
state: latest
- name: service is enabled
service:
name: httpd
state: started
enabled: yes
8.playbook的语法
注释
注释也可以用于提高可读性。在YAML中,编号或井号字符(#)右侧的所有内容都是注释。如果注释的左侧有内容,请在该编号符号的前面加一个空格。
# this is a yaml
- name: setup web server # this is name
字符串
YAML中通常使用单引号或双引号来括起一段字符串
- name: install httpd
yum:
name: 'httpd'
state: "latest"
编写多行字符串有两种方式。可以使用管道符表示要保留字符串中的换行字符。
- name: add conf
lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: AddType application/x-gzip .gz .tgz
line: |
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
要编写多行字符串,还可以使用大于号字符来表示换行字符转换成空格并且行内的引导空白将被删除。这种方法通常用于将很长的字符串在空格字符处断行,使它们跨占多行来提高可读性。
- name: add conf
lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: AddType application/x-gzip .gz .tgz
line: >
AddType
application/x-httpd-php
.php
以上就是playbook的使用