Извлечение содержимого файла шаблона j2 на стандартный вывод - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь использовать Ansible, чтобы лучше управлять моими конфигурационными картами Kubernetes в мультисредовом проекте (dev, stage и prod).Я обобщил каждую из карт конфигурации в виде шаблонов j2 и переопределю переменные в зависимости от того, как они могут изменяться в разных средах (чтобы они не дублировались три раза для одного и того же файла).

Моя игровая книга сейчас выглядит примерно так:

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

И до сих пор это отлично работало для тестирования.Тем не менее, я нахожусь в точке, где я хочу включить это в мой уже существующий CI / CD Jenkins, но у меня возникают проблемы с пониманием, как это может работать с тем, что я делаю в настоящее время.

После генерации чегоэто в основном Kuberenets ConfigMap от j2, я как-то сделаю это в Jenkins:

kubectl apply -f <yaml>

Однако, playbook создает файл YAML каждый раз, когда я его запускаю, и мне интересно, есть лиальтернатива, которая позволила бы мне передать содержимое файла YAML или каким-либо образом извлечь его из stdout.

По сути, я хочу оценить шаблон и получить его без необходимости создания файла.

ЕслиСделав это, я мог бы сделать что-то вроде следующего:

echo result | kubectl apply -f -

, где результатом, конечно, является содержимое файла YAML, получающегося после шаблонов, и коротким тире после флага f указывает Kubernetes для использованияstdout процесса.

Извините за столько объяснений, я могу уточнить все, что нужно.

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Я хотел бы получить результат шаблона и передать его в эту команду, например «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 }}'
0 голосов
/ 26 июня 2019

У вас есть несколько вариантов здесь. Я обычно стараюсь держаться подальше от обстрела до command везде, где это возможно. Проверьте модуль k8s в ansible. Обратите внимание, что, пока state является present, ansible будет исправлять ваш объект.

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

Или, что еще лучше, вы можете просто создать конфигурационную карту

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

...