Группы в инвентаре Ansible не работают должным образом - PullRequest
1 голос
/ 24 октября 2019

Мой инвентарь 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  

, и когда я пытаюсь пинговать (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 --list-hosts all я получил:

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.

1 Ответ

2 голосов
/ 24 октября 2019

Ваш файл инвентаря не соответствует формату ansible, поэтому плагин инвентаря yaml не может его проанализировать. Так как он пытается подключить плагины по порядку, по какой-то причине я не получаю, что он, наконец, успешно использует формат ini и дает один хост для каждой строки в вашем файле.

Более того, вы должны понимать, что группа (например, smx) содержит все хосты, которые были определены в инвентаре, где бы они не были определены (например, как дочерние элементы intranet или 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:

И вот несколько примеров того, как настроить таргетинг на нужные группы машин

$ # All machines
$ ansible -i dev/ --list-hosts all
  hosts (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
$ # Intranet
$ ansible -i dev/ --list-hosts intranet
  hosts (4):
    amqintradev01.company.net
    amqintradev02.company.net
    smxintradev01.company.net
    smxintradev02.company.net
$ # all smx machines
$ ansible -i dev/ --list-hosts smx
  hosts (4):
    mysmxdev01.company.net
    mysmxdev02.company.net
    smxintradev01.company.net
    smxintradev02.company.net
$ # amq machines only on dmz1
$ # 1. Only whith patterns
$ ansible -i dev/ --list-hosts 'amq:&dmz1'
  hosts (2):
    myamqdev01.company.net
    myamqdev02.company.net
$ # 2. Using limit
$ ansible -i dev/ --list-hosts amq -l dmz1
  hosts (2):
    myamqdev01.company.net
    myamqdev02.company.net
...