2015-03-30 16 views
0

У меня есть загрузочная книжка Ansible для работы с экземплярами EC2. Я использую динамический инвентарь (ec2.py), чтобы получить группу экземпляров, с которыми я хочу работать (hosts: tag_Service_Foo). Когда я запускаю его, он производит выход, как:Отображение пользовательского имени для хоста

GATHERING FACTS *************************************************************** 
ok: [54.149.9.198] 
ok: [52.11.22.29] 
ok: [52.11.0.3] 

Однако, я могу принести «Name» тег для конкретного экземпляра от Amazon (я это сделать, и сохранить его в переменной для использования в паре частей учебник).

Есть ли способ заставить Ansible использовать эту строку для имени хоста при отображении прогресса? Я хотел бы увидеть что-то более описательным (так как я не имею IP-адрес в памяти):

GATHERING FACTS *************************************************************** 
ok: [main-server] 
ok: [extra-server] 
ok: [my-cool-server] 

Выход сценария по ec2.py инвентаризации выглядит следующим образом (усеченные, это очень долго).

{ 
    "_meta": { 
    "hostvars": { 
     "54.149.9.198": { 
     "ec2__in_monitoring_element": false, 
     "ec2_ami_launch_index": "0", 
     "ec2_architecture": "x86_64", 
     "ec2_client_token": "xxx", 
     "ec2_dns_name": "xxx", 
     "ec2_ebs_optimized": false, 
     "ec2_eventsSet": "", 
     "ec2_group_name": "", 
     "ec2_hypervisor": "xen", 
     "ec2_id": "i-xxx", 
     "ec2_image_id": "ami-xxx", 
     "ec2_instance_type": "xxx", 
     "ec2_ip_address": "xxx", 
     "ec2_item": "", 
     "ec2_kernel": "", 
     "ec2_key_name": "xxx", 
     "ec2_launch_time": "xxx", 
     "ec2_monitored": xxx, 
     "ec2_monitoring": "", 
     "ec2_monitoring_state": "xxx", 
     "ec2_persistent": false, 
     "ec2_placement": "xxx", 
     "ec2_platform": "", 
     "ec2_previous_state": "", 
     "ec2_previous_state_code": 0, 
     "ec2_private_dns_name": "xxx", 
     "ec2_private_ip_address": "xxx", 
     "ec2_public_dns_name": "xxx", 
     "ec2_ramdisk": "", 
     "ec2_reason": "", 
     "ec2_region": "xxx", 
     "ec2_requester_id": "", 
     "ec2_root_device_name": "/dev/xvda", 
     "ec2_root_device_type": "ebs", 
     "ec2_security_group_ids": "xxx", 
     "ec2_security_group_names": "xxx", 
     "ec2_sourceDestCheck": "true", 
     "ec2_spot_instance_request_id": "", 
     "ec2_state": "running", 
     "ec2_state_code": 16, 
     "ec2_state_reason": "", 
     "ec2_subnet_id": "subnet-xxx", 
     "ec2_tag_Name": "main-server", 
     "ec2_tag_aws_autoscaling_groupName": "xxx", 
     "ec2_virtualization_type": "hvm", 
     "ec2_vpc_id": "vpc-xxx" 
     } 
    } 
    } 
    "tag_Service_Foo": [ 
    "54.149.9.198", 
    "52.11.22.29", 
    "52.11.0.3" 
    ], 
} 
+0

Вы хотите сделать это (aliasing) во время выполнения или статически? Статичность может быть легко выполнена с помощью файла инвентаризации. – Kashyap

+0

Отредактировал мой вопрос. Я использую динамический инвентарь с помощью скрипта ec2.py. –

+0

Можете ли вы опубликовать вывод (часть его) 'ec2.py', когда вы запустите его в командной строке, например' python ec2.py' или './Ec2.py'? – Kashyap

ответ

2

Что вам нужно сделать, это создать свой собственный упаковщик (скажем my_ec2.py) над ec2.py что бы пост-обработки выходного сигнала. Идея заключается в использовании behavioral hostvar ansible_ssh_host. Вы можете использовать любой язык не только python. Пока он печатает действительный json на stdout, вам хорошо идти. Reference if needed.

Это будет небольшая работа. Но надеюсь, что код Судо поможет:

output_json_map = new map 
for each group in <ec2_output>: # e.g. tag_Service_Foo, I think there would be another 
           # key in the output that contains list of group names. 
    for each ip_address in group: 
    hname = ec2_output._meta.hostvars.find(ip_address).find(ec2_tag_Name) 

    # Add new host to the group member list 
    output_json_map.add(key=group, value=hname) 
    copy all vars from ec2_output._meta.hostvars.<ip_address> 
        to output_json_map._meta.hostvars.<hname> 
    # Assign the IP address of this host to the ansible_ssh_host 
    # in hostvars for this host 
    output_json_map.add(key=_meta.hostvars.<hname>.ansible_ssh_host, 
         value=ip_address) 
    output_json_map.add(key=_meta.hostvars.find(ip_address).ansible_ssh_host, 
         value=ip_address) 

print output_json_map to stdout 

Э.Г. для примера выхода my_ec2.py должен быть:

{ 
    "_meta": { 
    "hostvars": { 
     "main-server": { 
     "ansible_ssh_host": "54.149.9.198" 
     --- snip --- 
     "ec2_tag_Name": "main-server", 
     --- snip --- 
     }, 
     "extra-server": { 
     "ansible_ssh_host": "52.11.22.29" 
     --- snip --- 
     "ec2_tag_Name": "extra-server", 
     --- snip --- 
     }, 
     <other hosts from all groups> 
    } 
    } 
    "tag_Service_Foo": [ 
    "main-server", 
    "extra-server", 
    <other hosts in this group> 
    ], 
    "some other group": [ 
    <hosts in this group>, 
    ... 
    ], 
} 

и, очевидно, использовать эту my_ec2.py вместо ec2.py как файл инвентаризация. :-)

- редактировать -

1) В группах, я могу только сослаться на вещи одним именем? 2) Есть нет понятия псевдонима? 3) Мне интересно, могу ли я использовать IP-адрес в группах и просто изменить часть _meta или мне нужно сделать все это?

Да *, Нет и нет.


* Технически сначала да должно быть нет. Позволь мне объяснить.

Что мы делаем здесь можно сделать с помощью статического файла инвентаризации, как это:

Оригинал ec2.py возвращался JSon эквивалент следующего файла инвентаризации:

[tag_Service_Foo] 
54.149.9.198 ec2_tag_Name="main-server" ec2_previous_state_code="0" ... 
52.11.22.29 ec2_tag_Name="extra-server" ec2_previous_state_code="0" ... 

Наш новый my_ec2.py возвращает это:

[tag_Service_Foo] 
main-server ansible_ssh_host="54.149.9.198" ec2_tag_Name="main-server" ec2_previous_state_code="0" ... 
extra-server ansible_ssh_host="52.11.22.29" ec2_tag_Name="extra-server" ec2_previous_state_code="0" ... 

# Technically it's possible to create "an alias" for main-server like this: 
main-server-alias ansible_ssh_host="54.149.9.198" ec2_tag_Name="main-server" ec2_previous_state_code="0" ... 

Теперь вы можете запустить игру с main-server-alias в списке хостов, и возможно, выполните его на 54.149.9.198.

НО, и это большое НО, когда вы запускаете игру с «все» в качестве шаблона хоста анзибль будет выполнять задачу по main-server-alias, а также main-server. Итак, вы создали псевдоним в одном контексте и новый хост в другом. Я не тестировал это , но часть, так что вернитесь и исправьте меня, если вы узнаете иначе.

НТН

+0

В группах я могу ссылаться только на вещи по одному имени? Нет понятия псевдонима? (Мне интересно, могу ли я использовать IP-адрес в группах и просто изменить часть '_meta', или если мне нужно сделать все это.) –

+0

@NathanielWaisbrot не уверен, что если вы обновите ответ, я обновляю ответ так: См. Обновленный ответ. – Kashyap

+0

Нет, я не получаю предупреждения об изменениях в ответе. Спасибо за такой подробный ответ! Я попробую это. –

1

Если вы положили

vpc_destination_variable = Name 

в файле ec2.ini, который должен работать тоже.

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

  • Нет связанных вопросов^_^