ansible--Templates、tags、role
一、Templates模板
1、准备文件
scp root@192.168.221.20:/etc/httpd/conf/httpd.conf ./
vi templates/httpd.conf #放在管理端
Listen {{http_port}} #监听端口换成变量
ServerName {{server_name}}
MaxClients {{access_num}} #自己在servername下添加
mv httpd.conf httpd.conf.j2
vi /etc/ansible/hosts
[webserver]
192.168.221.20 http_port=192.168.221.20:80 access_num=100 server_name="www.yun.com:80"
2、编辑剧本
ps:注意格式对齐
vi apache.yml
- hosts: webserver
remote_user: root
vars:
- package: httpd
- service: httpd
tasks:
- name: install httpd package
yum: name={{package}} state=latest
- name: install configure file
template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf #指定模板路径到目标主机路径
notify: #触发器
- restart httpd
- name: start httpd server
service: name={{service}} enabled=true state=started
handlers:
- name: restart httpd
service: name={{service}} state=restarted
ansible-playbook apache.yml #执行脚本
去两台远程主机上查看验证:
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模块
1、 tags 为only
在一个playbook中,我们一般会定义很多个task,如果我们只想执行其中的某一个task或多个task时就可以使用tags标签功能了,格式如下:
vi hosts.yml
- hosts: webserver
remote_user: root
tasks:
- name: Copy hosts file
copy: src=/etc/hosts dest=/opt/hosts
tags:
- only
- name: touch file
file: path=/opt/hosts01 state=touch
执行命令:ansible-playbook hosts.yml --tags=“only”
ansible-playbook hosts.yml
在webserver查看是否成功
2、tags为always
事实上,不光可以为单个或多个task指定同一个tags。
playbook还提供了一个特殊的tags为always。
作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags的task都会执行。
vi hosts.yml
- hosts: webserver
remote_user: root
tasks:
- name: Copy hosts file
copy: src=/etc/hosts dest=/etc/hosts
tags:
- only
- name: touch file
file: path=/opt/hosts state=touch
tags:
- always
执行命令:ansible-playbook hosts.yml --tags=“only”
分别去两台被管理服务器上去查看文件创建情况
三、roles角色管理
roles能够根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们,roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。
roles/
web/ #服务名
files/
templates/
tasks/
handlers/
vars/
defaults/
meta/
1、roles内各目录含义解释
files | 用来存放由copy模块或script模块调用的文件 |
---|---|
templates | 用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件。 |
tasks | 此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件。 |
handlers | 此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作。 |
vars | 此目录应当包含一个main.yml文件,用于定义此角色用到的变量。 |
defaults | 此目录应当包含一个main.yml文件,用于为当前角色设定默认变量。 |
meta | 此目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。 |
2、在一个playbook中使用roles的步骤
①、创建以roles命名的目录
mkdir /etc/ansible/roles/ -p #yum装完默认就有
②、创建全局变量目录。
mkdir /etc/ansible/group_vars/ -p
touch /etc/ansible/group_vars/all #文件名自己定义,引用的时候注意
③、在roles目录中分别创建以各角色名称命令的目录,如httpd
mkdir /etc/ansible/roles/common -p
④、在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,但不可以不创建。
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
⑤、在每个角色的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
⑥、在playbook文件中,调用各角色。
vi /etc/ansible/site.yml
- hosts: webserver
remote_user: root
roles:
- httpd
- mysql
四、安装搭建LAMP架构
1、创建各个服务下面的各个空目录
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
2、创建各个模块下的yml文件
除了files和template目录模块下不创建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
3、编写httpd服务模块
vi /etc/ansible/roles/httpd/tasks/main.yml
- name: ensure apache is at the latest version
yum: pkg={{ pkg }} state=latest
vi /etc/ansible/roles/httpd/vars/main.yml
pkg: httpd
4、编写mysql模块
vi /etc/ansible/roles/mysql/tasks/main.yml
- name: ensure mysql is at the latest version
yum: pkg={{ pkg }} state=latest
vi /etc/ansible/roles/mysql/vars/main.yml
pkg: mariadb*
5、 编写php模块
vi /etc/ansible/roles/php/tasks/main.yml
- name: ensure php is at the latest version
yum: pkg={{ pkg }} state=latest
vi /etc/ansible/roles/php/vars/main.yml
pkg: php
6、编写roles示例
vi /etc/ansible/site.yml
- hosts: webserver #指定主机
remote_user: root #指定演员
roles: #指定角色
- httpd
- mysql
- php