0. 概述

最近写 Ansible Playbook 用了不少以前没有用的特性,所以怕自己忘记了,这里写一些记录一下,这篇主要介绍 Ansible 中的 Template 的使用。

1. Anisble 模板介绍

以前我使用 Ansible 的时候,可能用的比较多的一个操作就是 copy,即将本地的一个文件拷贝到远程。但是,随着 copy 用多了之后,会发现有一些不方便,例如配置文件,不同的环境肯定配置文件的内容有所差异,例如应用要访问的 DB 地址,或者 DB 做 Replicas Set 需要设置的成员列表,这些都是依照环境不同而变化的。

这就是 Ansible Template 的常用用法之一,就是在本地放置的不是最终的配置文件,而是一个支持 Jinja2 语法的模板,可以在运行时,根据运行时参数的不同而生成不同的文件,从而应用到 Ansible 的 Playbook 中。

2. Ansible 模板项目结构

要使用 Ansible Template,需要注意 Ansible 的项目结构,默认情况下,Ansible 是从 Playbook 根目录的 templates 目录下寻找模板文件,所以,一个简单的项目结构可能是这样的:

[[email protected]]# tree
.
├── main.yaml
└── templates
    └── deployment.yaml

deploy.yaml 中使用 Template 类似与 copy:

[[email protected]]# cat main.yaml
- name: setup deployment.yaml with specified version
  template:
    src: deployment.yaml
    dest: /root/blueshark/basic/deployment.yaml

这样,当运行到这的时候,Ansible 就会渲染 deployment.yaml,根据里面的参数,渲染出最终的文件,然后 copy 到远程机器中。

3. Ansible 简单模板介绍

Ansible 的模板也是很容易编写的,和我们平时写代码的模板类似,这里就给一个引用变量的例子:

[[email protected]]# cat hello_world.j2

4. Ansible 模板内置变量

如果我们自己不额外添加参数,那么在 Ansible 内部有哪些默认参数可以使用呢?这里列举一下:

这些参数都是很有用的,不仅仅在 Ansible Template 中,即使在其他的类似与 handler 和 task 中也是非常有用。

5. Ansible 模板自定义变量

除了内置的变量,Ansible 也支持用户自己定义变量,定义方式为:

[[email protected]]# cat main.yaml
- name: kubeadm reset when kubeadm exists
  stat:
    path: /etc/kubernetes/admin.conf
  register: stat_result

这里就是确认一个文件在不在,然后将结果保存到变量 stat_result 中,下面看下如何使用它:

[[email protected]]# cat main.yaml
- name: copy admin.conf to user's kube config
  copy:
    src: /etc/kubernetes/admin.conf
    dest: /root/.kube/config
    remote_src: yes
    owner: root
  when: stat_result.stat.exists

这里就是一个使用它的例子,如果这个文件在的话,那么就做远程拷贝到另外一个位置。

6. Ref