我试着得到如下结果:
- name: Populate known_hosts
hosts: spectrum_scale
gather_facts: no
tags: set_known_hosts
become: true
tasks:
- name: Get hosts list from known_host
ansible.builtin.shell:
cmd: "cat /root/.ssh/known_hosts |
grep {{ hostvars[item].ansible_fqdn }}"
with_items: "{{groups['spectrum_scale']}}"
ignore_errors: yes
register: hosts2add
- name: Scan for SSH client keys
ansible.builtin.shell:
cmd: "ssh-keyscan {{ hostvars[h2a_r.item].ansible_fqdn }},
{{ hostvars[h2a_r.item].ansible_default_ipv4.address }}
2>/dev/null"
loop: "{{ hosts2add.results }}"
loop_control:
loop_var: h2a_r
when: h2a_r.rc
register: ssh_scan
- name: Display debug
ansible.builtin.debug:
msg: "FINGERPRINT TO ADD {{ ss_r.stdout_lines }}"
# var: ss_r.stdout_lines
loop: "{{ ssh_scan.results }}"
loop_control:
loop_var: ss_r
我得到了错误:
{"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'stdout_lines'
真正奇怪的是如果使用var而不是msg我得到了我需要的值
var: ss_r.stdout_lines
我发现了一个旧的帖子(多个命令的可见寄存器结果),但建议的解决方案似乎不适合我
谢谢你的帮助
我不知道你在找什么,但是result
是一个包含你存储的所有值的字典。
如果你要使用loop
循环,你需要传递dict2items
例如:
- name: Display debug
ansible.builtin.debug:
msg: "FINGERPRINT TO ADD {{ ss_r.stdout_lines }}"
# var: ss_r.stdout_lines
loop: "{{ ssh_scan.results | dict2items }}"
loop_control:
loop_var: ss_r
可能解决了您之前所说的错误信息。
如果known_hosts
文件中已经有了所有的主机,那么上面的代码就可以工作了。在这种情况下,总是执行命令并定义变量。如果你的known_hosts
是空的,你运行"Display debug"打印var将得到如下输出:
"ss_r.stdout_lines": "VARIABLE IS NOT DEFINED!"
所以为了让任务失败你需要指定:
when: ss_r.stdout_lines is defined
为了完整起见,这里有完整的任务正在工作:
- name: Display debug
ansible.builtin.debug:
msg: "FINGERPRINT TO ADD {{ ss_r.stdout_lines }}"
loop: "{{ ssh_scan.results }}"
loop_control:
loop_var: ss_r
when: ss_r.stdout_lines is defined