ansible - 在标准输出上检索 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 使用进程的标准输出。
很抱歉解释了这么多,如果需要,我可以澄清任何事情。
解决方案
我想检索模板的结果,并将其通过管道传递到该命令中,例如“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 }}'
推荐阅读
- ruby-on-rails - 如何修复“Sprockets::FileNotFound: 找不到类型为 'application/javascript' 的文件 'turbolinks'”
- python - 如何在 PyQt 中创建一个类似于 messageBox 的窗口
- javascript - Vue.js open link in new window
- html - 像 Whatsapp 一样,如何在您键入时进行向上延伸的输入?
- tizen - Tizen Web SDK:如何远程调试(Web 检查器)在手表(Galaxy)上运行的 Web 应用程序?
- c - strcmp 的段错误
- android - 我垂直分配底部的 StackLayout 下面有一个间隙?
- go - 为什么我会从这个简单的 Go 代码中得到这样的输出?
- javascript - javascript 函数只能在页面上运行一次
- r - 名称错误(x)<-值:“名称”属性 [8] 必须与向量 [2] 的长度相同