就是通过分别将variables, tasks及handlers等放置于单独的⽬录中,并可以便捷地调⽤它们的⼀种机制。假设我们要写⼀个playbook来安装管理lamp环境,那么这个playbook就会写很⻓。所以我们希望把这个很⼤的⽂件分成多个功能拆分, 分成apache管理,php管理,mysql管理,然后在需要使⽤的时候直接调⽤就可以了,以免重复写。就类似编程⾥的模块化的概念,以达到代码复⽤的效果。如果以后要部署lnmp,那么我们只需要再写个nginx就好了。
roles目录结构介绍
files:⽤来存放由copy模块或script模块调⽤的⽂件。
tasks:⾄少有⼀个main.yml⽂件,定义各tasks。
handlers:有⼀个main.yml⽂件,定义各handlers。
templates:⽤来存放jinjia2模板。
vars:有⼀个main.yml⽂件,定义变量。
meta:有⼀个main.yml⽂件,定义此⻆⾊的特殊设定及其依赖关系。
#环境
centos7系统,VM虚拟机
#创建roles目录结构
[root@manage01 ansible]# cd /etc/ansible/
[root@manage01 ansible]# mkdir -p roles/{httpd,mysql,php}/{files,tasks,handlers,templates,vars,meta}
[root@manage01 ansible]# touch roles/{httpd,mysql,php}/{tasks,handlers,vars,meta}/main.yml
#准备好需要替换的http配置文件和php主页文件
#httpd.conf修改apache用户为lampuser phpinfo.php为新创建
[root@manage01 /]# scp -r [email protected]:/root/httpd.conf phpinfo.php /etc/ansible/roles/httpd/files/
#配置http角色
1、配置http变量
[root@manage01 vars]# cat /etc/ansible/roles/httpd/vars/main.yml
user: lampuser
2、配置调用模块(常用于重启服务,可被notify调用,类似java的方法)
[root@manage01 vars]# cat /etc/ansible/roles/httpd/handlers/main.yml
- name: restart apache
service: name=httpd state=restarted
3、配置httpd主模块方法
- name: httpd软件包安装
yum: name={{item}} state=latest
with_items:
- httpd
- httpd-devel
- httpd-manual
- name: 创建apache管理账户lampuser
user: name={{user}} state=present
- name: 设置apache开机启动,并启动服务
service: name=httpd enabled=yes state=started
- name: 替换配置文件,初始化业务
copy: src=/etc/ansible/roles/httpd/files/httpd.conf dest=/etc/httpd/conf/httpd.conf
#定义通知调用,当配置文件更新,需要重启服务
notify:
- restart apache
- name: 拷贝php测试页
copy: src=/etc/ansible/roles/httpd/files/phpinfo.php dest=/var/www/html/
#配置mysql角色
1、配置http变量
[root@manage01 vars]# cat /etc/ansible/roles/mysql/vars/main.yml
user: mysql
2、配置mysql主模块方法
- name: mysql用户创建
user: name={{user}} state=present
- name: mysql 软件安装
yum: name={{item}} state=latest
with_items:
- mariadb
- mariadb-server
- name: 启动服务,并设置开机启动
service: name=mariadb enabled=yes state=started
- name: 改变mysql文件的所有者为mysql
file: path='/var/lib/mysql' owner={{user}} group={{user}} recurse=yes
#配置php角色
1、准备php-fpm配置文件(如有修改)
[root@manage01 files]# ls /etc/ansible/roles/php/files
www.conf
2、配置调用模块
[root@manage01 handlers]# cat /etc/ansible/roles/php/handlers/main.yml
- name: restart php-fpm
service: name=php-fpm state=restarted
3、配置php主模块方法
[root@manage01 php]# cat /etc/ansible/roles/php/tasks/main.yml
- name: 安装php
yum: name={{item}} state=latest
with_items:
- php
- php-mysql
- php-gd
- php-ldap
- php-odbc
- php-pear
- php-xml
- php-xmlrpc
- php-mbstring
- php-snmp
- php-soap
- curl
- curl-devel
- php-bcmath
- php-fpm
- name: copy www.conf to /etc/php-fpm.d
copy: src=/etc/ansible/roles/php/files/www.conf dest=/etc/php-fpm.d force=yes
notify:
- restart php-fpm
#配置playbook调用roles
[root@manage01 web]# cat /opt/ansible/playbook/web/lamp.yaml
---
- hosts: group1
remote_user: root
roles:
- httpd
- mysql
- php
#执行
[root@manage01 yaml]# ansible-playbook -C lamp.yml
[root@manage01 yaml]# ansible-playbook lamp.yml
FAQ:
1、空格格式问题一定要注意,规范很严格
ERROR! A malformed block was encountered while loading a block
2、虽然提示user: name={{user}} 这个报错,但是实际没半毛关系,所以需要检查全文。
[root@manage01 web]# ansible-playbook -C lamp.yaml
ERROR! conflicting action statements: yum, service
The error appears to be in '/etc/ansible/roles/mysql/tasks/main.yml': line 2, column 13, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
user: name={{user}} state=present
^ here
There appears to be both 'k=v' shorthand syntax and YAML in this task. Only one syntax may be used.
3、部署完成后访问192.168.192.130/phpinfo.php没有出现页面,出现了文件内容
原因为php-fpm配置文件/etc/php-fpm.d/www.conf所属用户和用户组配置成apache了,应该是mysql的用户,修改后重启服务。
[root@node03 php-fpm.d]# systemctl restart httpd
[root@node03 php-fpm.d]# systemctl restart mysql
[root@node03 php-fpm.d]# systemctl restart mariadb