ansible的模板template

在某些环境下可能会出现这种情况,比如主机A配置文件中的某个值为1,主机B配置文件中此值为2,现在需要将此值在现有的基础上再加上2,此时ansible的模板就发挥其作用了,template可以根据模块文件动态生成相对应的配置文件。

template的格式要求

template对文件的存放和命名有要求,template文件必须存放在templates目录下,并且以.j2后缀命名。

yaml文件需要和templates目录平级,目录结构如下。

1
2
3
4
5
6
[root@ansible data]# tree yaml/
yaml/
├── hello.yaml
├── httpd.yaml
└── templates
   └── test.conf.j2

template的使用方法

准备环境

此处以nginx为例,编写playbook为主机列表中的主机安装nginx

1
2
3
4
5
6
7
8
9
10
11
[root@ansible ~]# vim nginx.yml
---
#install nginx
- hosts: webserver
remote_user: root

tasks:
- name: package
yum: name=nginx
- name: service
service: name=nginx state=started enabled=yes

执行playbook,在hosts列表中的主机上部署nginx服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@ansible ~]# ansible-playbook nginx.yml

PLAY [webserver] ************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************
ok: [192.168.73.134]
ok: [192.168.73.135]

TASK [package] **************************************************************************************************
ok: [192.168.73.135]
ok: [192.168.73.134]

TASK [service] **************************************************************************************************
changed: [192.168.73.135]
changed: [192.168.73.134]

PLAY RECAP ******************************************************************************************************
192.168.73.134 : ok=3 changed=1 unreachable=0 failed=0
192.168.73.135 : ok=3 changed=1 unreachable=0 failed=0

template使用示例一

基础环境部署完毕,现在需要使用模板文件实现让nginx在运行时创建出cpu个数+2的进程数,模板文件的配置方法如下:

1.获取nginx的配置文件,并改名为.j2后缀的文件存放在templates目录下

1
[root@ansible data]# mv nginx.conf /data/yaml/templates/nginx.conf.j2

2.获取cpu个数的变量

1
2
[root@ansible data]# ansible 192.168.73.134 -m setup | grep cpu
"ansible_processor_vcpus": 1, #此为定义cpu的变量

3.修改模板文件

1
2
[root@ansible data]# vim yaml/templates/nginx.conf.j2
worker_processes {{ansible_processor_vcpus+2}}; #此行定义了线程数,改为变量代替

4.在playbook中引用模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@ansible yaml]# vim nginx.yml
---
#install nginx
- hosts: webserver
remote_user: root

tasks:
- name: package
yum: name=nginx
- name: config
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf #在配置文件段引用模板文件。
notify: restart service
- name: service
service: name=nginx state=started enabled=yes

handlers:
- name: restart service
service: name=nginx state=restarted

5.执行playbook

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@ansible yaml]# ansible-playbook nginx.yml

PLAY [webserver] ************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************
ok: [192.168.73.134]
ok: [192.168.73.135]

TASK [package] **************************************************************************************************
ok: [192.168.73.134]
ok: [192.168.73.135]

TASK [config] ***************************************************************************************************
changed: [192.168.73.134]
changed: [192.168.73.135]

TASK [service] **************************************************************************************************
ok: [192.168.73.134]
ok: [192.168.73.135]

RUNNING HANDLER [restart service] *******************************************************************************
changed: [192.168.73.135]
changed: [192.168.73.134]

PLAY RECAP ******************************************************************************************************
192.168.73.134 : ok=5 changed=2 unreachable=0 failed=0
192.168.73.135 : ok=5 changed=2 unreachable=0 failed=0

验证线程个数是否改变

1
2
3
4
5
6
7
8
9
10
[root@ansible yaml]# ansible webserver -a 'cat /etc/nginx/nginx.conf | grep work'
192.168.73.135 | CHANGED | rc=0 >>
worker_processes 3;
worker_connections 1024;

192.168.73.134 | CHANGED | rc=0 >>
worker_processes 3;
worker_connections 1024;

#由于此处2台主机的cpu核心书都为1,所以显示出的工作线程数为3

template使用实例二

配置刚才所部署的nginx服务,让192.168.73.134主机上的nginx监听在80端口,192.168.73.135主机上的nginx服务监听在8080端口上。

1.修改模板中的端口

1
2
3
4
5
[root@ansible yaml]# vim templates/nginx.conf.j2
server {
listen {{port}} default_server; 将此处的端口改为变量
listen [::]:80 default_server;

2.修改主机文件定义port

1
2
3
4
[root@ansible yaml]#  vim /etc/hosts
[webserver]
192.168.73.134 port=80 #定义192.168.73.134主机的port变量值为80
192.168.73.135 port=8080 #定义192.168.73.135主机的port变量值为8080

3.重新执行yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@ansible yaml]# ansible-playbook nginx.yml

PLAY [webserver] ************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************
ok: [192.168.73.134]
ok: [192.168.73.135]

TASK [package] **************************************************************************************************
ok: [192.168.73.134]
ok: [192.168.73.135]

TASK [config] ***************************************************************************************************
ok: [192.168.73.134]
changed: [192.168.73.135]

TASK [service] **************************************************************************************************
ok: [192.168.73.135]
ok: [192.168.73.134]

RUNNING HANDLER [restart service] *******************************************************************************
changed: [192.168.73.135]

PLAY RECAP ******************************************************************************************************
192.168.73.134 : ok=4 changed=0 unreachable=0 failed=0
192.168.73.135 : ok=5 changed=2 unreachable=0 failed=0

验证两台主机上nginx服务是否监听在模板中所定义的端口上

1
2
3
4
5
6
7
8
[root@ansible yaml]# ansible webserver -a 'ss -tnl |grep 80'
192.168.73.134 | CHANGED | rc=0 >>
LISTEN 0 128 *:80 *:*
LISTEN 0 128 :::80 :::*

192.168.73.135 | CHANGED | rc=0 >>
LISTEN 0 128 *:8080 *:*
LISTEN 0 128 :::80 :::*