I have a playbook that creates a VPC with multiple subnets which works fine. I then have a playbook that tries to create an ELB and I need to set the subnets to 2 of the subnets returned from the vpc creation. There are 6 total subnets within the VPC, but two of them have resource_tags set to tier:elb. I only want the 2 subnets with those tags.
I saw a post that said the following would work, but I get an invalid subnet ID error. (look for the comments from @coop)
My playbook is almost exactly the same as @coop in the post above, but I have 6 subnets instead of 1. I feel like I should be able to use something like the above with a when clause to only get subnets tagged as elb. Any help is appreciated.
Hi. From the look of the above, you’re using the “complex args” structure to pass the params to the module. In this case, the list should not be a comma-separated list but should instead just be the array of IDs. For example:
That worked perfectly to get the list of subnets. Thank you!
The only issue I have now is limiting the returned values. The syntax below is returning all 6 subnets in my vpc, but I only want the 2 subnets that I gave a resource tag of tier=elb. I’m trying to use the when clause with the ec2_elb_lb module, but I can’t get the syntax right there. I tried:
when: {{ vpc.subnets | map(attribute=‘tier’) | list }} == ‘elb’
This generates a syntax error each time. What should the format be in a when clause and/or is this the right way to approach limiting the results, or should I be using with_items or with_dict? Thanks for the help!
I’m not sure if this is the right way to go about getting this information, so please let me know if there is a better way.
Unfortunately, I’m still having difficulty having the task only pull the subnet id for the subnets tagged as tier=elb. Can I use something after the pipe instead of list to limit the results, or do I need to use with_items, with_dict? Thanks.
You could use the selectattr() filter, however it looks like the ‘equalto’ test is new (it doesn’t work in my version of jinja2, which is 2.7.x). But it would looks something like this:
OK…getting closer. I had to upgrade Jinja2 to version 2.8-dev in order to get the equalto test. Now the debug statement executes without error; however, this doesn’t return the information I need. The statement below gives me all resource_tags if the tier key equals “elb”. What I really need is the subnet id value if the resource_tag has the tier key equal to “elb”. I feel like another level of nesting is required. Any ideas on how to get the subnet id? Thank you James for all your help so far!
“vpc”: {
“changed”: false,
“invocation”: {
“module_args”: “”,
“module_name”: “ec2_vpc”
},
“subnets”: [
{
“az”: “us-east-1c”,
“cidr”: “10.0.0.x/26”,
“id”: “subnet-123456789”, -----> I need this value
“resource_tags”: {
“Name”: “elb1”,
“tier”: “elb”
}
},
{
“az”: “us-east-1a”,
“cidr”: “10.0.0.x/26”,
“id”: “subnet-abcdefgh”, ----> and this
“resource_tags”: {
“Name”: “elb2”,
“tier”: “elb”
}
}