Ansible在动态库存中返回错误的主机(私有IP冲突?)

时间:2017-08-25 08:00:59

标签: amazon-web-services amazon-ec2 ansible ansible-2.x

我在不同的 VPC上有两个具有相同私有地址的实例。

CI-VPC:

172.18.50.180:
    tags:
        Environment: ci
        Role: aRole

测试VPC:

172.18.50.180:
    tags:
        Environment: test
        Role: web

我正在运行以下剧本:

- name: "print account specific variables"
  hosts: "tag_Environment_ci:&tag_Role_web"
  tasks:
    - name: "print account specific variables for account {{ account }}"
      debug:
        msg:
          - 'ec2_tag_Name': "{{ ec2_tag_Name }}"
            'ec2_tag_Role': "{{ ec2_tag_Role }}"
            'ec2_private_ip_address': "{{ ec2_private_ip_address }}"
            'ec2_tag_Environment': "{{ ec2_tag_Environment }}"

由于我要求 两个 角色网络和环境ci,所以不应该选择这些实例,但是我得到的结果是:

ok: [172.18.50.180] => {
  "changed": false,
  "msg": [
      {
          "ec2_private_ip_address": "172.18.50.180",
          "ec2_tag_Environment": "test",
          "ec2_tag_Name": "test-web-1",
          "ec2_tag_Role": "web"
      }
  ]
}

显然,此实例不符合hosts ...

下的要求

似乎ec2.py搜索了Environment标记,找到了172.18.50.180的ci,然后单独搜索了角色标记,在172.18.50.180下找到了另一个,并且只是将该实例标记为好的,即使这些在不同的vpcs上有两个不同的实例

我已尝试将vpc_destination_variable中的ec2.ini更改为id,但当Ansible尝试连接到这些实例时,我收到错误,因为它无法连接到ID。

fatal: [i-XXX]: UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname i-XXX: Name or service not known\r\n", "unreachable": true
}

还有其他选项可以在vpc_destination_variable下使用吗?这种碰撞的任何已知解决方案?

1 个答案:

答案 0 :(得分:0)

tl; dr :这正是hostname_variableec2.ini的用途,正如记录所示:

# This allows you to override the inventory_name with an ec2 variable, instead
# of using the destination_variable above. Addressing (aka ansible_ssh_host)
# will still use destination_variable. Tags should be written as 'tag_TAGNAME'.

不幸的是,我在ec2.py

中环顾四周后错过了它并找到了它

使用其他主机名选项更长时间的回答

在找到hostname_variable之后,我遇到了另一个问题,即它只能接收一个变量。在我的情况下,我有一些实例具有相同的私有IP,另一方面具有相同的标签(AWS自动缩放组,所有主机上的相同标签),所以我需要一种方法来区分它们。

我已使用此选项创建了gist。我的更改在第848行。这允许您在hostname_variable中使用多个逗号分隔的变量,例如:

hostname_variable = tag_Name,private_ip_address