网站首页 > 精选文章 / 正文
template模块
为什么使用template?
在实际的工作中由于每台服务器的环境配置都可能不同,
但是往往很多服务的配置文件都需要根据服务器环境进行不同的配置,比如Nginx最大进程数、Redis最大内存等。
为了解决这个问题可以使用Ansible的template模块,该模块和copy模块作用基本一样,都是把管理端的文件复制到客户端主机上,但是区别在于template模块可以通过变量来获取配置值,支持多种判断、循环、逻辑运算等,而copy只能原封不动的把文件内容复制过去
直接来个示例吧,本地创建模板文件template.j2(因为ansible用的jinja2引擎,所以用j2后缀)
发行版: {{ distribution }}
系统版本: {{ distribution_version }}
主机名: {{ hostname }}
内核版本: {{ kernel }}
IP地址: {{ ip }}
写个playbook调用该模板
---
- hosts: 192.168.233.167
remote_user: root
vars:
- distribution: "{{ ansible_distribution }}"
- distribution_version: "{{ ansible_distribution_version }}"
- hostname: "{{ ansible_hostname }}"
- kernel: "{{ ansible_kernel }}"
- ip: "{{ ansible_default_ipv4['address'] }}"
tasks:
- name: use template module
template:
src: /root/template.j2
dest: /tmp/hostinfo
说明:playbook中"{{ }}"中是ansible gather_facter获取到的变量值。
template.j2文件中"{{ }}"中的变量是playbook中定义的,不要搞混淆了
jinja2 模板中的变量是调用playbook中定义的变量。
查看一下远程机器的hostinfo文件
[root@localhost ~]# ansible 192.168.233.167 -m shell -a "cat /tmp/hostinfo"
192.168.233.167 | CHANGED | rc=0 >>
发行版: Ubuntu
系统版本: 16.04
主机名: ubuntu
内核版本: 4.4.0-87-generic
IP地址: 192.168.233.167
贴士: Jinja是一种现代且设计友好的Python模板语言而ansible 是使用python开发的,所以在ansible中无论是正常使用变量,还是template模块使用变量都是使用jinja模板。
学过flask的应该很熟悉,jinja的使用也非常灵活,可以做逻辑运算,做for循环,做if判断。在这里就不做多讲解有兴趣的同学可以网上查找资料
再写个使用template模块使用的例子。也是简单的例子。但是会加上简单的运算、循环和逻辑判断
现在,我们需要部署一台nginx服务器,部署需求是
1、nginx的worker_processes个数是cpu核数 x 2
2、部署2个vhosts,一个监听80端口,另一个监听8080端口
3、一个server_name是web1.test.com 另一个server_name是web2.test.com
4、2个vhosts的root路径分别是/var/www/web1和/var/www/web2
整个可能有点复杂,但是也不难。先写playbook
---
- hosts: 192.168.233.167
remote_user: root
vars:
cpu_cores: "{{ ansible_processor_cores }}"
nginx_vhosts:
- web1:
listen_port: 80
server_name: "web1.test.com"
root: "/var/www/web1"
- web2:
listen_port: 8080
server_name: "web2.test.com"
root: "/var/www.web2"
tasks:
- name: set nginx config from template
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
backup: yes
再写nginx.conf.j2
worker_processes {{ cpu_cores * 2}} #cpu核心数x2
{% for vhost in nginx_vhosts %} #循环playbook中nginx_vhosts中的变量
server {
listen {{ vhost.listen_port }}
{% if vhost.server_name is defined %} #判断playbook中是否定义server_name变量
server_name {{ vhost.server_name }}
{% endif %} #if语句结束
root {{ vhost.root }}
}
{% endfor %} #for语句结束
说明:上面模板是nginx配置文件的部分内容,测试使用。正确的做法是把原来的nginx.conf文件修改成nginx.conf.j2文件
看一下结果
[root@localhost ~]# ansible 192.168.233.167 -m shell -a "cat /etc/nginx/nginx.conf"
192.168.233.167 | CHANGED | rc=0 >>
worker_processes 2 #用的是虚拟机只给一个核这里x2,所以值为2
server {
listen 80
server_name web1.test.com
root /var/www/web1
}
server {
listen 8080
server_name web2.test.com
root /var/www.web2
}
template就说这么多吧
猜你喜欢
- 2024-12-22 关于 Nginx 的一些优化(突破十万并发)
- 2024-12-22 Nginx凭啥子并发数可以达到3w! nginx并发量多少
- 2024-12-22 在.net core中使用nginx做负载均衡
- 2024-12-22 【Nginx】史上最全的Nginx配置详解
- 2024-12-22 【Nginx】Nginx 4种常见配置实例 nginx配置cgi
- 2024-12-22 Nginx性能优化的几个方法 nginx优化配置大全
- 2024-12-22 Linux集群自动化监控系统Zabbix集群搭建到实战
- 2024-12-22 Nginx读书笔记-Nginx的工作原理 nginx作用和工作原理
- 2024-12-22 Nginx如何实现四层负载均衡 nginx 7层负载均衡
- 2024-12-22 Nginx为什么快到根本停不下来? nginx不起作用