1:触发器
需要触发才能执行的任务,当之前定义在tasks 中的任务执行完成后,若希望在基础上触发其他的任务,这时就需要定义handlers。例如,当通过 ansible的模块对目标主机的配置文件进行修改之后,如果任务执行成功。可以触发一个触发器。在触发器中定义目标主机的服务重启操作,以使配置文件生效,handlers触发器具有以下优点。
1. handlers是 Ansible提供的条件机制之一。handlers和 task 很类似,但是他在被task通知
的时候才会触发执行-
2. handlers只会在所有任务执行完成后执行,而且即使被通知了多次,它也只会执行一次,
handlers 按照定义的顺序依次执行
《1》:vim /etc/ansible/httpd.yml 编写文件
---
- hosts: webserver
remote_user: root
tasks:
- name: xxx
command: sed -i 's/Listen 80/Listen 8080/g' /etc/httpd/conf/httpd.conf
notify:
- rehttpd
handlers:
- name: rehttpd
service: name=httpd state=restarted
...
注释
--- #固定开头格式
- hosts: webserver #指定运行主机为Rich组
remote_user: root #指定对端运行用户的身份
tasks: #任务列表
- name: xxx #定义任务名称
command: sed -i 's/Listen 80/Listen 8080/g' /etc/httpd/conf/httpd.conf #模块为command:使用sed命令替换监听端口为8080
notify: #完成任务后调用restart httpd server触发器
- rehttpd
handlers: #配置触发器
- name: rehttpd #指定触发器名字
service: name=httpd state=restarted #指定触发条件为重启httpd服务
... #结尾句
《2》:ansible-playbook --syntax-check /etc/ansible/httpd.yml 检测语法
《3》:ansible-playbook -C /etc/ansible/httpd.yml 预执行
《4》:ansible-playbook /etc/ansible/httpd.yml 执行
(注:以上报错指的是建议用sed模块,而不是用shell命令)
《5》:在虚拟机上查看服务器状态
《6》:netstat -lnpt |grep 80 查看端口
2:角色
将多种不同的tasks 的文件集中存储在某个目录下。则该目录就是角色。角色一般存放在/etc/ansible/roles/目录中,可通过 ansible的配置文件来调整默认的角色目录。/etc/ansible/roles 目录下有很多的子I录,其中每一个子目录对应一个角色。每个角色也有自己的目录结构。
/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文件包含进来。
有了角色之后,可以直接在yml文件中(playbook配置文件)中调用角色实例如下:
实验案例:
下面通过一个实例配置数据库角色,需要被管理主机自动安装mariadb,安装完成后上传提前准备的配置文件到远端主机,重启服务,然后新建testdb数据库,并允许test用户对其拥有所有的权限
《1》:在管理端配置yum
《2》:mkdir -p /etc/ansible/roles/mariadb/{files,tasks,handlers} 配置数据库角色:分别是放文件的,放任务的,放剧本的。
《3》:vim /etc/ansible/mariadb.yml 编写文件
《4》:写入:
---
- hosts: webserver
remote_user: root
roles:
- mariadb
...
《5》:cd /etc/ansible/roles/mariadb 切换目录
《6》:ls 查看
《7》:vim tasks/main.yml 编辑文件
《8》:写入:
---
- 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 privileges on testdb.* to 'test'@'192.168.100.%' identified by 'test123';flush privileges;"
notify:
- restart mariadb
...
注释
--- #固定开头格式
- name: install mariadb #指定任务名称安装mariadb数据库
yum: name=mariadb-server state=present #执行yum模块安装mariadb
- 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 #src源会自动到files文件去找my.cnf文件
- name: reload mariadb #指定任务名称为重启mariadb
shell: systemctl restart mariadb #shell模块重启
- name: create database testdb #按要求添加执行如下sql语句
shell: mysql -u root -e "create database testdb;grant all privileges on testdb.* to 'test'@'192.168.100.%' identified by 'test123';flush privileges;"
notify: #配置触发器
- restart mariadb #为重启mariadb
...
《9》:vim handlers/main.yml 编写(注:定义触发器)
《10》:写入:
---
- name: restart mariadb
service: name=mariadb state=restarted
...
注释
---
- name: restart mariadb #引用上面配置的触发器
service: name=mariadb state=restarted #触发后重启mariadb
...
《11》:cd files/ 切换目录
《12》:cp /etc/my.cnf ./ 复制
《13》:ls
《14》:vim my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
《15》:ansible-playbook -C /etc/ansible/mariadb.yml 预执行
《16》:ansible-playbook /etc/ansible/mariadb.yml 执行
《17》:systemctl status mariadb 查看状态
《18》:mysql 进行连接
《19》:use mysql 切换数据表
《20》:select user from user; 查看