template模块
当安装完redis以后,redis默认配置的监听地址为"127.0.0.1",这样是安全的,但是,如果我需要让redis监听在非"127.0.0.1"的IP地址上,以便让其他主机也能够使用本机上的redis服务,那么我就需要修改默认的配置,没错,修改redis配置文件中的bind设置,即可将redis绑定在指定的IP上,假设,现在需要一次性在10台主机上安装redis,并且让安装后的redis都监听在redis所在主机的非"127.0.0.1"的IP地址上,我们该怎么办呢?通过ansible在10台主机上安装redis很容易,但是安装完成后,10台主机中的redis都是使用默认的监听地址"127.0.0.1"的,难道我们要在安装完成后,挨个的手动修改这10台主机中的redis配置文件吗?显然,应该有更加方便的方法能够解决这个问题,没错,这个方法就是使用"模板"。
此处,先大致的描述一下"模板"的用法,以便先在脑海中形成概念方便理解,我们会在之后进行具体的示例和解释,到时候我们自然会更加清晰的理解"模板"。
如果想要解决上述问题,我们可以先创建一个"模板"文件,ansible会根据"模板"文件,为每一台主机生成对应的配置文件,大致步骤如下:
1、找一个现成的redis配置文件,作为"模板"文件,你可以从之前安装过redis的主机中拷贝一份,也可以从redis的rpm包中提取一份。
2、修改模板文件,将IP设置部分使用变量进行替换。
3、使用ansible调用"template"模块,对"模板文件"进行渲染,根据模板生成每个主机对应的配置文件,并将最终生成的配置文件拷贝到目标主机中。
# cat temptest.yml
---
---
- hosts: test
gather_facts: no
tasks:
- yum:
name: redis
state: present
- template:
src: /tmp/redis.conf
dest: /etc/redis.conf
#把模板里bind改为变量
#cat /tmp/redis.conf
--------
bind {{ ansible_host }}
jinji2
{{ }} :用来装载表达式,比如变量、运算表达式、比较表达式等。
{% %} :用来装载控制语句,比如 if 控制结构,for循环控制结构。
{# #} :用来装载注释,模板文件被渲染后,注释不会包含在最终生成的文件中。
测试:
#cat test.j2
{{ teststr }}
{{ testnum }}
{{ testlist[1] }}
{{ testlist1[1] }}
{{ testdic['name'] }}
# cat temptest.yml
---
- hosts: test70
remote_user: root
gather_facts: no
vars:
teststr: 'tstr'
testnum: 18
testlist: ['aA','bB','cC']
testlist1:
- AA
- BB
- CC
testdic:
name: bob
age: 18
tasks:
- template:
src: /testdir/ansible/test.j2
dest: /opt/test
最终结果:
# cat test
jinja2 test
tstr
18
bB
BB
bob
除了变量和各种常用的运算符,过滤器也可以直接在"{{ }}"中使用,与前文示例中的用法没有任何区别,示例如下
模板文件内容
# cat test.j2
jinja2 test
{{ 'abc' | upper }}
生成文件内容
# cat test
jinja2 test
ABC
lookup
模板文件内容如下
# cat /testdir/ansible/test.j2
jinja2 test
{{ lookup('file','/testdir/testfile') }}
{{ lookup('env','PATH') }}
test jinja2
ansible主机中的testfile内容如下
# cat /testdir/testfile
testfile in ansible
These are for testing purposes only
生成文件内容如下
# cat test
jinja2 test
testfile in ansible
These are for testing purposes only
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
test jinja2