目录
1.先准备一个以.j2结尾的template模板文件,设置引用的变量,ansible上要先安装httpd
2、修改主机清单文件,使用主机变量定义一个变量名相同而值不同的变量
③在roles目录中分别创建以各角色名称命令的目录,如httpd,mysql等
④在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建。
⑤在每个角色的handlers,tasks,meta,defaults,vars目录下创建main.yml文件,千万不能自定义文件名。
一、template
1、简介
ansible的template模块,可以将带有参数的配置文件传递到目标地址,可以对文件进行属组属主的修改以及备份。
template是一种创建配置文件的工具,在配置文件中,会有一些数据等会动态的变化,如IP地址,主机名,端口,用户,页面路径等。
template模块就是将变量和动态文件结合起来,最终生成一个配置文件(你需要动态改变)
jinja是基于python的模板引擎。template是jinja的一个重要的组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递python的变量给模板去替换模板中的标记。
注意:文件配置使用jinja2模板语言来编写,结尾一定要是j2(xxx.j2)
2、template模块实例
1.先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2
#注意ansible本身要安装httpd,其他2台被控制的不能安装httpd
vim /opt/httpd.conf.j2
Listen {{http_port}} #42行,修改
ServerName {{server_name}} #95行,修改
DocumentRoot "{{root_dir}}" #119行,修改
#修改template配置文件模块的端口和主机名、根目录为变量
2.修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量
vim /etc/ansible/hosts
[webservers1]
192.168.170.113 http_port=192.168.170.113:80 server_name=www.rmh.com:80 root_dir=/var/www/html
[webservers2]
192.168.170.114 http_port=192.168.170.114:80 server_name=www.kfc.com:80 root_dir=/var/www/html
3.主机添加hosts
vim /etc/hosts
192.168.170.113 www.rmh.com
192.168.170.114 www.kfc.com
4.编写playbook文件
vim httpd.yaml
---
- hosts: all
remote_user: root
gather_facts: false
vars:
- package: httpd
- service: httpd
tasks:
- name: install httpd
yum: name={{package}} state=latest
- name: con test
template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
#配置文件模板拷贝到httpd的子配置文件中
notify:
- restart httpd
- name: start httpd
service: name={{service}} state=started
handlers:
- name: restart httpd
service: name={{service}} state=restarted
5.最后在ansible上curl访问2个域名验证
1.先准备一个以.j2结尾的template模板文件,设置引用的变量,ansible上要先安装httpd
2、修改主机清单文件,使用主机变量定义一个变量名相同而值不同的变量
3、主机添加hosts
4、编写playbook文件
二、tags模块
1、概念
当你写了一个很长的playbook,其中有很多的任务,很多时候在使用的时候只是想执行一部分任务,或者只是想执行一类任务,这时可以借助tags模块为任务进行做标签,任务存在标签之后,在执行playbook时可以利用标签来决定执行哪些任务或者不执行哪些任务。
可以在一个playbook中为某个任务定义"标签",在执行此playbook时通过ansible-playbook命令使用--tags选项来实现仅运行指定的tasks。
playbook还提供一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags,定义中有always的tags都会执行。
2、实例
---
- hosts: web
remote_user: root
gather_facts: false
tasks:
- name: copy hosts
copy: src=/etc/hosts dest=/opt/hosts
tags:
- tags1
#自定义标签名,可以在执行yaml文件时使用 --tag="tags1"只执行此任务,always标签任务除外
- name: touch file
file: path=/opt/testhost state=touch
tags:
- always
#always标签,无论执行那个标签都会将此标签的任务内容执行
分别在两个主机上测试文件创建的情况
1、主机1的配置文件
主机1因为有always所以两个标签都执行
2、主机2的配置文件
此时webb中因为没有always所以只执行指向的tags
三、roles模块
1、概念
简单的说,roles就是通过分别将变量、文件、任务、模块以及处理器放置于单独的目录中,并可以便捷的include他们的一种机制。角色一般用于基于主机构建服务的场景中,但是也可以用于构建守护进程等场景中。
2、roles的目录结构
3、roles内各个目录的含义
|-----------|-----------------------------------------------|
| files | 用来存放copy模块或script模块调用的文件 |
| templates | 用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件 |
|----------|------------------------------------------------------------------|
| tasks | 此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件 |
| handlers | 此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作 |
|----------|---------------------------------------|
| vars | 此目录应当包含一个main.yml文件,用于定义此角色用到的变量 |
| defailts | 此目录应当包含一个main.yml文件,用于为当前角色设定默认变量 |
| meta | 此目录应当包含一个main.yml文件,用于定义此角色的特殊设及其依赖关系 |
4、在playbook中使用roles的步骤
①创建以roles命名的目录
mkdir /etc/ansible/roles/ -p #yum装完默认就有
②创建全局变量目录(可选)
mkdir /etc/ansible/group_vars/ -p
touch /etc/ansible/group_vars/all #文件名自己定义,引用的时候注意
③在roles目录中分别创建以各角色名称命令的目录,如httpd,mysql等
mkdir /etc/ansible/group_vars/ -p
touch /etc/ansible/group_vars/all #文件名自己定义,引用的时候注意
④在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建。
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}
⑤在每个角色的handlers,tasks,meta,defaults,vars目录下创建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
⑥修改site.yml文件,针对不同主机去调用不同的角色
vim /etc/ansible/site.yml
---
- hosts: web
remote_user: root
roles:
- httpd
- hosts: webb
remote_user: root
roles:
- mysql
⑦运行ansible-playbook
cd /etc/ansible/
ansible-playbook site.yml
5、roles实现lnmp搭建
①创建httpd,mysql,和php三个所需要的文件
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
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模块
写一个简单的tasks/main.yml
vim /etc/ansible/roles/httpd/tasks/main.yml
- name: install apache
yum: name={{pkg}} state=latest
- name: start apache
service: enabled=true name={{svc}} state=started
//定义变量:可以定义在全局变量中,也可以定义在roles角色变量中,一般定义在角色变量中
vim /etc/ansible/roles/httpd/vars/main.yml
pkg: httpd
svc: httpd
③编写mysql模块
vim /etc/ansible/roles/mysql/tasks/main.yml
- name: install mysql
yum: name={{pkg}} state=latest
- name: start mysql
service: enabled=true name={{svc}} state=started
vim /etc/ansible/roles/mysql/vars/main.yml
pkg:
- mariadb
- mariadb-server
svc: mariadb
④编写php模块
vim /etc/ansible/roles/php/tasks/main.yml
- name: install php
yum: name={{pkg}} state=latest
- name: start php-fpm
service: enabled=true name={{svc}} state=started
vim /etc/ansible/roles/php/vars/main.yml
pkg:
- php
- php-fpm
svc: php-fpm
⑤编写roles
vim /etc/ansible/site.yml
---
- hosts: webservers
remote_user: root
roles:
- httpd
- mysql
- php
cd /etc/ansible
ansible-playbook site.yml