我的Ansible清单中的组无法按预期工作
我的yaml清单(开发环境)如下所示:我的Ansible清单中的组无法按预期工作,ansible,ansible-inventory,Ansible,Ansible Inventory,我的yaml清单(开发环境)如下所示: $> more inventory/dev/hosts.yml all: children: dmz1: children: ch: children: amq: hosts: myamqdev01.company.net: nodeId=1 myamqdev02.comp
$> more inventory/dev/hosts.yml
all:
children:
dmz1:
children:
ch:
children:
amq:
hosts:
myamqdev01.company.net: nodeId=1
myamqdev02.company.net: nodeId=2
smx:
hosts:
mysmxdev01.company.net: nodeId=1
mysmxdev02.company.net: nodeId=2
intranet:
children:
ch:
children:
amq:
hosts:
amqintradev01.company.net: nodeId=1
amqintradev02.company.net: nodeId=2
smx:
hosts:
smxintradev01.company.net: nodeId=1
smxintradev02.company.net: nodeId=2
当我尝试ping(使用ansible-I inventory/dev-m ping all
时,我得到了错误:
children: | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname children:: Temporary failure in name resolution",
"unreachable": true
}
ch: | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname ch:: Temporary failure in name resolution",
"unreachable": true
}
all: | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname all:: Temporary failure in name resolution",
"unreachable": true
}
lan: | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname lan:: Temporary failure in name resolution",
"unreachable": true
}
amq: | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname amq:: Temporary failure in name resolution",
"unreachable": true
}
hosts: | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname hosts:: Temporary failure in name resolution",
"unreachable": true
}
etc...
对于疑难解答,当我执行ansible-I inventory/dev--列出我得到的所有主机时:
hosts (16):
all:
children:
dmz1:
ch:
amq:
hosts:
myamqdev01.company.net:
myamqdev02.company.net:
smx:
mysmxdev01.company.net:
mysmxdev02.company.net:
intranet:
amqintradev01.company.net:
amqintradev02.company.net:
smxintradev01.company.net:
smxintradev02.company.net:
我认为这个命令应该只给主机,不是吗
我不确定问题出在哪里,但我遵循了中的示例,我认为我的hosts.yml文件存在问题,但无法猜测我缺少了什么
更新
当我根据答案更正nodeId变量时,列表all
工作正常。但是,当我尝试按中间父级进行筛选时,这不起作用:
ansible -i inventory/dev --list-hosts intranet
不返回内部网主机,但返回所有主机
当我尝试时:ansible-I inventory/dev--list hosts amq
只有amq服务器被正确返回。您的清单文件不符合ansible的格式,因此yaml清单插件无法解析它。由于它按顺序尝试插件,出于某种原因,我无法真正理解它最终使用ini格式成功,并为文件中的每行提供一个主机
此外,您必须了解,一个组(例如smx
)包含在资源清册中定义的所有主机,无论这些主机在何处定义(例如,作为内部网的子级或dmz1
)
因此,在您的实际库存结构中,dmz1
和intranet
都包含组amq
和smx
,它们本身包含intranet
或dmz1
部分中定义的所有主机。因此,组all
、dmz1
和intranet
此处的所有主机都是等效的,并且包含资源清册中的所有主机
以下是一份清单,它解决了您的格式问题,并采用了稍微不同的结构,以满足您在群体目标方面的期望:
---
all:
children:
dmz1:
hosts:
myamqdev01.company.net:
nodeId: 1
myamqdev02.company.net:
nodeId: 2
mysmxdev01.company.net:
nodeId: 1
mysmxdev02.company.net:
nodeId: 2
intranet:
hosts:
amqintradev01.company.net:
nodeId: 1
amqintradev02.company.net:
nodeId: 2
smxintradev01.company.net:
nodeId: 1
smxintradev02.company.net:
nodeId: 2
amq:
hosts:
myamqdev01.company.net:
myamqdev02.company.net:
amqintradev01.company.net:
amqintradev02.company.net:
smx:
hosts:
mysmxdev01.company.net:
mysmxdev02.company.net:
smxintradev01.company.net:
smxintradev02.company.net:
下面是一些如何针对所需机器组的示例
$#所有机器
$ansible-i dev/--列出所有主机
主持人(8):
myamqdev01.company.net
myamqdev02.company.net
mysmxdev01.company.net
mysmxdev02.company.net
amqintradev01.company.net
amqintradev02.company.net
smxintradev01.company.net
smxintradev02.company.net
$#内部网
$ansible-i dev/--列出内部网的主机
主持人(4):
amqintradev01.company.net
amqintradev02.company.net
smxintradev01.company.net
smxintradev02.company.net
$#所有smx机器
$ansible-i dev/--列出主机smx
主持人(4):
mysmxdev01.company.net
mysmxdev02.company.net
smxintradev01.company.net
smxintradev02.company.net
$#仅dmz1上的amq机器
$#1.仅限模式
$ansible-i dev/--列出主机的amq:&dmz1'
主持人(2):
myamqdev01.company.net
myamqdev02.company.net
$#2.使用限制
$ansible-i dev/--列出主机amq-l dmz1
主持人(2):
myamqdev01.company.net
myamqdev02.company.net
谢谢,它工作得更好,但是当我想在一个家长身上进行筛选时,比如ansible-I inventory/dev--列出主机intranet
我得到了所有主机。在smx或amq上进行筛选是可行的。答案是编辑的。你必须改变你的库存结构以实现你想要的,以澄清官方文档中提供的示例,但这并不是真的解决我的需要。你的例子更清楚。