我正在测试 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