Ansible Dynamic Inventory 获取最新ec2信息失败

Ansible Dynamic Inventory fails to get the latest ec2 information

我正在使用 ec2.py 动态清单来配置 ansible。 我已将 ec2.py 放入 /etc/ansible/hosts 文件并将其标记为可执行文件。 我在 /etc/ansible/hosts 中也有 ec2.ini 文件。

[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 之前处于 运行 状态。

如果有人能指出我的错误,我将不胜感激。谢谢

Configure EC2 server play 无法从 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 

经过研究,我了解到动态清单不会在 playbook 调用之间刷新,它只会在您单独执行 playbook 时刷新。 但是我能够通过使用 add_host 命令解决问题。

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

您还可以刷新缓存:

ec2.py --refresh-cache

或者如果您将其用作 Ansible 主机文件:

/etc/ansible/hosts --refresh-cache

使用 ansible 2.0+,你可以像这样在 playbook 中间刷新动态库存作为任务:

- 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 是您动态库存的路径,请相应地进行调整。

希望对您有所帮助。