我正在尝试使用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。
很抱歉解释了很多,如有需要,我可以澄清。
答案 0 :(得分:1)
我想检索模板的结果,并将其通过管道传递到该命令中,例如“ echo result | kubectl apply -f-”
在这种情况下,您将使用command:
module的stdin:
参数:
- 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模块。请注意,只要state
为present
,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 }}"