1

Я использую Ansible для развертывания на Amazon EC2, и у меня есть ec2.py и ec2.ini, поэтому я могу получить список серверов из Amazon. У меня есть сервер на AWS помечен rvmdocker:production и ansible all --list возвращает свой тег, как ec2_tag_rvmdocker_production. я также могу работать:Ansible не может разрешить тег EC2, если он указан в статическом инвентаре

ansible -m ping tag_rvmdocker_production` 

и она работает. Но если у меня есть этот тег в статическом файле инвентаризации и выполнить команду:

ansible all -m ping -i production 

возвращается:

tag_rvmdocker_production | UNREACHABLE! => { 
    "changed": false, 
    "msg": "ERROR! SSH encountered an unknown error during the connection. Werecommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue", 
    "unreachable": true 
} 

Вот мой файл производства инвентаризации:

[dockerservers] 
tag_rvmdocker_production 

Похоже анзибль не может разрешить tag_rvmdocker_production, когда он находится в файле статической инвентаризации.

UPDATE

Я последовал совету ydaetskcoR и я теперь получаю новое сообщение об ошибке:

$ ansible-playbook -i production app.yml 
ERROR! ERROR! production:2: Section [dockerservers:children] includes undefined group: tag_rvmdocker_production 

Но я знаю, что тег существует, и, похоже, анзибль и ec2.py знают это:

$ ansible tag_rvmdocker_production --list 
    hosts (1): 
    12.34.56.78 

Вот мое производство инвентаря:

[dockerservers:children] 
tag_rvmdocker_production 

И мой app.yml Playbook файл:

--- 
- name: Deploy RVM app to production 
    hosts: dockerservers 
    remote_user: ec2-user 
    become: true 
    roles: 
    - ec2 
    - myapp 

В конце концов, я хотел бы быть в состоянии выполнить тот же сборник пьес против развития (ВМ на моем Mac), постановка, или производство , чтобы запустить среду. Моя мысль состояла в том, чтобы иметь статические файлы инвентаризации, указывающие на теги или группы на EC2. Я даже подхожу к этому правильно?

+0

Что заставляет вас думать, что вы можете указывать экземпляры по именам тегов в статическом файле инвентаризации? – ydaetskcoR

+0

Он смотрел в [docs] (http://docs.ansible.com/ansible/intro_dynamic_inventory.html#static-groups-of-dynamic-groups), как будто у меня мог быть файл статической инвентаризации с динамическими группами. Я совершенно новый для Ansible и EC2, хотя и, вероятно, неправильно понял его. –

+0

Вы неправильно поняли. В этом примере показаны две динамические группы, называемые «tag_Name_staging_foo» и «tag_Name_staging_bar», а затем статическая группа под названием «staging», которая содержит обе динамические группы как дочерние элементы группы «staging». См. [Здесь] (http://docs.ansible.com/ansible/intro_inventory.html#groups-of-groups-and-group-variables) для примера групп групп вне динамических запасов. – ydaetskcoR

ответ

0

Как указано в комментариях, похоже, что вы неправильно поняли использование тегов в динамическом инвентаре.

AWS EC2 dynamic inventory script позволяет вам группировать группы серверов по комбинации клавиш/значений тегов. Таким образом, чтобы настроить таргетинг на ваши веб-серверы, у вас может быть тэг с именем Role, который в этом случае установлен в web, который затем будет таргетирован как динамическая группа с tag_Role_web.

У вас также может быть static groups that contain children dynamic groups. Это так же, как, как вы используете groups of groups обычно в файле инвентаризации, которые могут быть использованы, как это:

[web-servers:children] 
front-end-web-servers 
php-web-servers 

[front-end-web-servers] 
www-web-1 
www-web-2 

[php-web-servers] 
php-web-1 
php-web-2 

Который позволит вам родовым цель или набор переменных группы для всех веб-серверов выше, просто используя более общую группу web-servers, а затем специально настроить типы веб-серверов, используя более конкретные группы либо front-end-web-servers, либо php-web-servers.

Однако, если вы поместили запись под группой, где она не определена как дочерняя, тогда Ansible предположит, что это хост, и затем попытается напрямую подключиться к этому узлу.

Если у вас есть экземпляр с уникальной меткой, который вы пытаетесь достичь через динамический инвентарь, вы просто используете его, как если бы это была группа (в действительности только один экземпляр имеет только один экземпляр).

Так что, если вы хотите предназначаться или установить переменные для dockerservers группы, которая затем включает в себя экземпляр, который меченый с ключом пары комбинации rvmdocker: production, то вы бы просто сделать это:

[dockerservers:children] 
tag_rvmdocker_production 

[tag_rvmdocker_production] 
+0

Спасибо за ваш ответ, это полезный контекст. Я обновил вопрос выше - все еще не работает, но отличается обратной связью от Ansible. –

+0

Извинения, я пропустил окончательное определение динамической группы в моем примере. Как я уже упоминал в оставшейся части примера, вы просто используете его как дочернюю группу статической группы, но вам все равно нужно определить пустую группу. – ydaetskcoR

+0

По-прежнему ничего хорошего. Я попытался определить пустую группу как выше, так и ниже [dockerservers: children], без успеха.Когда я определил это как в вашем примере выше, ошибка: [ПРЕДУПРЕЖДЕНИЕ]: при условии, что список хостов пуст, доступен только локальный хост PLAY [Развернуть приложение RVM для производства] ******** ************************************ пропуск: нет совпадений хостов PLAY RECAP **** ************************************************** *************** Дополнительная информация: Я запускаю сценарии Ansible на своем Mac, и у меня есть файл конфигурации Boto с моими AWS-кредитами на ~/.boto. –

2

Я был аналогичный вопрос этому, и разрешил его следующим образом.

Во-первых, я создал папку, чтобы содержать свои инвентаризации файлов, и положить туда символическую ссылку на моей /etc/ec2.ini, копия (или символическая) в ec2.py сценария (с исполняемым статусом) и hosts файл следующим образом.

$ ls amg-dev/* 
amg-dev/ec2.ini -> /etc/ec2.ini 
amg-dev/ec2.py 
amg-dev/hosts 

Мои экземпляры EC2 помечаются Type = amg_dev_web

файл хостов в содержит следующую информацию - заготовка первого входа важно здесь.

[tag_Type_amg_dev_web] 

[webservers:children] 
tag_Type_amg_dev_web 

[all:children] 
webservers 

Тогда, когда я бегу ansible-playbook я указать имя папки только в инвентаре, который делает анзибль прочитать файл hosts и выполнить в ec2.py сценарий опрашивать AWS.

ansible-playbook -i amg-dev/ playbook.yml 

Внутри моего сборника пьес, я имею в виду их как следующим

- name: WEB | Install and configure relevant packages 
    hosts: webservers 
    roles: 
    - common 
    - web 

который, кажется, работает, как ожидалось.