我的Ansible清单中的组无法按预期工作

我的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

我的yaml清单(开发环境)如下所示:

$> 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上进行筛选是可行的。答案是编辑的。你必须改变你的库存结构以实现你想要的,以澄清官方文档中提供的示例,但这并不是真的解决我的需要。你的例子更清楚。