目录
1.简介:
ansbile-playbook是一系统ansible命令的集合,其利用yaml 语言编写,运行过程,ansbile-playbook命令根据自上而下的顺序依次执行。同时,playbook开创了很多特性,它可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容并附为变量,然后在另一台机器中使用,这使得你可以实现一些复杂的部署机制
playbook通过ansible-playbook命令使用,它的参数和ansible命令类似,如参数-k(–ask-pass) 和 -K (–ask-sudo) 来询问ssh密码和sudo密码,-u指定用户,这些指令也可以通过规定的单元写在playbook 。
ansible-playbook的简单使用方法: ansible-playbook example-play.yml
编写格式
Playbook是以YAML格式编写的文本文件,通常使用扩展名yml保存。Playbook使用空格字符缩进来表示其数据结构。YAML对用于缩进的空格数量没有严格的要求,但有两个基本的规则:
- 处于层次结构中同一级别的数据元素(例如同一列表中的项目)必须具有相同的缩进量。
- 如果项目属于其他项目的子项,其缩进量必须大于父项
只有空格字符可用于缩进,不允许使用tab键。约定俗成的缩进量一般是一级2个空格。
Playbook开头的一行由三个破折号(---)组成,这是文档开始标记。其末尾可能使用三个圆点(...)作为文档结束标记,尽管在实践中这通常会省略。
2.实例
现在我们编写一个playbook,以创建用户xiaohu为例(单任务)
//编写脚本
[root@ansible playbook]# cat user.yml
---
- hosts: 192.168.75.128
tasks:
- name: useradd hu
user:
name: hu
state: present
//结果
[root@ansible opt]# ansible-playbook playbook/user.yml
PLAY [192.168.75.128] *************************************************************************
TASK [Gathering Facts] ************************************************************************
ok: [192.168.75.128]
TASK [useradd hu] *****************************************************************************
changed: [192.168.75.128]
PLAY RECAP ************************************************************************************
192.168.75.128 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
编写一个playbook,安装httpd并设置开机自启(多任务)
编写playbook
[root@ansible playbook]# cat httpd.yml
---
- name: setup httpd with enabled
hosts: 192.168.75.128 //受控主机ip
tasks:
- name: install httpd
yum: //使用yum模块
name: httpd //指定httpd服务
state: latest //安装
- name: service is enabled
service:
name: httpd
enabled: true
//执行yml文件,查看结果
[root@ansible opt]# ansible-playbook playbook/httpd.yml
PLAY [setup httpd with enabled] ***************************************************************
TASK [Gathering Facts] ************************************************************************
ok: [192.168.75.128]
TASK [install httpd] **************************************************************************
ok: [192.168.75.128]
TASK [service is enabled] *********************************************************************
changed: [192.168.75.128]
PLAY RECAP ************************************************************************************
192.168.75.128 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
提高输出详细程度
ansible-playbook命令提供的默认输出不提供详细的任务执行信息。ansible-playbook -v命令提供了额外的信息,总共有四个级别。
配置Playbook执行的输出详细程序
选项 | 描述 |
---|---|
-v | 显示任务结果 |
-vv | 任务结果和任务配置都会显示 |
-vvv | 包含关于与受管主机连接的信息 |
-vvvv | 增加了连接插件相关的额外详细程序选项,包括受管主机上用于执行脚本的用户以及所执行的脚本 |
3.语法验证
在执行playbook之前,最好要进行验证,确保其内容的语法正确无误。ansible-playbook命令提供了一个--syntax-check选项,可用于验证playbook的语法。
正确
[root@ansible playbook]# ansible-playbook --syntax-check httpd.yml
[WARNING]: Unable to parse /etc/ansible/inventory as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit
localhost does not match 'all'
[WARNING]: Could not match supplied host pattern, ignoring: 192.168.75.128
playbook: httpd.yml //出现这个即是成功
失败
[root@ansible playbook]# ansible-playbook --syntax-check user.yml
[WARNING]: Unable to parse /etc/ansible/inventory as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit
localhost does not match 'all'
ERROR! 'task' is not a valid attribute for a Play
The error appears to be in '/opt/playbook/user.yml': line 2, column 3, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
---
- name: //这里显示这个地方有语法错误
^ here
4.实施多个play
下面以httpd和mysql连个服务的安装举例
---
- name: install http
hosts: 192.168.75.128
tasks:
- name: install //运用yum模块安装httpd
yum:
name: httpd
status: present
- name: enabled //设置httpd服务开机自启
service:
name: httpd
enabled: true
- name: mysql
hosts: 192.168.128
tasks:
- name: isntall //设置mysql开机自启
service:
name: mariadb
enabled: true
5.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 Company
123 Main Street
Atlanta, GA 30303
要编写多行字符串,还可以使用大于号字符来表示换行字符转换成空格并且行内的引导空白将被删除。这种方法通常用于将很长的字符串在空格字符处断行,使它们跨占多行来提高可读性。
fold_newlines: >
This is an example
of a long string,
that will become
a 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]