1

Я использую ec2.py динамический инвентарь для обеспечения с возможностью доступа. Я разместил ec2.py в файле /etc/ansible/hosts и пометьте его исполнимым. У меня также есть файл ec2.ini в /etc/ansible/hosts.Ansible Dynamic Inventory не может получить самую последнюю информацию об ec2

[ec2] 

regions = us-west-2 
regions_exclude = us-gov-west-1,cn-north-1 


destination_variable = public_dns_name 

vpc_destination_variable = ip_address 
route53 = False 

all_instances = True 
all_rds_instances = False 


cache_path = ~/.ansible/tmp 

cache_max_age = 0 

nested_groups = False 
group_by_instance_id = True 
group_by_region = True 
group_by_availability_zone = True 
group_by_ami_id = True 
group_by_instance_type = True 
group_by_key_pair = True 
group_by_vpc_id = True 
group_by_security_group = True 
group_by_tag_keys = True 
group_by_tag_none = True 
group_by_route53_names = True 
group_by_rds_engine = True 
group_by_rds_parameter_group = True 

Выше мой ec2.ini файл

--- 
- hosts: localhost 
    connection: local 
    gather_facts: yes 
    vars_files: 
    - ../group_vars/dev_vpc 
    - ../group_vars/dev_sg 
    - ../hosts_vars/ec2_info 
    vars: 
    instance_type: t2.micro 
    tasks: 
    - name: Provisioning EC2 instance 
    local_action: 
    module: ec2 
    region: "{{ region }}" 
    key_name: "{{ key }}" 
    instance_type: "{{ instance_type }}" 
    image: "{{ ami_id }}" 
    wait: yes 
    group_id: ["{{ sg_npm }}", "{{sg_ssh}}"] 
    vpc_subnet_id: "{{ PublicSubnet }}" 
    source_dest_check: false 
    instance_tags: '{"Name": "EC2", "Environment": "Development"}' 
register: ec2 
    - name: associate new EIP for the instance 
    local_action: 
     module: ec2_eip 
     region: "{{ region }}" 
     instance_id: "{{ item.id }}" 
     with_items: ec2.instances 
    - name: Waiting for NPM Server to come-up 
    local_action: 
     module: wait_for 
     host: "{{ ec2 }}" 
     state: started 
     delay: 5 
     timeout: 200 
- include: ec2-configure.yml 

Теперь скрипт конфигурирования выглядит следующим образом

- name: Configure EC2 server 
    hosts: tag_Name_EC2 
    user: ec2-user 
    sudo: True 
    gather_facts: True 
    tasks: 
    - name: Install nodejs related packages 
    yum: name={{ item }} enablerepo=epel state=present 
    with_items: 
     - nodejs 
     - npm 

Однако когда конфигурационный скрипт называется, второй сценарий приводит к не хостов, найденных. Если я выполняю ec2-configure.yml только один, и если сервер EC2 поднялся до &, он сможет его найти и настроить.

Я добавил wait_for, чтобы убедиться, что экземпляр находится в рабочем состоянии до вызова ec2-configure.yml.

Был бы признателен, если бы кто-нибудь мог указать мою ошибку. Спасибо

ответ

6

После исследования я узнал, что динамические инвентаризации оленьей кожи обновление между PlayBook вызовами, он будет обновляться только если вы выполняете игру в отдельности. Однако я смог решить проблему с помощью команды add_host.

- name: Add Server to inventory 
    local_action: add_host hostname={{ item.public_ip }} groupname=webserver 
    with_items: webserver.instances 
0

Configure EC2 server Игра не может найти хостов из динамического инвентаря EC2, потому что новый экземпляр был добавлен в первую игру в playbook - во время того же выполнения. Группа tag_Name_EC2 не была в инвентаре, когда инвентарь был прочитан и, следовательно, не найден.

Когда вы снова запустите тот же плей-лист Configure EC2 server, вы должны найти группу.

Мы использовали следующее обходное решение для руководства пользователями в таких ситуациях.

Во-первых, предоставление экземпляра:

tasks: 
    - name: Provisioning EC2 instance 
    local_action: 
    module: ec2 
    ... 
    register: ec2 

Затем добавить новую игру до ec2-configure.yml. Игра использует ec2 переменные, которая была зарегистрирована в Provisioning EC2 instance и потерпит неудачу и выйти из пьес, если были запущены какие-либо случаи:

- name: Stop and request a re-run if any instances were launched 
    hosts: localhost 
    gather_facts: no 
    tasks: 
    - name: Stop if instances were launched 
     fail: msg="Re-run the playbook to load group variables from EC2 dynamic inventory for the just launched instances!" 
     when: ec2.changed 

- include: ec2-configure.yml 
0

Вы также можете обновить кэш:

ec2.py --refresh-cache

Или, если вы используете в качестве хост-файла анзибль:

/etc/ansible/hosts --refresh-cache

2

С анзибль 2.0+, вы обновите динамический инвентарь в середине сборника пьес, как задание, как это:

- meta: refresh_inventory 

Чтобы продлить это немного, если вы получаете проблемы с кэшем в вашем PlayBook, то вы можете использовать его как это:

- name: Refresh the ec2.py cache 
    shell: "./inventory/ec2.py --refresh-cache" 
    changed_when: no 

    - name: Refresh inventory 
    meta: refresh_inventory 

где ./inventory это путь к динамической инвентаризации, пожалуйста, настроить его соответствующим образом.

Надеюсь, это вам поможет.

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