首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以使用with_items在hostvars中分配外壳结果特定的主机

可以使用with_items在hostvars中分配外壳结果特定的主机
EN

Stack Overflow用户
提问于 2019-12-25 16:48:55
回答 2查看 169关注 0票数 0

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

代码语言:javascript
复制
flash_hosts = ['host1', 'host2'] 

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

代码语言:javascript
复制
- name:  Assign values to to host var
  shell:      "get-assigned-value.sh {{ item }}"
  register:   "{{ hostvars[item].mac=stdout }}"
  with_items: "{{ flash_hosts }}"

我怎样才能在ansible中工作呢?基本上我知道register不允许我直接给hostvar赋值,但是这个问题怎么解决呢,因为我需要遍历主机?

EN

回答 2

Stack Overflow用户

发布于 2019-12-25 22:13:00

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

代码语言:javascript
复制
  - 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是在第一台主机上运行的外壳脚本的全部结果,而firstHost.stdout给出了相应主机外壳脚本结果的输出。

票数 0
EN

Stack Overflow用户

发布于 2019-12-25 22:14:09

这是可能的set_facts和delegate_to的flash_hosts与。

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

代码语言:javascript
复制
$ cat hosts
host1
host2

下面的剧本

代码语言:javascript
复制
- 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 }}"

给出

代码语言:javascript
复制
ok: [localhost] => (item=host1) => 
  msg: mac address of host1
ok: [localhost] => (item=host2) => 
  msg: mac address of host2

使用脚本

代码语言:javascript
复制
$ 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59476689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档