在stdout上检索j2模板文件的内容

时间:2019-06-24 22:44:43

标签: ansible jinja2

我正在尝试使用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文件的内容或以某种方式从stdout检索它。

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

如果执行此操作,则可以执行以下操作:

echo result | kubectl apply -f -

其中的结果当然是模板后生成的YAML文件的内容,而f标志后面的短划线指定Kubernetes使用该进程的stdout。

很抱歉解释了很多,如有需要,我可以澄清。

2 个答案:

答案 0 :(得分:1)

  

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

在这种情况下,您将使用command: modulestdin:参数:

- 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 lookup plugin

- 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 }}'

答案 1 :(得分:0)

您在这里有几个选择。我通常会尽量避免炮轰command。签出ansible的k8s模块。请注意,只要statepresent,ansible就会修补您的对象。

- name: Apply your previously generated configmap if you so choose.
  k8s:
    state: present
    definition: "{{ lookup('file', '/output/foo.yml') }}"

甚至更好,您可以直接创建configmap

 - name: Create the configmap for {{ env }}
   k8s:
    state: present
    definition:
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: ConfigMap
        namespace: "{{ foo_namespace }}"
        labels:
          app: bar
          environment: "{{ bizzbang }}"