一般情况下,建议将templates目录建在与playbook同级。
template本身也是一个模块,注意这里我们建的目录是templates,但是模块名是template。
[root@localhost ansible]# ansible-doc -s template
特别注意的是,template虽然是一个模块,但是它不可以用在单行直接执行的ansible命令中,即不可以用在ad-hoc中,只能用在playbook中。
由于在实际应用中,可能会有多台机器,但是不同的机器可能自身硬件的配置比如cpu/内存等等可能都不太一样,如果在执行playbook时想根据不同的机器性能条件来做不同的配置,就需要使用template来实现。以nginx中的conf文件为例,要实现的用例是使nginx的work process是linux cpu个数的两倍,也就是说多台机器下,不同的cpu个数对应会在不同的机器上启动不同数量的nginx进程。我们可以将原始的nginx.conf拷贝过来进行修改,将work process的配置修改为cpu个数的2倍(这里以2倍为例),然后将该conf放在前面创建的templates目录下,且以.j2作为文件结尾,表示模板文件。
原始的nginx.conf中的work process配置是auto,也就是根据cpu个数自动来决定启动多少个进程。我们可以先用原始的conf作为template文件来启动一下nginx,先在本机上装一个nginx,然后将conf拷贝到templates目录下:
[root@localhost ansible]# cp /etc/nginx/nginx.conf /etc/ansible/templates/nginx.conf.j2
可以看到原始的work process配置是auto:
编写playbook:
[root@localhost ansible]# cat test-tmpl0906.yml
---
- hosts: wyh-test
remote_user: root
tasks:
- name: install package
yum: name=nginx
- name: copy template
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf #src指的是模板的路径,如果写的是相对路径的话,它是默认从templates目录下找的。放到被控机器上时我们是要把文件名改回原来的样子,所以去掉.j2
- name: start service
service: name=nginx state=started enabled=yes
执行后可以看到有一个nginx进程,因为我们的linux cpu是1:
接下来就开始尝试用我们的模板文件设置process根据cpu的2倍来设置,先修改nginx.conf.j2文件(ansible_processor_vcpus是ansible自身的一个变量,用以表示cpu个数,可以使用setup模块来查看ansible的变量):
修改playbook:
[root@localhost ansible]# cat test-tmpl0906.yml
---
- hosts: wyh-test
remote_user: root
tasks:
- name: install package
yum: name=nginx
- name: copy template
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart service #因为前面我们已经启动了nginx,所以这里必须使用notify来使handler调用任务来执行重启nginx的操作使新的conf文件生效。notify这里指定的使handler里的name值
- name: start service
service: name=nginx state=started enabled=yes
handlers:
- name: restart service
service: name=nginx state=restarted
执行之后再去查看就可以发现这次的nginx进程数已经变成2个了:
可以看到conf中的配置也是自动变成了2: