ansible - ansible ssh 到循环中的 json_query 响应值
问题描述
团队,我有来自 json_query 的响应,它是一个字典键:值,我想遍历所有值并为每个值运行 ssh 命令
下面让我列出所有节点
- name: "Fetch all nodes from clusters using K8s facts"
k8s_facts:
kubeconfig: $WORKSPACE
kind: Node
verify_ssl: no
register: node_list
- debug:
var: node_list | json_query(query)
vars:
query: 'resources[].{node_name: metadata.name, nodeType: metadata.labels.nodeType}'
任务 [3_validations_on_ssh:调试]
ok: [target1] => {
"node_list | json_query(query)": [
{
"nodeType": null,
"node_name": "host1"
},
{
"nodeType": "gpu",
"node_name": "host2"
},
{
"nodeType": "gpu",
"node_name": "host3"
}
]
}
要编写的剧本:解析 node_name 并在 ssh 命令中为所有主机 1-3 使用它
- name: "Loop on all nodeNames and ssh."
shell: ssh -F ~/.ssh/ssh_config bouncer@{{ item }}.internal.sshproxy.net "name -a"
register: ssh_result_per_host
failed_when: ssh_result_per_host.rc != 0
with_item: {{ for items in query.node_name }}
- debug:
var: ssh_result_per_host.stdout_lines
错误输出:
> The offending line appears to be:
failed_when: ssh_result_per_host.rc != 0
with_item: {{ for items in query.node_name }}
^ here
当我循环时,解决方案 2 也失败了:
shell: ssh -F ~/.ssh/ssh_config bouncer@{{ item.metadata.name }}.sshproxy.internal.net "name -a"
loop: "{{ node_list.resources }}"
loop_control:
label: "{{ item.metadata.name }}"
输出溶胶2:
failed: [target1] (item=host1) => {"msg": "Invalid options for debug: shell"}
failed: [target1] (item=host2) => {"msg": "Invalid options for debug: shell"}
fatal: [target1]: FAILED! => {"msg": "All items completed"}
解决方案
扩展 Ash 的正确答案:
- name: "Fetch all nodes from clusters using K8s facts"
k8s_facts:
kubeconfig: $WORKSPACE
kind: Node
verify_ssl: no
register: node_list
- set_fact:
k8s_node_names: '{{ node_list | json_query(query) | map(attribute="node_name") | list }}'
vars:
query: 'resources[].{node_name: metadata.name, nodeType: metadata.labels.nodeType}'
- name: "Loop on all nodeNames and ssh."
shell: ssh -F ~/.ssh/ssh_config bouncer@{{ item }}.internal.sshproxy.net "name -a"
register: ssh_result_per_host
with_items: '{{ k8s_node_names }}'
另外,除非你真的只是想运行那个命令,否则ansible ssh
考虑这个问题的方式是 via add_host:
:
- hosts: localhost
connection: local
gather_facts: no
tasks:
# ... as before, to generate the "k8s_node_names" list
- add_host:
hostname: '{{ item }}.internal.sshproxy.net'
groups:
- the_k8s_nodes
ansible_ssh_username: bouncer
# whatever other per-host variables you want
with_items: '{{ k8s_node_names }}'
# now, run the playbook against those nodes
- hosts: the_k8s_nodes
tasks:
- name: run "name -a" on the host
command: name -a
register: whatever
这是一个人为的示例,因为如果您实际上只想获取 kubernetes 节点列表并在剧本中使用这些节点,则可以使用动态清单脚本
推荐阅读
- azure-data-factory - 我无法从 Azure 数据工厂中的 Impala 获取数据。通过查询超时异常复制活动
- powershell - 更新列表视图 SharePoint PowerShell
- amazon-web-services - Amazon SNS 未向沙特号码发送?
- c# - X509 创建 JWT - “找不到请求的对象”
- arrays - 如何在比较中正确使用数组?
- javascript - 如果玩家有角色(discord.js)
- django - i18n url 出现问题,我被重定向到正确的 url 但找不到模板
- reactjs - ReactJS - 将 PDF 文件列表导入 React 组件,然后将 pdf 转换为 png 并在 Image 组件中使用
- timer - 嵌入中的 Discord.js 秒精度更新计时器
- javascript - 在js中创建wav文件