ansible - 如何通过从 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 项目。
解决方案
推荐阅读
- python - concurrent.futures.ProcessPoolExecutor() python 中的共享变量
- functional-programming - 如何在 Scheme 中编写 if-else 语句?
- vb.net - 有没有比 For Next 循环更快的方法来单击匹配的 webbrowser 元素?
- c++ - 无法更新c ++类中方法的for循环内的成员变量
- c++ - C++ 创建头文件时,多个重载函数实例与参数列表匹配
- mongodb - 无法设置侦听器:SocketException:无法分配请求的地址
- javascript - 将 html 表单的响应下载到文本文件
- javascript - 在循环中为变量赋值
- python - 如何在循环中绘制水平条图以根据另一列中的值更改条上的颜色
- git - 仅在需要身份验证时如何将 git 协议从 https 切换到 ssh