ansible使用with_项在HostVar中为特定主机分配shell结果

ansible使用with_项在HostVar中为特定主机分配shell结果,ansible,Ansible,基本上我想修改现有的hostvars。 我有一个动态生成的主机数组,名为“flash_hosts” 以及一个shell脚本,用于查找每个主机的值。 在下面的非工作代码中,我尝试为每个主机分配脚本的特定结果 - name: Assign values to to host var shell: "get-assigned-value.sh {{ item }}" register: "{{ hostvars[item].mac=stdout }}" with_items

基本上我想修改现有的hostvars。 我有一个动态生成的主机数组,名为“flash_hosts”

以及一个shell脚本,用于查找每个主机的值。 在下面的非工作代码中,我尝试为每个主机分配脚本的特定结果

- name:  Assign values to to host var
  shell:      "get-assigned-value.sh {{ item }}"
  register:   "{{ hostvars[item].mac=stdout }}"
  with_items: "{{ flash_hosts }}"

如何在ansible中实现此功能?基本上,我知道寄存器不允许我直接将值分配给hostvars,但是如何解决这个问题,因为我需要在主机上迭代?

使用
set\u fact
在主机上调试
寄存器
结果

  - name: Assign values to to host var
    shell: "/path/to/get-assigned-value.sh {{ item }}"
    register: fileout
    with_items:
         - host1
         - host2

  - set_fact:
       firstHost: "{{ fileout.results[0] }}"
       secondHost: "{{ fileout.results[1] }}"

  - debug:
      var: firstHost.stdout

  - debug:
      var: secondHost.stdout
在上面的示例中,
firstHost
是第一台主机上运行的shell脚本的全部结果,而
firstHost.stdout
给出了相应主机shell脚本结果的输出。

可以使用设置事实并将其委托给
flash\u主机

但是,要在
hostvars
中创建变量,必须在资源清册中声明主机(静态或动态)。主机不必是可访问的。比如说

$ cat hosts
host1
host2
下面的剧本

- hosts: localhost
  vars:
    flash_hosts: ['host1', 'host2']
  tasks:
    - name:  Assign values to to host var
      command: "{{ playbook_dir }}/get-assigned-value.sh {{ item }}"
      register: result
      loop: "{{ flash_hosts }}"
    - set_fact:
        mac: "{{ item.stdout }}"
      loop: "{{ result.results }}"
      delegate_to: "{{ item.item }}"
      delegate_facts: true
    - debug:
        msg: "{{ hostvars[item].mac }}"
      loop: "{{ flash_hosts }}"
给予

用剧本

$ cat get-assigned-value.sh
#!/bin/sh

case $1 in

    host1)
    printf "mac address of host1"
    ;;

    host2)
    printf "mac address of host2"
    ;;

    *)
    printf "unknown host"
    exit 1
    ;;

esac

exit 0

我明白了,所以我认为我的描述不完整,主机没有运行(它们需要在虚拟主机上刷新)。因此,如果计算机处于活动状态,此解决方案将起作用-对于清单中不存在的主机,没有
hostvars
。是的,这更接近于此,但是现在(为了方便和以后使用),我们如何将结果带入每个主机的hostvars(hostvars[项目])-我不喜欢保留全局变量,因为结果实际上应该是每个主机的一部分
ok: [localhost] => (item=host1) => 
  msg: mac address of host1
ok: [localhost] => (item=host2) => 
  msg: mac address of host2
$ cat get-assigned-value.sh
#!/bin/sh

case $1 in

    host1)
    printf "mac address of host1"
    ;;

    host2)
    printf "mac address of host2"
    ;;

    *)
    printf "unknown host"
    exit 1
    ;;

esac

exit 0