一、template模板
例如:使用template模板安装apache
1、管理端安装apache
yum -y install httpd
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2 # template必须要使用j2的格式的文件
vim /opt/httpd.conf.j2
Listen {{http_port}}
ServerName {{server_name}}
MaxClients {{access_num}}
vim /etc/ansible/hosts
[test]
192.168.241.20 http_port=192.168.241.20:80 server_name=www.hzh.com access_num=100
vim apache.yml
- hosts: test
remote_user: root
vars:
- names: httpd
tasks:
- name: install httpd
yum: name={{names}} state=latest
- name: config file
template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: enable httpd
service: name={{names}} enabled=true state=started
handlers:
- name: restart httpd
service: name={{names}} state=restarted
ansible-playbook apache.yml
2、在远程主机上查看
grep -i listen /etc/httpd/conf/httpd.conf
grep -i maxclient /etc/httpd/conf/httpd.conf
grep -i servername /etc/httpd/conf/httpd.conf
tags在一个playbook中,我们会定义多个task,如果我们只要执行某一个task或者多个task时,就可以使用tags标签了
1、打标签,只执行某一段的task
vim test.yml
- hosts: test
remote_user: root
tasks:
- name: copy hosts file
copy: src=/etc/hosts dest=/opt/hosts
tags:
- qqq
- name: touch file
file: path=/opt/hosts11 state=touch
执行命令:
ansible-playbook test.yml --tags="qqq"
上面的例子只执行tags以上的,以下的就不执行了
2、实际上,不光可以为单个或者多个task指定同一个tags,playbook还提供一个特殊的tags为always,也就是不管前面的tags,它一直会执行这个tags
- hosts: test
remote_user: root
tasks:
- name: copy hosts file
copy: src=/etc/hosts dest=/opt/hosts
tags:
- qqq
- name: touch file
file: path=/opt/hosts11 state=touch
tags:
- always
ansible-playbook test.yml --tags="qqq"
去远程端检查下就可以看到,依旧执行
二、roles模块
roles能够根据层次型结构自动装载变量文件
1、roles内各目录的含义解释
files:用来存放由copy模块或者script模块调用的文件
template:用来存放j2模板的,template模块会自动在此目录中寻址j2模板文件
tasks:此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其他的位于此目录的task文件
handlers:此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作
vars:此目录应当包含一个main.yml文件,用于定义此角色用到的变量
defaults:此目录应当包含一个main.yml文件,用于为当前角色设定默认变量
meta:此目录应当包含一个main.yml文件,用于为当前角色的特殊设定及其依赖关系
2、在一个playbook中使用roles的步骤
1)创建以roles命令的目录
mkdir -p /etc/ansible/roles # yum装完默认就有
2)创建全局变量目录
mkdir -p /etc/ansible/group_vars
touch /etc/ansible/group_vars/all # 文件名称可以自定义,但是在引用的时候需要注意下
3)在roles目录中分别创建以各角色名称命令的目录;例如httpd
mkdir -p /etc/ansible/roles/command
4)在每个角色命令的目录中分别创建files,templates,tasks,handlers,vars,defaults,meta,用不到的目录可以为空
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
5)在每个角色的defaults,vars,tasks,meta,handlers目录下创建main.yml文件,不能自定义
touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
6)在playbook文件中,调用各角色
vim /etc/ansible/test.yml
- hosts: test01
remote_user: root
roles:
- httpd
- mysql
7)搭建lanp架构
准备需要目录
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p
准备main.yml文件
touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml
编写httpd模块
vim /etc/ansible/roles/httpd/tasks/main.yml
- name: ensure apache is at the latest version
yum: pkg= {{servername}} state=latest
vim /etc/ansible/roles/httpd/vars/main.yml
servername: httpd
编写mysql模块
vim /etc/ansible/roles/mysql/tasks/main.yml
- name: ensure mysql is at the latest version
yum: pkg= {{servername}} state=latest
vim /etc/ansible/roles/mysql/vars/main.yml
servername: mariadb*
编写PHP模块
vim /etc/ansible/roles/php/tasks/main.yml
- name: ensure php is at the latest version
yum: pkg= {{servername}} state=latest
vim /etc/ansible/roles/php/vars/main.yml
servername: php
创建剧本
vim /etc/ansible/lamp.yml
- hosts: test01
remote_user: root
roles:
- httpd
- mysql
- php
ansible-playbook lamp.yml