Запустите ansible-playbook со сценарием пользовательских данных на экземпляре EC2

Я использую Packer с Ansible для создания образа AWS EC2 (AMI). Ansible используется для установки Java 8, установки базы данных (Cassandra), установки Ansible и загрузки Ansible playbook (я знаю, что мне нужно нажать playbook на git и вытащить его, но я сделаю это, когда это сработает). Я устанавливаю Ansible и загружаю playbook, потому что мне нужно изменить некоторые свойства Cassandra при запуске экземпляра из AMI (например, добавить текущий IP-адрес экземпляра в параметры Cassandra). Для этого я написал простой сценарий bash, который добавлен как свойство user-data-file. Это сценарий:

#cloud-boothook
#!/bin/bash 

#cloud-config
output: {all: '| tee -a /var/log/cloud-init-output.log'}


ansible-playbook -i "localhost," -c local /usr/local/etc/replace_cassandra.yaml

Как видите, я выполняю ansible-playbook в режиме localhost.

Проблема в том, что при запуске экземпляра я обнаруживаю ошибку в файле /var/log/cloud-init.log. В сообщении об ошибке указано, что ansible-playbook не может быть найден. Поэтому я добавил строку ls в сценарий пользовательских данных, чтобы проверить содержимое папки /usr/bin/ (папка, в которой установлен Ansible), и в ней не было Ansible, но когда я обращаюсь к экземпляру с помощью ssh, я вижу, что Ansible - это присутствует внутри папки /usr/bin/, и нет проблем с запуском ansible-playbook.

Кто-нибудь сталкивался с подобной проблемой? Я думаю, что это должно быть довольно популярным вариантом использования Ansible с EC2.


ИЗМЕНИТЬ

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

Возможно ли, что часть кода (или весь его) в инициаторе Ansible в Packer выполняется при запуске экземпляра?


РЕДАКТИРОВАТЬ2

Я узнал, что здесь происходит. Когда я добавляю пользовательские данные через упаковщик через свойство user_data_file, пользовательские данные выполняются, когда упаковщик запускает экземпляр для создания AMI. Скрипт запускается до того, как будет запущен провайдер Ansible, поэтому Ansible отсутствует.

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

Есть идеи, как это сделать?


person Ivan Stoyanov    schedule 13.06.2016    source источник
comment
Ваш формат # cloud-config кажется неправильным. Попробуйте поместить команду ansible-playbook в bootcmd: следующим образом: doc   -  person David Lee    schedule 13.06.2016
comment
Не думаю, что в этом проблема. Как я сказал в своем вопросе, в папке /usr/bin нет ansible-playbook, и это причина, по которой код не работает.   -  person Ivan Stoyanov    schedule 14.06.2016
comment
Аналогичная проблема здесь, только без упаковщика: pip install ansible; ansible-playbook ... Сбой с командой not foud для ansible-playbook   -  person Jukka Dahlbom    schedule 15.06.2016
comment
Приятно знать, что я не единственный, у кого такая проблема.   -  person Ivan Stoyanov    schedule 15.06.2016
comment
@JukkaDahlbom, вы можете проверить, действительно ли pip install ansible устанавливает ansible. Я использую apt, и это необходимо для добавления доступного репо, прежде чем его можно будет установить.   -  person Ivan Stoyanov    schedule 15.06.2016
comment
@IvanStoyanov Анзибл действительно устанавливается - ссылка на полный путь к доступному двоичному файлу у меня работает, но, вероятно, хрупка в разных системах. Похоже, что доступный двоичный файл по какой-то причине не найден в пути на время действия пользовательских данных.   -  person Jukka Dahlbom    schedule 17.06.2016


Ответы (2)


Просто запустите несколько инициаторов и не пытайтесь запускать ansible через cloud-init.

Я делаю здесь предположение, что ваша playbook и роли хранятся локально там, где вы запускаете упаковщик. Вместо того, чтобы вставлять доступный материал в пользовательские данные, запустите средство обеспечения оболочки для установки ansbile, запустите средство обеспечения доступа ansible-local для запуска нужной вам пьесы / роли.

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

В примере json install-prereqs.sh просто добавляет репозиторий ansible ppa apt и запускает apt-get update -y, а затем устанавливает ansible.

#!/bin/bash

sudo apt-get install software-properties-common
sudo apt-add-repository -y ppa:ansible/ansible
sudo apt-get update
sudo apt-get install -y ansible

Затем второй провайдер скопирует книгу и роли, которые вы указали, на целевой хост и запустит их.

{
"builders": [
  {
    "type": "amazon-ebs",
    "ssh_username": "ubuntu",
    "image_name": "some-name",
    "source_image": "some-ami-id",
    "ssh_pty": true
  }
],
"provisioners": [
  {
    "type": "shell",
    "script": "scripts/install-prereqs.sh"
  },
  {
    "type": "ansible-local",
    "playbook_file": "path/to/playbook.yml",
    "role_paths": ["path/to/roles"]
  },
 ]
}
person jreslock    schedule 17.06.2016

Это возможно! Пожалуйста, убедитесь в следующем.

  • Сервер Ansible (установите ansible через пользовательские данные для формирования облака, если он не встроен в AMI) и ваша цель имеют доступ по SSH в группах безопасности, которые вы создаете в облачной информации.
  • После установки ansible на сервере ansible ваш файл ansible.cfg указывает на закрытый ключ на сервере ansible.
  • Соответствующий открытый ключ для доступного закрытого ключа копируется в файл authorized_keys на серверах в каталоге корневого пользователя .ssh, в котором вы хотите запускать playbooks - вы включили root ssh-доступ между ansible-сервером и целевым сервером (-ами), это можно сделать, отредактировав файл / etc / ssh / sshd_config и убедившись, что ничто не препятствует доступу по SSH от пользователя root в корневом файле authorized_keys на целевом сервере (ах)
person Adam k    schedule 10.01.2018