Я использую Packer with Ansible для создания изображения AWS EC2 (AMI). Ansible используется для установки Java 8, установки базы данных (Cassandra), установки Ansible и загрузки Ansible playbook (я знаю, что я должен подталкивать книгу к git и тянуть ее, но я буду делать это, когда это работает). Я устанавливаю Ansible и загружаю книгу, потому что мне нужно изменить некоторые свойства Cassandra, когда экземпляр запускается из AMI (добавьте текущий экземпляр IP в опции Cassandra, например). Для этого я написал простой сценарий bash, который добавлен как свойство user-data-file
. Это сценарий:Запуск загрузочной книги с скриптом пользовательских данных в экземпляре EC2
#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
Как вы можете видеть, я выполнение анзибля-пьесы в режиме LOCALHOST.
Проблема в том, что при запуске экземпляра я обнаружил ошибку в файле /var/log/cloud-init.log
. Ошибка указывает, что ansible-playbook
не найден. Поэтому я добавил строку ls
внутри скрипта пользовательских данных, чтобы проверить содержимое папки /usr/bin/
(папка, в которой установлен Ansible), и в ней не было Ansible, но когда я обращаюсь к экземпляру с помощью ssh, я вижу, что Ansible присутствуют в папке /usr/bin/
, и нет проблем с выполнением загружаемой книги.
Кто-нибудь сталкивался с подобной проблемой? Я думаю, что это должен быть довольно популярный прецедент для Ansible с EC2.
EDIT
После некоторого протоколирования я узнал, что не только нет анзибля, во время выполнения пользовательских данных, но база данных отсутствуют, а также.
Возможно ли, что часть кода (или всего этого) в прокси-сервере Ansible в Packer выполняется при запуске экземпляра?
EDIT2
Я узнал, что здесь происходит. Когда я добавляю данные пользователя через упаковщик через свойство user_data_file
, пользовательские данные выполняются, когда упаковщик обедает экземпляр для создания AMI. Сценарий запускается до того, как выполняется Ansible Proviler, и поэтому Ansible отсутствует.
Что я хочу сделать, так это автоматически добавлять пользовательские данные в AMI, так что, когда экземпляр запускается из AMI, пользовательские данные будут выполняться тогда, а не тогда, когда пакер строит указанный AMI.
Любые идеи о том, как это сделать?
Ваш # облако-конфигурационный формат кажется неправильным. Попробуйте ввести команду ansible-playbook в 'bootcmd:' подобно этому [doc] (http://cloudinit.readthedocs.io/en/latest/topics/examples.html#run-commands-on-first-boot) –
I не думайте, что это проблема. Как я уже сказал в моем вопросе, в папке '/ usr/bin' нет' ansible-playbook', и именно по этой причине код не работает. –
Аналогичный вопрос здесь, только без пакера: pip install ansible; ansible-playbook ... Неудача с командой не для громкоговорителя для прослушивания книги –