Я использую 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.
Есть идеи, как это сделать?
bootcmd:
следующим образом: doc - person David Lee   schedule 13.06.2016/usr/bin
нетansible-playbook
, и это причина, по которой код не работает. - person Ivan Stoyanov   schedule 14.06.2016pip install ansible
устанавливает ansible. Я использую apt, и это необходимо для добавления доступного репо, прежде чем его можно будет установить. - person Ivan Stoyanov   schedule 15.06.2016