1. ansible 之 template(模板)
1.1 简介
- Jinja是基于Python的模板引擎。template类是Jinja的另一个重要组件,可以看作一个编译过的模块文件,用来生产目标文本,传递Python的变量给模板去替换模板中的标记。
- 也就是说可以将带有参数的配置文件传递到目标地址,可以对文件进行属组属主的修改以及备份
1.2 template的应用
1.2.1 环境的部署
- 首先需要在主节点上搭建好ansible环境,上一篇中已经介绍了如何搭建
- 搭建好后,在node1 节点上安装服务,并将服务配置发送给 node2
服务器 |
IP |
master主节点 |
192.168.140.20 |
node1 |
192.168.140.21 |
node2 |
192.168.140.22 |
[webserver]
192.168.140.21
[mysql]
192.168.140.22
1.2.2 安装,并修改配置文件
[root@node1 ~]# yum -y install httpd
- 主节点上,拷贝node1 apache 配置文件到 master 上
[root@master ~]# mkdir httpd
[root@master ~]# scp root@192.168.140.21:/etc/httpd/conf/httpd.conf httpd
httpd.conf 100% 11KB 7.0MB/s 00:00
[root@master ~]# cd httpd/
[root@master httpd]# ll
总用量 12
-rw-r--r--. 1 root root 11753 1月 14 16:50 httpd.conf
[root@master ~]# vi httpd/httpd.conf
...
Listen {
{
port}} '//修改监听端口,IP为变量'
ServerName {
{
server_name}} '//修改域名为变量'
MaxClients {
{
access_num}} '//在域名下添加最大连接数500'
目的:修改为 j2 模板文件可以被 template 模块直接识别
[root@master ~]# mv httpd/httpd.conf httpd.conf.j2
可指定某一台主机,以mysql主机为例
[root@master ~]# vi /etc/ansible/hosts
...
[mysql]
192.168.140.22 port=192.168.140.22:80 server_name=www.xx.com:80 access_num=500
1.2.3 编写yaml剧本并运行
[root@master ~]# vi apache.yaml
- hosts: mysql
remote_user: root
vars:
- server: httpd
tasks:
- name: install apache
yum: name={
{
server}} state=latest
- name: configure file
template: src=/root/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: start httpd
service: name={
{
server}} state=started
handlers :
- name: restart httpd
service: name={
{
server}} state=restarted enabled=true
[root@master ~]# ansible-playbook apache.yaml --syntax-check
playbook: apache.yaml
[root@master ~]# ansible-playbook apache.yaml
1.2.4 验证
[root@node2 ~]# rpm -q httpd
httpd-2.4.6-67.el7.centos.x86_64
[root@node2 ~]# systemctl status httpd
[root@node2 ~]# vi /etc/httpd/conf/httpd.conf
...
Listen 192.168.140.22:80
ServerName www.xx.com:80
MaxClients 500
2. tags标签模块
2.1 tags介绍
- 在一个playbook中,我们一般会定义很多个task,如果我们只想执行其中的某一个或者多个task时就可以使用tags标签功能了
2.2 tags应用示例
2.2.1 单标签任务
[root@master ~]# vi test_hosts.yaml
- hosts: webserver
remote_user: root
tasks:
- name: copy hosts
copy: src=/etc/hosts dest=/opt/hosts
tags:
- aaa
- name: touch hosts01
file: path=/opt/hosts01 state=touch
- name: mkdir directory
file: path=/opt/hosts02 state=directory
注意:打上标签后只执行标签上面操作,下面的其他任务都不执行
[root@master ~]# ansible-playbook test_hosts.yaml --syntax-check
[root@master ~]# ansible-playbook test_hosts.yaml --tags="aaa"
[root@node1 ~]# cd /opt
[root@node1 opt]# ls
hosts rh
2.2.2 多标签任务
[root@master ~]# vi test_hosts2.yaml
- hosts: webserver
remote_user: root
tasks:
- name: copy hosts
copy: src=/etc/hosts dest=/opt/hosts
tags:
- aaa
- name: touch hosts01
file: path=/opt/hosts01 state=touch
- name: mkdir directory
file: path=/opt/hosts02 state=directory
tags:
- aaa
[root@master ~]# ansible-playbook test_hosts2.yaml --syntax-check
[root@master ~]# ansible-playbook test_hosts2.yaml --tags="aaa"
[root@node1 ~]# cd /opt
[root@node1 opt]# ls
hosts hosts01 hosts02 rh
2.3 扩展
定义:
1.事实上不光可以为单个或多个task指定同一个tags,playbook还提供了一个特殊的tags为always;
2.作用就是当使用always当tags的task时,无论执行哪个tags时,定义有always的任务必须强制执行
定义:
roles(角色)能够根据层次型结构自动装载变量文件、task以及handlers等。
简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include
变量目录类型:
roles/
common/
files/
templates/
tasks/
handlers/
defaults/
meta/
web/
files/
templates/
tasks/
handlers/
vars/
defaults/
meta/
roles内各目录含义解释
1.files: 用来存放由copy模块或script模块调用的文件
2.templates: 用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件
3.tasks: 此目录应当包含一个main.yml文件, 用于定义此角色的任务列表,此文件可以使用
4.include包含其它的位于此目录的task文件
5.handlers: 此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作
6.vars: 此目录应当包含一个main.yml文件,用于定义此角色用到的变量
7.defaults: 此目录应当包含一个main.yml文件,用于为当前角色设定默认变量
8.meta: 此目录应当包含一个main.yml文件, 用于定义此角色的特殊设定及其依赖关系