Ansible之模板与jinjia2

发布于 2019-10-04  13 次阅读


[dangerbox title="Ansible之模板与jinjia2"][/dangerbox]

前言

在实际工作中,开发出来的代码和程序都是有配置文件的(比如程序连接redis 或者Mysql 的用户名,密码,端口),在开发过程中需要做到规范的一点就是代码和配置文件要抽离开,不要形成耦合,并且要将配置文件的一些字段配置成模板,为什么呢?因为我们在生产中有多个环境,包括开发联调环境(前后端接口测试),测试环境(测试人员测试),以及生产环境。就拿测试环境和生产环境来说,如果都连接mysql,而这两个环境的mysql分别是部署在测试机器和生产机器两台机器,那么mysql的ip地址是不同的,如果配置文件中指定mysql ip地址的字段写死了,那么配置文件将无法在两个环境很好的切换,如何做呢?那就用到了模板(Template的概念),将配置文件可能会改变的字段用模板的形式修正,比如mysql的ip地址会改为{{mysql_ip}},然后另写一个配置定义好这些变量的值最后通过sed去修改(也就是通过sed去渲染这个模板)。以上的方法实际上是早期模板和渲染的原理,Ansible的配置文件模板(Template)与渲染也是利用了这个原理,即使部署到不同机器,通过模板也会将部署变得更加容易,下面我们一起来学习下Ansible的Template。

Jinja2与模板playbook

在前面的ansible学习中我们了解到ansible实际上是一个python写的自动化运维框架,他是依赖并驱动各个模块来实现不同功能的,而今天我们学习的模板也是依靠模块实现的,这个模块就是template,在内部实现中还涉及到了python的 jinja2引擎,所以如果你想要更年灵活的编辑模板文件,还需要学习下Jinja2相关对的基本知识,下面简单学习下Jinja2相关

一.创建好目录层级

为了方便测试首先创建好ansible playbook的目录层级,前面也说了ansible有自己规定好的一套规范,我们在书写playbook时保持这个规范就好,这样就能做到无论是谁写playbook都能做到清晰看出每个目录是做什么的。

  • mkdir ansible-playbook/roles/nginx{files,handles,vars,templates,tasks}

注意:tasks 就是存放任务的目录,他会读取里面的main.yaml文件,files用来存放一些文件或者软件包,templates用来存放配置文件模板里面是xxx.j2文件类型。vars里面存放模板用到的变量,handles用来配置触发器,还有meta目录以及host目录这里没有涉及到,但是一定要保证目录名字正确,不然执行ansible-playbook虽然提示ok但是会发现没达到需求,比如tasks目录写成了task执行后任务并没有执行。

二.创建playbook入口文件nginx.yaml

这个nginx.yaml名字可以自定义,为了规范位置一般放在与roles同级目录,放到其他位置也可以,因为执行时候通过ansible-playbook  指定nginx.yaml的位置。

[root@wangtingwei ansible-playbook]# cat nginx.yaml
- hosts: test
remote_user: root
roles:
- nginx

三.创建tasks任务

这里按照ansible规范,创建main.yaml,因为本文只演示模板功能,在task中只定义了一个任务,通过template模块实现。

[root@wangtingwei ansible-playbook]# cat roles/nginx/tasks/main.yaml
- name: 修改nginx模板配置
template: src=nginx.conf.j2 dest=/root/nginx.conf

四.创建模板templates

[root@wangtingwei ansible-playbook]# cat roles/nginx/templates/nginx.conf.j2
server {
listen {{ nginx_port }};
server_name {{ nginx_domain }};

location / {

root {{ nginx_data }};
index index.html index.php index.htm;

}

五.创建模板用到的变量vars

[root@wangtingwei ansible-playbook]# cat roles/nginx/vars/main.yaml
nginx_port: 80
nginx_domain: wangtingwei.info
nginx_data: /var/www/html/

备注:变量要严格按照规定格式书写:后面一个空格

六.执行ansible-playbook验证效果

  • ansible-playbook nginx.yaml

  • 验证目标目录是否通过模板渲染出了我们所需的配置文件


一个幽默,喜欢动漫,音乐,爱小动物,逐渐成为二次元肥宅的LINUX运维工程师,我会用心写博客,刚开始写的不太好。但是我会不断进步的!。就像我的博客下面写的。我宁愿做错,也不愿什么都不做 ps:好像是伊泽瑞尔说的,看来你游戏没少玩啊 23333333333333