синтаксический анализ отладочной информации из модуля ansible k8s_info

Я тестирую модуль ansible k8s_info, и у меня возникла проблема с анализом результата в регистровой переменной.

Playbook получает модули из всех пространств имен. Моя цель - распечатать только информацию spec.containers из каждого модуля, возвращенного в зарегистрированной переменной.

---
- name: kubenetes demo
  hosts: control
  gather_facts: true

  tasks:

    - name: get a list of all pods
      k8s_info:
        kind: Pod
      register: pod_list

    - debug:
        msg:
        - "Containers in use {{ item.spec.containers }}"
      loop: "{{ pod_list.resources }}"

Результат, который я получил (сокращен для краткости):

ok: [10.0.0.110] => (item={'metadata': {'name': 'coredns-66bff467f8-22f6v', 'generateName': 'coredns-66bff467f8-', 'namespace': 'kube-system', 'selfLink': '/api/v1/namespaces/kube-system/pods/coredns-66bff467f8-22f6v'


"msg": [
        "Containers in use [{'name': 'coredns', 'image': 'k8s.gcr.io/coredns:1.6.7', 'args': ['-conf', '/etc/coredns/Corefile'], 'ports': [{'name': 'dns', 'containerPort': 53, 'protocol': 'UDP'}, {'name': 'dns-tcp', 'containerPort': 53, 'protocol': 'TCP'}, {'name': 'metrics', 'containerPort': 9153, 'protocol': 'TCP'}], 'resources': {'limits': {'memory': '170Mi'}, 'requests': {'cpu': '100m', 'memory': '70Mi'}}, 'volumeMounts': [{'name': 'config-volume', 'readOnly': True, 'mountPath': '/etc/coredns'}, {'name': 'coredns-token-hdddf', 'readOnly': True, 'mountPath': '/var/run/secrets/kubernetes.io/serviceaccount'}], 'livenessProbe': {'httpGet': {'path': '/health', 'port': 8080, 'scheme': 'HTTP'}, 'initialDelaySeconds': 60, 'timeoutSeconds': 5, 'periodSeconds': 10, 'successThreshold': 1, 'failureThreshold': 5}, 'readinessProbe': {'httpGet': {'path': '/ready', 'port': 8181, 'scheme': 'HTTP'}, 'timeoutSeconds': 1, 'periodSeconds': 10, 'successThreshold': 1, 'failureThreshold': 3}, 'terminationMessagePath': '/dev/termination-log', 'terminationMessagePolicy': 'File', 'imagePullPolicy': 'IfNotPresent', 'securityContext': {'capabilities': {'add': ['NET_BIND_SERVICE'], 'drop': ['all']}, 'readOnlyRootFilesystem': True, 'allowPrivilegeEscalation': False}}]"

Я хочу, чтобы сообщение отображалось только на терминале. Как мне структурировать эту пьесу, чтобы отображалось только сообщение? Нужен ли мне шаблон jinja2?

0
задан 13 May 2020 в 16:46
1 ответ

Это невозможно. Ansible — это инструмент командной строки, который вы используете для запуска некоторых задач и выполнения некоторых заданий. Это не инструмент для создания красивого вывода терминала/оболочки поиска. Таким образом, информация о том, что все в порядке, не удалось, изменено и т. д., жестко запрограммирована в стандартный вывод.

Если вам нужны только выходные данные по другим причинам, вы можете вызвать playbook и записать вывод var в шаблон и остановить playbook. Следующий скрипт выводит только данные шаблона. Простой пример:

- name: "Write response to template"
  template:
    src: my_template.txt.j2
    dest: result.txt

И сам шаблон

{% for item in pod_list.resources %}
Containers in use {{ item.spec.containers }}
{% endfor %}

Ответ находится в response.txt и может быть просмотрен скриптом типа

#!/bin/sh
ansible-playbook my-play.yml > /dev/null 2>&1
cat response.txt
0
ответ дан 11 January 2021 в 16:11

Теги

Похожие вопросы