Ansible ec2 предоставляет только необходимые серверы

У меня есть базовая инструкция по использованию Ansible, например:

---

- name: Provision ec2 servers
  hosts: 127.0.0.1
  connection: local
  roles:
    - aws

- name: Configure {{ application_name }} servers
  hosts: webservers
  sudo: yes
  sudo_user: root
  remote_user: ubuntu
  vars:
    - setup_git_repo: no
    - update_apt_cache: yes
  vars_files:
    - env_vars/common.yml
    - env_vars/remote.yml
  roles:
    - common
    - db
    - memcached
    - web

со следующим инвентарем:

[localhost]
127.0.0.1 ansible_python_interpreter=/usr/local/bin/python

Задача «Предоставление серверов ec2» делает то, что вы ожидаете. Создает экземпляр ec2; он также создает группу хостов [веб-серверы] и добавляет к ней созданный IP-адрес экземпляра.

На этапе настройки серверов {{application_name}} затем настраивается этот сервер, устанавливая все, что мне нужно.

Пока все хорошо, все это делает именно то, что я хочу, и все вроде работает.

Вот где я застрял. Я хочу иметь возможность запускать экземпляр ec2 для разных ролей. В идеале я бы создал dbserver, веб-сервер и, возможно, сервер memcached. Я хотел бы иметь возможность развернуть любую часть (-ы) этой инфраструктуры изолированно, например создать и подготовить только серверы db

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

Я попробовал просто объявить группы хостов без хостов в инвентаре:

[webservers]

[dbservers]

[memcachedservers]

но это синтаксическая ошибка.

Я бы согласился явно подготовить каждый сервер и объявить группу хостов, для которой он предназначен, например:

- name: Provision webservers
  hosts: webservers
  connection: local
  roles:
    - aws

- name: Provision dbservers
  hosts: dbservers
  connection: local
  roles:
    - aws

- name: Provision memcachedservers
  hosts: memcachedservers
  connection: local
  roles:
    - aws

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

Я много видел о динамических инвентаризациях, но не мог понять, как это могло бы мне помочь. Я также просмотрел бесчисленное количество примеров доступных проектов подготовки ec2, все они неизменно либо инициализируют уже существующие экземпляры ec2, либо просто создают один экземпляр и устанавливают все на нем.


person Tom Manterfield    schedule 11.09.2014    source источник
comment
Вам может оказаться полезным модуль add_host. Вы можете создать свой экземпляр EC2, зарегистрировать его IP-адрес в переменной, добавить его в инвентарь в памяти с помощью add_host, а затем запустить задачи подготовки.   -  person Ben Whaley    schedule 13.09.2014
comment
@ Бен Уэйли. Боюсь, что эта часть у меня уже есть (она спрятана в роли aws). Моя проблема не в добавлении экземпляров к хостам, а в создании экземпляров только для соответствующих групп хостов (выбранных шаблоном --limit). Я фактически пришел к выводу, что то, что я хотел сделать, в настоящее время невозможно, и пошел другим методом. Я скоро отправлю ответ.   -  person Tom Manterfield    schedule 13.09.2014


Ответы (2)


В конце концов, я понял, что гораздо разумнее просто разделить разные части стека в отдельные playbooks с полным стеком playbook, который вызывал каждую из них.

Файл моих удаленных хостов остался в основном таким же, как указано выше. Пример одного из сценариев для определенной части стека:

---

- name: Provision ec2 apiservers
  hosts: apiservers  #important bit
  connection: local  #important bit
  vars:
    - host_group: apiservers
    - security_group: blah
  roles:
    - aws

- name: Configure {{ application_name }} apiservers
  hosts: apiservers:!127.0.0.1  #important bit
  sudo: yes
  sudo_user: root
  remote_user: ubuntu
  vars_files:
    - env_vars/common.yml
    - env_vars/remote.yml
  vars:
    - setup_git_repo: no
    - update_apt_cache: yes
  roles:
    - common
    - db
    - memcached
    - web

Это означает, что на первом этапе воспроизведения каждого уровня новый хост добавляется в группу apiservers, а на втором этапе (Configure ... apiservers) можно исключить локальный хост без получения ошибки соответствия хостов.

Плейбук по упаковке очень прост, просто:

---

- name: Deploy all the {{ application_name }} things!
  hosts: all

- include: webservers.yml
- include: apiservers.yml

Я очень новичок в анзибле, так что, пожалуйста, примите это за то, что есть, попытка какого-то парня найти что-то, что работает. Могут быть варианты получше, и это может повсеместно нарушать лучшие практики.

person Tom Manterfield    schedule 19.12.2014

ec2_module поддерживает свойство «excount», а не только свойство «count».

Он создаст (или завершит!) Экземпляры, соответствующие указанным тегам ("instance_tags")

person bdargan    schedule 13.03.2015