开源运维自动化工具 Ansible 详解(7)

handlers触发器的使用示例如下:

[root@centos01 ~]# ssh 192.168.100.20 netstat -anpt | grep 80 <!--查询100.20主机监听的端口--> tcp6 0 0 :::80 :::* LISTEN 94858/httpd <!--可以看到是监听80端口,现在通过脚本改为8080端口,并使其生效。--> [root@centos01 ~]# 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@centos01 ~]# ansible-playbook -C /etc/ansible/httpd.yml <!--进行预测试--> [root@centos01 ~]# ansible-playbook /etc/ansible/httpd.yml <!--执行脚本--> [root@centos01 ~]# ssh 192.168.100.20 netstat -anpt | grep 8080 <!--远端主机已经运行8080端口--> tcp6 0 0 :::8080 :::* LISTEN 103594/httpd 3、角色

将多种不同的tasks的文件集中存储在某个目录下,则该目录就是角色。角色一般存放在/etc/ansible/roles/目录,可通过ansible的配置文件来调整默认的角色目录,/etc/ansible/roles/目录下有很多子目录,其中每一个子目录对应一个角色,每个角色也有自己的目录结构,如下图所示:

简单聊一聊Ansible自动化运维

/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: web 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@centos01 /]# 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@centos01 tasks]# ls [root@centos01 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=https://www.linuxidc.com/Linux/2020-01/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.100.%' identified by 'test123';flush privileges;" notify: - restart mariadb ... <!--编写完毕,保存退出即可--> [root@centos01 tasks]# cd ../handlers/ <!--切换至触发器目录--> [root@centos01 handlers]# vim main.yml <!--编写main.yml文件,写入以下内容--> --- - name: restart mariadb service: name=mariadb state=restarted ... <!--编写完毕,保存退出即可--> [root@centos01 handlers]# cd ../files <!--进入mariadb角色文件夹的files--> [root@centos01 files]# pwd /etc/ansible/roles/mariadb/files [root@centos01 files]# ls <!--准备好配置好的mysql数据库配置文件,需要分发到远程主机的--> my.cnf [root@centos01 files]# cd /etc/ansible/ [root@centos01 ansible]# vim mariadb.yml <!--编写.yml文件--> --- - hosts: web remote_user: root roles: - mariadb ... <!--编写完毕,保存退出即可--> [root@centos01 ansible]# ansible-playbook -C mariadb.yml <!--进行预检测--> ........................ <!--省略部分内容--> PLAY RECAP *************************************************************************** 192.168.100.20 : ok=3 changed=1 unreachable=0 failed=0 <!--返回结果表示没问题--> [root@centos01 ansible]# ansible-playbook mariadb.yml <!--执行安装-->

待安装完成后,在远端主机上自行测试。

ss

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/83f828c48821a1020ae3d9c1d6ed245b.html