2016-05-02 8 views
0

мне удалось создать экземпляр EC2 на лету с помощью анзибль -Использование ec2.py для динамического инвентаризации

задачи:

- name: Launch Instance 
    ec2: 
    group_id: "{{ item.group_id }}" 
    count: 1 
    instance_type: 't2.micro' 
    image: '{{ item.image }}' 
    wait: true 
    region: 'us-east-1' 
    aws_access_key: '' 
    aws_secret_key: '' 
    key_name: "{{ pem }}" 
    instance_profile: "{{ profile }}" 
    register: ec2 
    with_items: ec2_instances 

И когда я бегу ec2.py --list я могу см. ответ json. Как использовать это в любой загружаемой книжке. Я хочу добавить эти динамически создавать хосты в файл, как я могу это сделать?

ответ

0

Вы можете пометить свой экземпляр (ы), а затем вызвать свой экземпляр с помощью тега, используя ansible.

Сначала создайте директорию filter_plugins, где ваш сборник пьес существуют, а затем скопировать этот код в файл с именем get_ec2_info.py:

from jinja2.utils import soft_unicode 

''' 
USAGE: 
- debug: 
    msg: "{{ ec2.results | get_ec2_info('id') }}" 
Some useful ec2 keys: 
id 
dns_name 
public_ip 
private_ip 
''' 

class FilterModule(object): 
    def filters(self): 
     return { 
      'get_ec2_info': get_ec2_info, 
     } 

def get_ec2_info(list, ec2_key): 
    ec2_info = [] 
    for item in list: 
     for ec2 in item['instances']: 
      ec2_info.append(ec2[ec2_key]) 
    return ec2_info 

здесь является модифицированный код вашего примера:

- name: Launch Instance 
    ec2: 
    group_id: "{{ item.group_id }}" 
    count: 1 
    instance_type: 't2.micro' 
    image: '{{ item.image }}' 
    wait: true 
    region: 'us-east-1' 
    aws_access_key: '' 
    aws_secret_key: '' 
    key_name: "{{ pem }}" 
    instance_profile: "{{ profile }}" 
    instance_tags: 
     Name: "myserver" 
     Environment: "staging" 
     Server_Role: "webserver" 
    register: ec2 
    with_items: ec2_instances 

- name: Create SSH Group to login dynamically to EC2 Instance(s) 
    add_host: 
    hostname: "{{ item }}" 
    groupname: webserver 
    with_items: "{{ ec2.results | get_ec2_info('public_ip') }}" 

- name: Add the newly created EC2 instance(s) to the local host group (located at ./inventory/hosts) 
    lineinfile: 
    dest: "./inventory/hosts" 
    regexp: "{{ item }}" 
    insertafter: "[webserver]" 
    line: "{{ item }}" 
    with_items: "{{ ec2.results | get_ec2_info('public_ip') }}" 

- name: Wait for SSH to come up on EC2 Instance(s) 
    wait_for: 
    host: "{{ item }}" 
    port: 22 
    state: started 
    with_items: "{{ ec2.results | get_ec2_info('public_ip') }}" 

Set ec2.py в качестве переменных среды в системе (или вы можете вызвать инвентарь по параметру -i):

export ANSIBLE_HOSTS=/your-inventory-path/ec2.py 
export EC2_INI_PATH=/your-inventory-path/ec2.ini 

После этого настроить ваш SSH ключ:

cp /tmp/mykey.pem ~/.ssh/ 
chmod 600 ~/.ssh/mykey.pem 
ssh-agent bash 
ssh-add ~/.ssh/mykey.pem 

Теперь вы также можете использовать тег для вызова экземпляра (я предположу, что вы используете экземпляр Ubuntu, пожалуйста, изменить пользователь, соответственно):

ansible -m ping tag_Name_myserver -u ubuntu 

или

ansible -m ping tag_Environment_staging -u ubuntu 

или

ansible -m ping tag_Server_Role_webserver -u ubuntu 

ИЛИ вы можете использовать это в вашем PlayBook, как это:

- hosts: tag_Name_myserver 
    become: yes 
    remote_user: ubuntu 
    roles: 
    - your-role-here 

Надеется, что это поможет. Для получения полной справки, пожалуйста, проверьте эти места:

+0

Я получаю следующее сообщение об ошибке на Забегая – Merv

+0

ЗАДАЧИ [Добавить вновь созданный экземпляр EC2 (ы) для локального хоста group (находится в ./inventory/hosts)] *** [ПРЕДУПРЕЖДЕНИЕ О ДЕПРЕКАЦИИ]: пропуская задачу из-за неопределенной ошибки, в будущем это будет фатальной ошибкой: «dict object» не имеет атрибутов «экземпляры». Эта функция будет удалена в будущем выпуске. Предупреждения об устаревании можно отключить, установив параметр deprecation_warnings = False в ansible.cfg. – Merv

+0

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

Смежные вопросы