Я тестирую модуль 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?
Это невозможно. 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