Amazon-Ec2

如何從 AWS 上的 ansible 動態清單返回私有 IP?

  • July 19, 2018

無論我嘗試什麼,出於某種原因,當我使用 ansible 動態清單腳本 (ec2.py+ec2.ini) 執行 ansible ad-hoc 模組時,只會返回用於標籤查詢的公共IP,並嘗試通過 SSH 連接到目標的公共IP。例如,如果我執行:

ansible -m ping tag_env_dev

然後,它嘗試通過公共 IP 進行連接,儘管私有 IP 更可取(出於安全性、複雜性和成本原因)。我嘗試在我的 ec2.ini 文件中調整以下選項:

regions = us-east-1 # to restrict to us-east-1 region
destination_variable = public_dns_name # I've also tried private_dns_name and private_ip_address, all of which still attempt to connect to the public IP of the destination instance(s)
vpc_destination_variable = ip_address # also tried private_ip_address 

如果我執行./ec2.py --list --refresh-cache | grep -B 5 -A 5 "tag_env_dev",我會得到一個只返回公共 IP 的結果:

"tag_env_dev": [
 "{{public ip here}}"
], 

在每次後續嘗試之後,我都會執行./ec2.py --list --refresh-cache以清除並重新生成記憶體。然後我將重新執行ansible -m ping tag_env_dev(或類似的),我將通過 SSH 連接到實例的公共 IP 地址超時。

我已經確認我可以通過 SSH 連接到“公共主機名”(在 VPC 內解析為私有 IP)和私有 IP,但不能直接連接到公共 IP(如預期的那樣)。所以這不是關鍵的身份驗證問題。

我還有一個分配給這個伺服器的 IAM 角色,具有執行這些操作的大量權限(例如,它確實對 ec2 和 vpc 具有隻讀權限)。

附加資訊:

我正在從與測試目標相同的 VPC 中的 ec2 實例執行 ansible。並且目標上的安全組配置為允許來自其內部 CIDR 塊範圍的 SSH。ansible 主機還具有 IAM 角色,足以發現目標的私有 IP

任何幫助將不勝感激。

這是 ec2.ini 的工作範例(使用 ansible 2.1 和 2.3.1 測試)

[ec2]
regions = us-east-1,us-west-2
regions_exclude =
destination_variable = private_ip_address
hostname_variable = peerio
vpc_destination_variable = private_ip_address
route53 = False
rds = False
elasticache = False
all_instances = False
#instance_states = pending, running, shutting-down, terminated, stopping, stopped
all_rds_instances = False
all_elasticache_replication_groups = False
all_elasticache_clusters = False
all_elasticache_nodes = False
cache_path = ~/.ansible/tmp
cache_max_age = 300
nested_groups = False
replace_dash_in_groups = True
expand_csv_tags = 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
#pattern_include = staging-*
#pattern_exclude = staging-*
#instance_filters = instance-type=t1.micro,tag:env=staging
#only process items we tagged
instance_filters = tag:serviceclass=*
boto_profile = ansible

然後,應使用其私有 IP 作為標識符列出實例:

./ec2.py  --list 
{
 "_meta": {
   "hostvars": {
     "10.255.100.138": {
       "ansible_ssh_host": "10.255.100.138", 
       "ec2__in_monitoring_element": false, 
       "ec2_ami_launch_index": "0", 
...       "ec2_vpc_id": "vpc-57ed3733"
     }, 
     "10.255.100.142": {
       "ansible_ssh_host": "10.255.100.142", 
       "ec2__in_monitoring_element": false, 
...

引用自:https://serverfault.com/questions/882928