首页 > 解决方案 > 在标准输出上检索 j2 模板文件的内容

问题描述

我正在尝试使用 Ansible 在多环境项目(开发、阶段和产品)中更好地管理我的 Kubernetes 配置映射。我已经将每个配置映射概括为 j2 模板,并且我将根据变量在不同环境中的变化方式来覆盖变量(这样对于基本相同的文件,它们不会重复三次)。

我的剧本目前看起来像这样:

---
- hosts: localhost
  vars_files:
    - "vars/{{ env }}.yml"
  tasks:
    - name: Generate YAML from j2 template
      template:
        src: templates/foo.j2
        dest: output/foo.yml

到目前为止,这对于测试来说效果很好。但是,我想将其合并到我已经存在的 Jenkins CI/CD 中,但我无法理解它如何与我目前正在做的事情一起工作。

在从 j2 生成基本上是 Kuberenets ConfigMap 之后,我将在 Jenkins 中以某种方式执行此操作:

kubectl apply -f <yaml>

但是,该剧本每次运行时都会创建一个 YAML 文件,我想知道是否有替代方法可以让我通过管道传输 YAML 文件的内容或以某种方式从标准输出中检索它。

基本上,我想评估模板并检索它,而不必创建文件。

如果我这样做,我可以执行以下操作:

echo result | kubectl apply -f -

其中结果当然是模板化后生成的 YAML 文件的内容,f 标志后面的短破折号指定 Kubernetes 使用进程的标准输出。

很抱歉解释了这么多,如果需要,我可以澄清任何事情。

标签: ansiblejinja2

解决方案


我想检索模板的结果,并将其通过管道传递到该命令中,例如“echo result | kubectl apply -f -”

在这种情况下,您将使用模块stdin:的参数:command:

- name: generate kubernetes yaml
  command: echo "run your command that generates yaml here"
  register: k8s_yaml

- name: feed the yaml to kubectl apply
  command: kubectl apply -f -
  stdin: '{{ k8s_yaml.stdout }}'

目前尚不清楚您的问题的顶部(处理template:)和底部之间的关系是什么apply -f -,但如果您的意思是“如何将模板呈现给变量而不是文件?” 答案是template查找插件

- name: render the yaml
  set_fact:
    k8s_yaml: '{{ lookup("template", "templates/foo.j2") }}'

- name: now feed it to apply
  command: kubectl apply -f -
  stdin: '{{ k8s_yaml }}'

推荐阅读