一、Playbook简介
playbook配置文件使用YAML语法,具有简洁明了、结构清晰等特点。playbook配置文件类似于shell脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表。上面介绍的ansible命令虽然可以完成各种任务,但是当配置一些复杂任务时,逐条输入就显得效率非常低下了。更有效的方案是在playbook配置文件中放置所有的任务代码,利用ansible-playbook命令执行该文件,可以实现自动化运维。YAML文件的扩展名通常为.yaml或.yml。
二、playbook的核心元素
playbook的核心元素包含:
三、playbook格式
playbook需要注意的事项:
1、执行简单的playbook文件:
[root@ansible ~]# grep -v ^# /etc/ansible/hosts | grep -v ^$ #查看hosts中的分组信息
[web1]
192.168.1.2
[web2]
192.168.1.3
[root@ansible ~]# vim /etc/ansible/a.yml #创建a.yml文件,写入以下内容
---
- hosts: web1 #针对web1组中的操作
remote_user: root #远端执行用户身份为root
tasks: #任务列表
- name: adduser #任务名称
user: name=user1 state=present #执行user模块,创建用户
tags: #创建tag标签
- aaa #tag标签为aaa
- name: addgroup #任务名称
group: name=root system=yes #执行group模块,创建组
tags: #创建tag标签
- bbb #tag标签为bbb
- hosts: web2 #针对web2组中的操作
remote_user: root #远端执行用户身份为root
tasks: #任务列表
- name: copy file to web #任务名称
copy: src=/etc/passwd dest=/home #执行copy模块,复制文件
tags: #创建tag标签
- ccc #tag标签为ccc
...
我这里编写的playbook文件如下:
[root@ansible ~]# ansible-playbook [ option ]/etc/ansible/a.yml
其中option中的功能包括:
* --Syntax-check:检测yaml文件的语法。
* -C:预测试,不会改变目标主机的任何设置。
* --list-tasks:列出yaml文件的任务列表。
* --list-hosts:列出yaml文件影响的主机列表。
* --list-tags:列出yaml文件中的标签。
* -t TAGS:表示只执行指定标签的任务。
* --skip-tags=SKIP_TAGS:表示出了指定标签的任务,执行其他任务。
* --start-at-task=START_AT:从指定任务开始往下运行。
执行a.yml文件的示例如下:
[root@ansible ~]# ansible-playbook --Syntax-check /etc/ansible/a.yml #语法检测
playbook: /etc/ansible/a.yml #表示没有报错
[root@ansible ~]# ansible-playbook -C /etc/ansible/a.yml #对a.yml进行预测试
.................#省略部分内容
192.168.1.2 : ok=3 changed=1 unreachable=0 Failed=0
192.168.1.3 : ok=2 changed=1 unreachable=0 Failed=0
#返回结果表示没有错误,全部可以执行成功。
[root@ansible ~]# ansible-playbook --list-hosts /etc/ansible/a.yml #列出a.yml文件中的主机
[root@ansible ~]# ansible-playbook --list-tasks /etc/ansible/a.yml #列出任务
[root@ansible ~]# ansible-playbook --list-tags /etc/ansible/a.yml #列出标签
[root@ansible ~]# ansible-playbook /etc/ansible/a.yml #执行任务
[root@ansible ~]# ssh 192.168.1.2 tail -1 /etc/passwd #确认执行结果
user1:x:1001:1001::/home/user1:/bin/bash
[root@ansible ~]# ssh 192.168.1.3 ls -ld /home/passwd
-rw-r--r--. 1 root root 2342 7月 23 16:06 /home/passwd
#一般情况先执行“-C”命令进行预测试,没有问题后再执行.yml文件。
有一个在线的ansible-playbook语法检测工具,可以更直观的检查出语法中的错误,感兴趣可以看一下:http://www.yamllint.com/
2、触发器
需要触发才能执行的任务,当之前在tasks中的任务执行成功后,若希望在此基础上触发其他任务,这就需要定义handlers。例如,当通过ansible的模块对目标主机的配置文件进行修改之后,如果任务执行成功,可以触发一个触发器,在触发器中定义目标主机的服务重启操作,以便配置文件生效。handlers触发器具有如下特点:
handlers触发器的使用示例如下:
[root@ansible ~]# ssh 192.168.1.2 netstat -anpt | grep 80 #查询1.2主机监听的端口
tcp6 0 0 :::80 :::* LISTEN 94858/httpd
#可以看到是监听80端口,现在通过脚本改为8080端口,并使其生效。
[root@ansible ~]# vim /etc/ansible/httpd.yml #编辑httpd.yml文件,写入以下内容
---
- hosts: web1
remote_user: root
tasks:
- name: change port
command: sed -i 's/Listen\ 80/Listen\ 8080/g' /etc/httpd/conf/httpd.conf
notify: #配置触发条件
- restart httpd server #完成该任务后调用名为“restart httpd server”的触发器
handlers: #配置触发器
- name: restart httpd server #指定触发器名字,要和上面“notify”指定的触发器名字一样
service: name=httpd state=restarted #触发任务为重启httpd服务。
...
#编写完成后,保存退出即可。
[root@ansible ~]# ansible-playbook -C /etc/ansible/httpd.yml #进行预测试。
[root@ansible ~]# ansible-playbook /etc/ansible/httpd.yml #执行脚本。
[root@ansible ~]# ssh 192.168.1.2 netstat -anpt | grep 8080 #远端主机已经运行8080端口
tcp6 0 0 :::8080 :::* LISTEN 103594/httpd
3、角色
将多种不同的tasks的文件集中存储在某个目录下,则该目录就是角色。角色一般存放在/etc/ansible/roles/目录下,可通过ansible的配置文件来调整默认的角色目录,/etc/ansible/roles/目录下有很多子目录,其中每一个子目录对应一个角色,每个角色也有自己的目录结构,结构如下:
/etc/ansible/roles/为角色集合,该目录下有自定义的各个子目录:
上面的目录中,tasks、handlers、vars、Meta、default至少应该包含一个main.yml文件,该目录下也可以有其他.yml文件,但是需要在main.yml文件中用include指令将其他.yml文件包含进来。
.
有了角色后,可以直接在yaml文件(playbook配置文件)中调用角色,示例如下:
---
- hosts: web1
remote_user: root
roles:
- MysqL #调用角色名
- httpd #调用角色名
...
可以只调用一个角色,也可以调用多个角色,当定义了角色后,用ansible-playbook PALYBOOK文件执行即可。此时ansible会到角色集合的目录(/etc/ansible/roles)去找MysqL和httpd目录,然后依次运行MysqL和httpd目录下的所有代码。
.
下面来个安装及配置mariadb数据库的实例:
需求分析:
开始在ansible服务器上实施:
[root@ansible /]# mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
mkdir: 已创建目录 "/etc/ansible/roles/mariadb"
mkdir: 已创建目录 "/etc/ansible/roles/mariadb/files"
mkdir: 已创建目录 "/etc/ansible/roles/mariadb/tasks"
mkdir: 已创建目录 "/etc/ansible/roles/mariadb/handlers"
[root@ansible /]# cd /etc/ansible/roles/mariadb/tasks/ #切换至指定目录
[root@ansible tasks]# ls
[root@ansible tasks]# vim main.yml #编写main.yml文件
---
- name: install mariadb
yum: name=mariadb-server state=present
- name: move config file
shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
- name: provide a new config file
copy: src=my.cnf dest=/etc/my.cnf
- name: reload mariadb
shell: systemctl restart mariadb
- name: create database testdb
shell: MysqL -u root -e "create database testdb;grant all on testdb.* to 'test'@'192.168.1.%' identified by 'test123';flush privileges;"
notify:
- restart mariadb
...
#编写完毕,保存退出即可。
[root@ansible tasks]# cd ../handlers/ #切换至触发器目录
[root@ansible handlers]# vim main.yml #编写main.yml文件,写入以下内容
---
- name: restart mariadb
service: name=mariadb state=restarted
...
#编写完毕,保存退出即可。
[root@ansible handlers]# cd ../files #进入mariadb角色文件夹的files
[root@ansible files]# pwd
/etc/ansible/roles/mariadb/files
[root@ansible files]# ls #准备好配置好的MysqL数据库配置文件,需要分发到远程主机的
my.cnf
[root@ansible files]# cd /etc/ansible/
[root@ansible ansible]# vim mariadb.yml #编写.yml文件
---
- hosts: web
remote_user: root
roles:
- mariadb
...
##编写完毕,保存退出即可。
[root@ansible ansible]# ansible-playbook -C mariadb.yml #进行预检测
........................ #省略部分内容
PLAY RECAP ***************************************************************************
192.168.1.2 : ok=3 changed=1 unreachable=0 Failed=0
#返回结果表示没问题
[root@ansible ansible]# ansible-playbook mariadb.yml #执行安装
待安装完成后,在远端主机上查看是否已经创建了testdb数据库,并测试以test用户登录,自行测试吧。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。