可以,在获取多个寄存器命令的结果时出错



我试着得到如下结果:

- 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

相关内容

  • 没有找到相关文章

最新更新