首页 > 解决方案 > 如何通过从 group_vars/all 获得的另一个任务项从 shell 输出迭代先前的任务结果

问题描述

我是 Ansible 的新手。如果我问的问题已经在其他地方得到回答,请原谅我。

我有以下与 Openstack 计算/控制器节点相关的要求(每个计算将有多个 nics/ips)。我想从远程主机(清单中主机文件中定义的主机列表)检索网卡和 IP 信息。对于我检索到的每个 IP,如果还没有,我想提交 dns 条目)。所以根据网卡名称,我的域名后缀会改变。例如:

NIC name         Domain Suffix
--------         -------------
br-ex            <hostname>.abc.com
enp6s0           <hostname>s.abc.com
enp7s0           <hostname>api.abc.com
enp8s0           <hostname>prv.abc.com

因此,为此我编写了剧本、shell 脚本(在文件下)和 groups_vars/all,如下所示:剧本:main_play.yml

---
- name: Get Nics and IPs
  hosts: 127.0.0.1
  connection: local

  tasks:
  - name: Get Compute Hosts List
    shell: files/ip_network_mapping.sh {{ item }}
    loop: "{{ query('inventory_hostnames', 'all') }}"
    register: ip_network_maps

  - debug: msg="{{ item }}"
    with_items: "{{ ip_network_maps | json_query('results[].stdout_lines[]') }}"
  - debug: msg="{{ ip_network_maps.results }}"

  - include_vars: "/home/<username>/ansible_examples/inventories/<env_name>/group_vars/all"
  - name: Print dns items
    debug: msg="{{ item.key }} {{ item.value }}"
    with_dict: "{{ dns_items }}"

外壳脚本:ip_network_mapping.sh

#!/usr/bin/bash

ARG1=$1
ssh -q <username>@${ARG1} "/usr/sbin/ip -o a | grep -v tap | grep -v qvo | grep -v qvb | grep -v inet6|grep -v 127.0.0.1|awk '{print \$2,\$4}'|awk -F[/] '{print \$1}'"

group_vars/all(这个 dns_items 像 enp6s0、enp7s0 等,在更高的 env 中会有所不同,所以我将为每个 env 定义 group_vars/all):dns_items:br-ex:env_tag:env_name dc_function:企业实用程序 vip:。美国广播公司

  enp6s0:
    env_tag: env_name
    dc_function: storage
    vip: a.abc.com

  enp7s0:
    env_tag: env_name
    dc_function: api
    vip: api.abc.com

  enp8s0:
    env_tag: env_name
    dc_function: provision
    vip: prv.abc.com

我的库存主机文件:[computes] hostname1 hostname2

我正在寻找的是,在剧本中,我想合并从远程主机检索的 nics 和 IP 信息,并与从 group_vars/all 文件检索到的 dns_items 匹配,并填充包含提交 dns 的所有必要信息的新哈希。例如:

br-ex:
  env_tag: env_name
  dc_function: enterprise utility
  vip: <hostname>.abc.com
  ip: xxx.xxx.xxx.xxx.

我无法让它按照我想要的方式工作。当我运行 playbook 时,我可以从远程主机获取 nics/ips 并获取 dns 项目。

标签: ansible

解决方案


推荐阅读