Ansible Assign Shell使用with_items

时间:2019-12-25 08:48:55

标签: ansible

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

flash_hosts = ['host1', 'host2'] 

和一个shell脚本,该脚本为每个主机查找一个值。 在以下无效代码中,我尝试为每个主机分配脚本的特定结果

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

我如何才能使这项工作顺利进行?基本上我知道寄存器不允许我直接将值分配给hostvars,但是当我需要遍历主机时,如何解决呢?

2 个答案:

答案 0 :(得分:0)

使用set_fact在主机上调试register的结果。

  - 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脚本结果的输出。

答案 1 :(得分:0)

<{> set_facts 和 delegate_to delegate_factsmapmyindia-angular-sample-webSDK-REST都是可能的。

但是,要在flash_hosts中创建变量,必须在清单(静态或动态)中声明主机。主机不可访问。例如

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 }}"

使用脚本

ok: [localhost] => (item=host1) => 
  msg: mac address of host1
ok: [localhost] => (item=host2) => 
  msg: mac address of host2