Ansible:VPC重定义:TypeError:字符串索引必须是整数,而不是str

Ansible:VPC重定义:TypeError:字符串索引必须是整数,而不是str,ansible,ansible-playbook,vpc,Ansible,Ansible Playbook,Vpc,我需要帮助使其工作,以便将nat实例id添加为路由表内专用子网的gw 这是我的vpc剧本: /任务/vpc.yml ===== 这是我的vars/vpc.yml文件: --- ec2_inst_id: i-abc1432c # Variables for VPC vpc_name: tendo vpc_region: ap-southeast-2 vpc_cidr_block: 172.25.0.0/16 public_cidr: 172.25.10.0/24 public_az: "{{ vp

我需要帮助使其工作,以便将nat实例id添加为路由表内专用子网的gw

这是我的vpc剧本:

/任务/vpc.yml ===== 这是我的vars/vpc.yml文件:

---
ec2_inst_id: i-abc1432c
# Variables for VPC
vpc_name: tendo
vpc_region: ap-southeast-2
vpc_cidr_block: 172.25.0.0/16
public_cidr: 172.25.10.0/24
public_az: "{{ vpc_region}}b"
private_cidr: 172.25.20.0/24
private_az: "{{ vpc_region }}a"
nat_private_ip: 172.25.10.10

# Please don't change the variables below, until you know what you are doing
#
# Subnets Defination for VPC
vpc_subnets:
  - cidr: "{{ public_cidr }}" # Public Subnet
    az: "{{ public_az }}"
    resource_tags: { "Name":"{{ vpc_name }}_public_subnet" }
  - cidr: "{{ private_cidr }}" # Private Subnet
    az: "{{ private_az }}"
    resource_tags: { "Name":"{{ vpc_name }}_private_subnet" }

## Routing Table for Public Subnet
public_subnet_rt:
  - subnets:
      - "{{ public_cidr }}"
    routes:
      - dest: 0.0.0.0/0
        gw: igw
当我运行上面的剧本时,效果很好:

ansible-playbook -i 'localhost,' --connection=local site.yml -vvvv       

PLAY [all] ********************************************************************

TASK: [VPC | Creating an AWS VPC inside mentioned Region] *********************
<127.0.0.1> region=ap-southeast-2 cidr_block=172.25.0.0/16 state=present
<127.0.0.1>
<127.0.0.1>
<127.0.0.1> u'LANG=C LC_CTYPE=C /usr/bin/python /Users/arbab/.ansible/tmp/ansible-tmp-1427103212.79-152394513704427/ec2_vpc; rm -rf /Users/arbab/.ansible/tmp/ansible-tmp-1427103212.79-152394513704427/ >/dev/null 2>&1']
changed: [localhost -> 127.0.0.1] => {"changed": true, "subnets": [{"az": "ap-southeast-2b", "cidr": "172.25.10.0/24", "id": "subnet-70845e15", "resource_tags": {"Name": "tendo_public_subnet"}}, {"az": "ap-southeast-2a", "cidr": "172.25.20.0/24", "id": "subnet-8d1fdffa", "resource_tags": {"Name": "tendo_private_subnet"}}], "vpc": {"cidr_block": "172.25.0.0/16", "dhcp_options_id": "dopt-261e0244", "id": "vpc-9cea26f9", "region": "ap-southeast-2", "state": "available"}, "vpc_id": "vpc-9cea26f9"}
以下是nat_routes.json.j2的内容:

- subnets:
     - {{ public_cidr }}
  routes:
     - dest: 0.0.0.0/0
       gw: "igw"
- subnets:
     - {{ private_cidr }}
  routes:
     - dest: 0.0.0.0/0
       gw: {{ ec2_inst_id }}
我在创建NAT实例后运行上述playbook时出错:

TASK: [redefine vpc] **********************************************************
<127.0.0.1> region=ap-southeast-2 cidr_block=172.25.0.0/16 state=present route_tables=- subnets:
- 172.25.10.0/24
routes:
- dest: 0.0.0.0/0
gw: igw
- subnets:
- 172.25.20.0/24
routes:
- dest: 0.0.0.0/0
gw: i-abc1432c

    failed: [localhost -> 127.0.0.1] => {"failed": true, "parsed": false}
    Traceback (most recent call last):
      File "/Users/arbab/.ansible/tmp/ansible-tmp-1427101746.8-192243069214182/ec2_vpc", line 2413, in <module>
        main()
      File "/Users/arbab/.ansible/tmp/ansible-tmp-1427101746.8-192243069214182/ec2_vpc", line 618, in main
        (vpc_dict, new_vpc_id, subnets_changed, changed) = create_vpc(module, vpc_conn)
      File "/Users/arbab/.ansible/tmp/ansible-tmp-1427101746.8-192243069214182/ec2_vpc", line 425, in create_vpc
        for route in rt['routes']:
    TypeError: string indices must be integers, not str
TASK:[重新定义专有网络]**********************************************************
区域=ap-东南-2 cidr_块=172.25.0.0/16状态=当前路由_表=-子网:
- 172.25.10.0/24
路线:
-目标:0.0.0.0/0
gw:igw
-子网:
- 172.25.20.0/24
路线:
-目标:0.0.0.0/0
gw:i-abc1432c
失败:[localhost->127.0.0.1]=>{“失败”:true,“已解析”:false}
回溯(最近一次呼叫最后一次):
文件“/Users/arbab/.ansible/tmp/ansible-tmp-1427101746.8-192243069214182/ec2_vpc”,第2413行,在
main()
文件“/Users/arbab/.ansible/tmp/ansible-tmp-1427101746.8-192243069214182/ec2_vpc”,第618行,主文件
(专有网络目录、新专有网络id、子网更改、更改)=创建专有网络(模块、专有网络连接)
文件“/Users/arbab/.ansible/tmp/ansible-tmp-1427101746.8-192243069214182/ec2_-vpc”,第425行,在create_-vpc中
对于rt['routes']中的路由:
TypeError:字符串索引必须是整数,而不是str
你能指出我犯错误的地方吗


谢谢

也许
私有子网:{{lookup(“template”,“./templates/nat_routes.json.j2”)}
读取nat_routes.json.j2的内容,并将其作为字符串分配给私有子网。不是你所期望的一个YAML目录

您需要的是:

nat_routes.json.yml的内容:

private_subnet_rt:
  - subnets:
       - "{{ public_cidr }}"
    routes:
       - dest: 0.0.0.0/0
         gw: "igw"
  - subnets:
       - "{{ private_cidr }}"
    routes:
       - dest: 0.0.0.0/0
         gw: "{{ ec2_inst_id }}"
然后使用
include\u vars
,而不是
set\u fact:
,将该变量放入您的剧本中

- include_vars: nat_routes.json.yml
- name: redefine vpc
  local_action:
     module: ec2_vpc
     region: "{{ vpc_region }}"
     state: present
     cidr_block: "{{ vpc_cidr_block }}"
     resource_tags: { "Name":"{{ vpc_name }}_vpc" }
     subnets: "{{ vpc_subnets }}"
     internet_gateway: yes
     route_tables: "{{ private_subnet_rt }}"
您还可以将
nat\u routes.json.yml
放在子文件夹
group\u vars
host\u vars
roles//vars
下。请参阅,在这种情况下,您不必执行
include_vars
,ansible将根据您操作的主机/组/角色隐式地为您执行此操作


HTH

您是否已经尝试在
nat_routes.json.j2
中用
gw:igw
替换
gw:igw?我不认为这会有什么不同,但以防万一,这是ansible的愚蠢怪癖之一。。另外,作为一种实践,我总是引用
“{{vars}}”
,即使ansible说可以不引用。因此,我将
gw:{ec2_inst_id}}
更改为
gw:{{ec2_inst_id}}
或多或少遇到了相同的问题。。。但没有解决办法。我和op有一个类似的问题,这就解决了。include_vars是一种方法,而且变量需要放在jinja2变量括号中…问题是我事先不知道“{ec2_inst_id}”的值,它给了我一个错误,因为我首先创建vpc,然后创建公共和私有子网,之后,在公共子网内启动nat实例并获取其id,然后再次使用其id将vpc重新定义为专用子网主机的网关。希望你明白我的意思。Thanks@TendoLinux你试过了吗?它应该解决这个问题。看见
private_subnet_rt:
  - subnets:
       - "{{ public_cidr }}"
    routes:
       - dest: 0.0.0.0/0
         gw: "igw"
  - subnets:
       - "{{ private_cidr }}"
    routes:
       - dest: 0.0.0.0/0
         gw: "{{ ec2_inst_id }}"
- include_vars: nat_routes.json.yml
- name: redefine vpc
  local_action:
     module: ec2_vpc
     region: "{{ vpc_region }}"
     state: present
     cidr_block: "{{ vpc_cidr_block }}"
     resource_tags: { "Name":"{{ vpc_name }}_vpc" }
     subnets: "{{ vpc_subnets }}"
     internet_gateway: yes
     route_tables: "{{ private_subnet_rt }}"