从 ansible k8s_info 模块解析调试信息

从 ansible k8s_info 模块解析调试信息

我正在测试 ansible k8s_info 模块,并在寄存器变量中解析结果时遇到挑战。

该剧本从所有命名空间获取 Pod。我的目标是仅打印已注册变量中返回的每个 Pod 的 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 模板吗?

答案1

这是不可能的。Ansible 是一个 CLI 工具,可用于运行某些任务和执行某些作业。它不是用于创建良好的查找终端/shell 输出的工具。因此,ok、failed、changed 等信息是硬编码写入 stdout 的。

如果您仅出于其他原因需要输出,那么您可以调用剧本并将变量的输出写入模板并停止剧本。下一个脚本仅输出模板的数据。简单的例子:

- 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

相关内容