首页 文章

Ansible Dynamic Inventory无法获取最新的ec2信息

提问于
浏览
2

我正在使用 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

但是,在调用configure脚本时,第二个脚本会导致找不到主机 . 如果我单独执行 ec2-configure.yml 并且如果EC2服务器启动并运行,则它能够找到并配置它 .

我添加了 wait_for 以确保在调用 ec2-configure.yml 之前实例处于运行状态 .

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

4 回答

  • 6

    经过研究,我发现动态库存不会在剧本调用之间刷新,只有在您分别执行剧本时才会刷新 . 但是,我能够使用 add_host 命令解决该问题 .

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

    使用ansible 2.0,您可以刷新playbook中间的动态库存,如下所示:

    - meta: refresh_inventory
    

    为了扩展这一点,如果您在剧本中遇到缓存问题,那么您可以像这样使用它:

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

    其中 ./inventory 是动态广告资源的路径,请相应调整 .

    希望这会帮助你 .

  • 2

    Configure EC2 server play无法从EC2动态库存中找到任何主机,因为新实例是在剧本的第一次播放中添加的 - 在同一次执行期间 . 小组 tag_Name_EC2 没有找到't exist in the inventory when the inventory was read and thus can' .

    当你再次运行相同的剧本 Configure EC2 server 应该找到该组 .

    我们使用以下解决方法来指导用户处于这种情况 .

    首先,提供实例:

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

    然后在 ec2-configure.yml 之前添加一个新剧本 . 该剧使用在 Provisioning EC2 instance 中注册的 ec2 变量,如果启动任何实例,将失败并退出该剧本:

    - 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

    或者,如果您使用Ansible主机文件:

    /etc/ansible/hosts --refresh-cache

相关问题