1、Playbook简介mysql
playbook配置文件使用YAML语法,具备简洁明了、结构清晰等特色。playbook配置文件相似于shell脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表。上面介绍的ansible命令虽然能够完成各类任务,可是当配置一些复杂任务时,逐条输入就显得效率很是低下了。更有效的方案是在playbook配置文件中放置全部的任务代码,利用ansible-playbook命令执行该文件,能够实现自动化运维。YAML文件的扩展名一般为.yaml或.yml。web
2、playbook的核心元素sql
playbook的核心元素包含:shell
- hosts:任务的目标主机,多个主机用冒号分隔,通常调用/etc/ansible/hosts中的分组信息。
- remote_user:远程主机上,运行此任务的默认身份为root。
- tasks:任务,即定义的具体任务,由模块定义的操做列表。
- handlers:触发器,相似tasks,只是在特定的条件下才会触发的任务。某任务的状态在运行后为changed时,可经过“notify”通知给相应的handlers进行触发执行。
- roles:角色,将hosts剥离出去,由tasks、handlers等所组成的一种特定的结构集合。
3、playbook格式数据库
playbook须要注意的事项:vim
- playbook由YMAL语言编写。YAML参考了其余多种语言,包括:XML、C语言、Python、Perl等。MAL格式是相似于JSON的文件格式,便于人理解和阅读,同时便于书写。
- 经过“-”来表明项,经过冒号 “ :”来分隔键和值,整个文件以“---”开始并以“...”结束。
- 全部的“-”和“ : ”后面均由空格,并且要严格注意缩进和对齐,不然语法可能能会报错。
- 每次在执行playbook文件以前,必定要使用“-C”选项来进行预测试。该选项会执行一遍playbook文件,但不会对目标主机进行任何更改,若语法有错或目标主机缺乏某个文件,都将报错提示。
一、执行简单的playbook文件:bash
[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文件以下:
playbook文件定义的任务须要经过ansible-playbook命令进行调用并执行,ansible-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/
二、触发器ssh
须要触发才能执行的任务,当以前在tasks中的任务执行成功后,若但愿在此基础上触发其余任务,这就须要定义handlers。例如,当经过ansible的模块对目标主机的配置文件进行修改以后,若是任务执行成功,能够触发一个触发器,在触发器中定义目标主机的服务重启操做,以便配置文件生效。handlers触发器具备以下特色:
- handlers是ansible提供的条件机制之一。handlers和task很相似,可是它只在被task通知的时候才会触发执行。
- 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
三、角色
将多种不一样的tasks的文件集中存储在某个目录下,则该目录就是角色。角色通常存放在/etc/ansible/roles/目录下,可经过ansible的配置文件来调整默认的角色目录,/etc/ansible/roles/目录下有不少子目录,其中每个子目录对应一个角色,每一个角色也有本身的目录结构,结构以下:
/etc/ansible/roles/为角色集合,该目录下有自定义的各个子目录:
- mariadb:mysql角色。
- Apache:httpd角色。
- Nginx:Nginx角色。
- 每一个角色的定义,以特定的层级目录结构进行组织。以mariadb(mysql角色)为例:
- files:存放由copy或script等模块调用的文件。
- templates:存放template模块查找所须要的模板文件的目录,如mysql配置文件模板。
- tasks:任务存放的目录。
- handlers:存放相关触发执行的目录。
- vars:变量存放的目录。
- meta:用于存放此角色元数据。
- default:默认变量存放的目录,文件中定义了此角色使用的默认变量。
上面的目录中,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数据库的实例:
需求分析:
- 要求被管理主机上自动安装mariadb,安装完成后上传提早准备好的配置文件至远端主机,重启服务,而后新建testdb数据库,并容许test用户对其拥有全部权限。
- 被管理主机配置yum仓库,自行配置,若被管理端能够链接互联网,那么直接将yum仓库指向互联网便可。
开始在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用户登陆,自行测试吧。