2016-06-13 4 views
1

Я использую 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.

Любые идеи о том, как это сделать?

+0

Ваш # облако-конфигурационный формат кажется неправильным. Попробуйте ввести команду ansible-playbook в 'bootcmd:' подобно этому [doc] (http://cloudinit.readthedocs.io/en/latest/topics/examples.html#run-commands-on-first-boot) –

+0

I не думайте, что это проблема. Как я уже сказал в моем вопросе, в папке '/ usr/bin' нет' ansible-playbook', и именно по этой причине код не работает. –

+0

Аналогичный вопрос здесь, только без пакера: pip install ansible; ansible-playbook ... Неудача с командой не для громкоговорителя для прослушивания книги –

ответ

1

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

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

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

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

#!/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"] 
    }, 
] 
} 
0

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

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