使用Ansible的Playbook批量部署多台LAMP环境
Playbook的使用步骤
playbook是一个不同于使用ansible命令行执行方式的模式,功能更强大更灵活。
1、在playbook中定义任务:
- name: task description # 任务描述信息
module_name:module_args # 需要使用的模块名字: 模块参数
2、ansible-playbook 执行命令:
ansible-playbook site.yml
playbook是由一个或多个”play"组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。
实际操作
使用playbook批量部署LAMP环境
playbook常用文件夹的作用:
- files: 存放需要同步到被控服务器的源码文件和配置文件;
- handlers: 当服务的配置文件发生变化时需要进行的操作,比如:重启服务,重新加载配置文件
- meta:角色定义,可留空
- tasks: 需要执行的任务
- templates: 用于执行lamp安装的模板文件,一般为脚本;
- vars: 本次安装定义的变量
首先,我们可以在ansible服务器上安装LAMP环境,然后,再将配置文件通过ansible拷贝到远程主机上
准备LAMP环境
1、远程节点上安装httpd
yum install -y httpd
2、安装mysql
yum install mariadb-server mariadb -y
mkdir -p /data/data # 创建目录作为数据存放的位置
chown -R mysql:mysql /data/
vim /etc/my.cnf #修改数据存放目录
改 datadir=/var/lib/mysql 为 datadir=/data/data
systemctl start mariadb
3、安装PHP和php-mysql模块
yum install php php-mysql -y
4、写一个php的测试页,测试环境
vim /var/www/html/index.php
<?php
phpinfo();
?>
启动httpd,在浏览器中访问,确保出现了测试页,要看到mysql已经被整合进来了,在执行下一步操作。
准备ansible相关配置
- 定义机器组名
vim /etc/ansible/hosts
# 追加机器IP
- 将公钥信息复制到被控节点。
使用playbook创建一个LAMP构建的任务
1、准备相关文件
mkdir -pv /etc/ansible/lamp/roles/{prepare,httpd,mysql,php}/{tasks,files,templates,vars,meta,default,handlers}
# 将上面准备的LAMP环境的httpd和mysql的配置文件拷贝到对应的目录下面
cd /etc/ansible/
cp /etc/httpd/conf/httpd.conf /etc/ansible/lamp/roles/httpd/files/
cp /etc/my.cnf /etc/ansible/lamp/roles/mysql/files/
写prapare角色的palybooks
vim /etc/ansible/lamp/roles/prepare/tasks/main.yml
- name: delete yum config
shell: rm -rf /etc/yum.repos.d/* # 删除原有的yum配置文件
- name: provide yumrepo file
shell: wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 下载新的yum配置文件
- name: clean the yum repo
shell: yum clean all #清除原有的yum缓存信息
- name: clean the iptables
shell: iptables -F
2、构建httpd的任务
mv /var/www/html/index.php /etc/ansible/lamp/roles/httpd/files/
vim /etc/ansible/lamp/roles/httpd/task/main.yml
- name: web server install
yum: name=httpd state=present # 安装httpd服务
- name: provide test page
copy: src=index.php dest=/var/www/html # 提供测试页面
- name: delete apache config
shell: rm -rf /etc/httpd/conf/httpd.conf # 删除原有的apache配置文件,如果不删除,下面的copy人户时不会执行的,因为当源文件httpd.conf和目标文件一样时,copy命令时不执行的。如果copy命令不执行,那么notify将不调用handler.
- name: provide configuration file
copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf # 提供httpd的配置文件
notify: restart httpd # 当前的copy复制成功后,通过notify通知名字为restart httpd的handlers运行。
tips:
notify和handler
notify: 这个action可用于在每个paly的最后被触发,这样可以避免多次由改变发生时,每次都执行指定的操作,取而代之,仅在所有的变化发生完成后一次性的执行指定操作。
在notify中列出的操作成为handler,即notify中调用handler中定义的操作。
比如说
--- name: test.yml just fot test
hosts: testserver
vars:
region: ap-southeast-1
tasks:
- name: template configuration
file template: src=template.j2 dest=/etc/foo.conf
notify:
- restart memcached
- restart apache
handlers:
- name: restart memcached
service: name=memcached state=restarted
- name: restart apache
service: name=apache state=restarted
handler:
handler也是一些task的列表,通过名字来引用,它们和一般的task并没有什么区别。
handlers是由通知者进行notify,如果没有被norify, handlers不会执行。
不管由多少个通知者进行了notify,等到play中所有task执行完成后,handlers也只会被执行一次。
handlers最佳的应用场景是用来重启服务,或者触发系统重启操作,此外很少用到了。
3、构建httpd的handlers
vim /etc/ansible/lamp/roles/httpd/handlers/main.yml
- name: restart httpd
service: name=httpd enabled=yes state=restarted
4、部署mariadb
创建mysql服务的任务,需要安装mysql服务,改变属主信息,启动mysql
vim /etc/ansible/lamp/roles/mysql/tasks/main.yml
- name: install the mysql
yum: name=mariadb-server state=present #安装 mysql 服务
- name: mkdir date directory
shell: mkdir -p /mydata/data #创建挂载点目录
- name: provide configration file
copy: src=my.cnf dest=/etc/my.cnf #提供 mysql 的配置文件
- name: chage the owner
shell: chown -R mysql:mysql /mydata/* #更改属主和属组
- name: start mariadb
service: name=mariadb enabled=yes state=started #启动 mysql 服务
5、构建PHP的任务
vim /etc/ansible/roles/php/tasks/main.yml
- name: install php
yum: name=php state=present #安装 php
- name: install php-mysql
yum: name=php-mysql state=present #安装 php 与 mysql 交互的插件
6、定义整个的任务
vim /etc/ansible/lamp/roles/site.yml
- name: LAMP build
remote_user: root
hosts: web-servers
roles:
- prepare
- mysql
- php
- httpd
开始部署
ansible-palybook -i /etc/ansible/hosts /etc/ansible/lamp/roles/site.yml --syntax-check #检查语法错误
ansible-palybook -i /etc/ansible/hosts /etc/ansible/lamp/roles/site.yml
然后在浏览器中访问远程节点主机上的网站了。