-
-
Save SolomonHD/4f7ee46ff91e2b82142c2f00f76db7d7 to your computer and use it in GitHub Desktop.
| --- | |
| - name: Build list of instance IDs by instance name | |
| ec2_instance_facts: | |
| region: "{{ region }}" | |
| filters: | |
| "tag:NightlyBackup": "Yes" | |
| # "tag:Name": "{{ groups['backup'] }}" | |
| register: ec2_facts | |
| - debug: | |
| var: ec2_facts | |
| - name: Set fact instances | |
| set_fact: | |
| instances: "{{ ec2_facts.instances | map(attribute='instance_id') | list }}" | |
| - name: Map Name | |
| set_fact: | |
| map_name: "{{ ec2_facts.instances | map(attribute='tags.Name') | list }}" | |
| - debug: | |
| var: map_name | |
| #- name: Replace undefined | |
| # set_fact: | |
| # "{{ item[0] }}": "{{ item[1] }}" | |
| # when: item[0] == "Undefined" | |
| # with_together: | |
| # - "{{ map_name }}" | |
| # - "{{ instances }}" | |
| - debug: | |
| var: instances | |
| - meta: end_play | |
| - name: List of instance IDs to be backed up | |
| debug: | |
| msg: "{{ item }}" | |
| loop: "{{ instances }}" |
| "ec2_facts": { | |
| "changed": false, | |
| "failed": false, | |
| "instances": [ | |
| { | |
| "ami_launch_index": 0, | |
| "architecture": "x86_64", | |
| "block_device_mappings": [ | |
| { | |
| "device_name": "/dev/sda1", | |
| "ebs": { | |
| "attach_time": "2018-06-07T23:24:18+00:00", | |
| "delete_on_termination": true, | |
| "status": "attached", | |
| "volume_id": "vol-046b2e520c788971d" | |
| } | |
| } | |
| ], | |
| "client_token": "", | |
| "ebs_optimized": false, | |
| "ena_support": true, | |
| "hypervisor": "xen", | |
| "iam_instance_profile": { | |
| "arn": "arn:aws:iam::229792048549:instance-profile/ec2-s3-full-access", | |
| "id": "AIPAID3GG2QMCRY7TOW56" | |
| }, | |
| "image_id": "ami-43a15f3e", | |
| "instance_id": "i-0468fc479c884d8b7", | |
| "instance_type": "t2.medium", | |
| "key_name": "general_key", | |
| "launch_time": "2018-07-01T01:48:30+00:00", | |
| "monitoring": { | |
| "state": "disabled" | |
| }, | |
| "network_interfaces": [ | |
| { | |
| "attachment": { | |
| "attach_time": "2018-06-07T23:24:16+00:00", | |
| "attachment_id": "eni-attach-4a27dcef", | |
| "delete_on_termination": true, | |
| "device_index": 0, | |
| "status": "attached" | |
| }, | |
| "description": "Primary network interface", | |
| "groups": [ | |
| { | |
| "group_id": "sg-99882ad1", | |
| "group_name": "sshd" | |
| }, | |
| { | |
| "group_id": "sg-fc64c6b4", | |
| "group_name": "http+https" | |
| } | |
| ], | |
| "ipv6_addresses": [], | |
| "mac_address": "12:e6:a5:c2:d9:8a", | |
| "network_interface_id": "eni-117ea387", | |
| "owner_id": "229792048549", | |
| "private_dns_name": "ip-172-31-95-229.ec2.internal", | |
| "private_ip_address": "172.31.95.229", | |
| "private_ip_addresses": [ | |
| { | |
| "primary": true, | |
| "private_dns_name": "ip-172-31-95-229.ec2.internal", | |
| "private_ip_address": "172.31.95.229" | |
| } | |
| ], | |
| "source_dest_check": true, | |
| "status": "in-use", | |
| "subnet_id": "subnet-66f7984a", | |
| "vpc_id": "vpc-bc7408c5" | |
| } | |
| ], | |
| "placement": { | |
| "availability_zone": "us-east-1a", | |
| "group_name": "", | |
| "tenancy": "default" | |
| }, | |
| "private_dns_name": "ip-172-31-95-229.ec2.internal", | |
| "private_ip_address": "172.31.95.229", | |
| "product_codes": [], | |
| "public_dns_name": "", | |
| "root_device_name": "/dev/sda1", | |
| "root_device_type": "ebs", | |
| "security_groups": [ | |
| { | |
| "group_id": "sg-99882ad1", | |
| "group_name": "sshd" | |
| }, | |
| { | |
| "group_id": "sg-fc64c6b4", | |
| "group_name": "http+https" | |
| } | |
| ], | |
| "source_dest_check": true, | |
| "state": { | |
| "code": 80, | |
| "name": "stopped" | |
| }, | |
| "state_reason": { | |
| "code": "Client.UserInitiatedShutdown", | |
| "message": "Client.UserInitiatedShutdown: User initiated shutdown" | |
| }, | |
| "state_transition_reason": "User initiated (2018-07-01 01:49:14 GMT)", | |
| "subnet_id": "subnet-66f7984a", | |
| "tags": { | |
| "Name": "solomon-test-2", | |
| "NightlyBackup": "Yes" | |
| }, | |
| "virtualization_type": "hvm", | |
| "vpc_id": "vpc-bc7408c5" | |
| }, | |
| { | |
| "ami_launch_index": 0, | |
| "architecture": "x86_64", | |
| "block_device_mappings": [ | |
| { | |
| "device_name": "/dev/sda1", | |
| "ebs": { | |
| "attach_time": "2018-06-12T19:45:14+00:00", | |
| "delete_on_termination": true, | |
| "status": "attached", | |
| "volume_id": "vol-0d7fc053396341fbc" | |
| } | |
| } | |
| ], | |
| "client_token": "", | |
| "ebs_optimized": false, | |
| "ena_support": true, | |
| "hypervisor": "xen", | |
| "iam_instance_profile": { | |
| "arn": "arn:aws:iam::229792048549:instance-profile/ec2-s3-full-access", | |
| "id": "AIPAID3GG2QMCRY7TOW56" | |
| }, | |
| "image_id": "ami-43a15f3e", | |
| "instance_id": "i-04ff7bb389bdf86f0", | |
| "instance_type": "t2.xlarge", | |
| "key_name": "general_key", | |
| "launch_time": "2018-07-01T01:48:31+00:00", | |
| "monitoring": { | |
| "state": "disabled" | |
| }, | |
| "network_interfaces": [ | |
| { | |
| "attachment": { | |
| "attach_time": "2018-06-12T19:45:14+00:00", | |
| "attachment_id": "eni-attach-140c66ab", | |
| "delete_on_termination": true, | |
| "device_index": 0, | |
| "status": "attached" | |
| }, | |
| "description": "", | |
| "groups": [ | |
| { | |
| "group_id": "sg-99882ad1", | |
| "group_name": "sshd" | |
| }, | |
| { | |
| "group_id": "sg-fc64c6b4", | |
| "group_name": "http+https" | |
| } | |
| ], | |
| "ipv6_addresses": [], | |
| "mac_address": "0e:2a:97:0c:aa:9a", | |
| "network_interface_id": "eni-ce1c7154", | |
| "owner_id": "229792048549", | |
| "private_dns_name": "ip-172-31-32-142.ec2.internal", | |
| "private_ip_address": "172.31.32.142", | |
| "private_ip_addresses": [ | |
| { | |
| "primary": true, | |
| "private_dns_name": "ip-172-31-32-142.ec2.internal", | |
| "private_ip_address": "172.31.32.142" | |
| } | |
| ], | |
| "source_dest_check": true, | |
| "status": "in-use", | |
| "subnet_id": "subnet-9a2543c0", | |
| "vpc_id": "vpc-bc7408c5" | |
| } | |
| ], | |
| "placement": { | |
| "availability_zone": "us-east-1c", | |
| "group_name": "", | |
| "tenancy": "default" | |
| }, | |
| "private_dns_name": "ip-172-31-32-142.ec2.internal", | |
| "private_ip_address": "172.31.32.142", | |
| "product_codes": [], | |
| "public_dns_name": "", | |
| "root_device_name": "/dev/sda1", | |
| "root_device_type": "ebs", | |
| "security_groups": [ | |
| { | |
| "group_id": "sg-99882ad1", | |
| "group_name": "sshd" | |
| }, | |
| { | |
| "group_id": "sg-fc64c6b4", | |
| "group_name": "http+https" | |
| } | |
| ], | |
| "source_dest_check": true, | |
| "state": { | |
| "code": 80, | |
| "name": "stopped" | |
| }, | |
| "state_reason": { | |
| "code": "Client.UserInitiatedShutdown", | |
| "message": "Client.UserInitiatedShutdown: User initiated shutdown" | |
| }, | |
| "state_transition_reason": "User initiated (2018-07-01 01:49:14 GMT)", | |
| "subnet_id": "subnet-9a2543c0", | |
| "tags": { | |
| "Name": "solomon-test", | |
| "NightlyBackup": "Yes" | |
| }, | |
| "virtualization_type": "hvm", | |
| "vpc_id": "vpc-bc7408c5" | |
| }, | |
| { | |
| "ami_launch_index": 0, | |
| "architecture": "x86_64", | |
| "block_device_mappings": [ | |
| { | |
| "device_name": "/dev/xvda", | |
| "ebs": { | |
| "attach_time": "2018-07-04T19:54:52+00:00", | |
| "delete_on_termination": true, | |
| "status": "attached", | |
| "volume_id": "vol-0d6dbd54eeffd74e9" | |
| } | |
| } | |
| ], | |
| "client_token": "", | |
| "ebs_optimized": false, | |
| "ena_support": true, | |
| "hypervisor": "xen", | |
| "iam_instance_profile": { | |
| "arn": "arn:aws:iam::229792048549:instance-profile/ec2-s3-full-access", | |
| "id": "AIPAID3GG2QMCRY7TOW56" | |
| }, | |
| "image_id": "ami-b70554c8", | |
| "instance_id": "i-05736d2c52da72184", | |
| "instance_type": "t2.micro", | |
| "key_name": "general_key", | |
| "launch_time": "2018-07-04T19:54:51+00:00", | |
| "monitoring": { | |
| "state": "disabled" | |
| }, | |
| "network_interfaces": [ | |
| { | |
| "attachment": { | |
| "attach_time": "2018-07-04T19:54:51+00:00", | |
| "attachment_id": "eni-attach-444ae1fe", | |
| "delete_on_termination": true, | |
| "device_index": 0, | |
| "status": "attached" | |
| }, | |
| "description": "", | |
| "groups": [ | |
| { | |
| "group_id": "sg-99882ad1", | |
| "group_name": "sshd" | |
| }, | |
| { | |
| "group_id": "sg-fc64c6b4", | |
| "group_name": "http+https" | |
| } | |
| ], | |
| "ipv6_addresses": [], | |
| "mac_address": "12:90:09:b0:58:c6", | |
| "network_interface_id": "eni-487c11eb", | |
| "owner_id": "229792048549", | |
| "private_dns_name": "ip-172-31-91-170.ec2.internal", | |
| "private_ip_address": "172.31.91.170", | |
| "private_ip_addresses": [ | |
| { | |
| "primary": true, | |
| "private_dns_name": "ip-172-31-91-170.ec2.internal", | |
| "private_ip_address": "172.31.91.170" | |
| } | |
| ], | |
| "source_dest_check": true, | |
| "status": "in-use", | |
| "subnet_id": "subnet-66f7984a", | |
| "vpc_id": "vpc-bc7408c5" | |
| } | |
| ], | |
| "placement": { | |
| "availability_zone": "us-east-1a", | |
| "group_name": "", | |
| "tenancy": "default" | |
| }, | |
| "private_dns_name": "ip-172-31-91-170.ec2.internal", | |
| "private_ip_address": "172.31.91.170", | |
| "product_codes": [], | |
| "public_dns_name": "", | |
| "root_device_name": "/dev/xvda", | |
| "root_device_type": "ebs", | |
| "security_groups": [ | |
| { | |
| "group_id": "sg-99882ad1", | |
| "group_name": "sshd" | |
| }, | |
| { | |
| "group_id": "sg-fc64c6b4", | |
| "group_name": "http+https" | |
| } | |
| ], | |
| "source_dest_check": true, | |
| "state": { | |
| "code": 80, | |
| "name": "stopped" | |
| }, | |
| "state_reason": { | |
| "code": "Client.UserInitiatedShutdown", | |
| "message": "Client.UserInitiatedShutdown: User initiated shutdown" | |
| }, | |
| "state_transition_reason": "User initiated (2018-07-05 04:27:10 GMT)", | |
| "subnet_id": "subnet-66f7984a", | |
| "tags": { | |
| "NightlyBackup": "Yes" | |
| }, | |
| "virtualization_type": "hvm", | |
| "vpc_id": "vpc-bc7408c5" | |
| } | |
| ] | |
| } | |
| } | |
| TASK [gather-ec2-facts : Set fact instances] ********************************************************************************************************************************************************************** | |
| ok: [localhost] => {"ansible_facts": {"instances": ["i-0468fc479c884d8b7", "i-04ff7bb389bdf86f0", "i-05736d2c52da72184"]}, "changed": false} | |
| TASK [gather-ec2-facts : Map Name] ******************************************************************************************************************************************************************************** | |
| ok: [localhost] => {"ansible_facts": {"map_name": "[u'solomon-test-2', u'solomon-test', Undefined]"}, "changed": false} | |
| TASK [gather-ec2-facts : debug] *********************************************************************************************************************************************************************************** | |
| ok: [localhost] => { | |
| "map_name": "[u'solomon-test-2', u'solomon-test', Undefined]" | |
| } | |
| TASK [gather-ec2-facts : debug] *********************************************************************************************************************************************************************************** | |
| ok: [localhost] => { | |
| "instances": [ | |
| "i-0468fc479c884d8b7", | |
| "i-04ff7bb389bdf86f0", | |
| "i-05736d2c52da72184" | |
| ] | |
| } |
Thanks. It's night already, I will look at the lunch tomorrow. I not, poke me, please.
Thanks for bringing up an interesting puzzle.
My solution (without analyzing why you are doing and what) is:
- name: Map Name
set_fact:
map_name: "{{ ec2_facts.instances | map(attribute='tags.Name') | select('defined')|list }}"
It uses select filter which passes only those element of the list which are match for an argument. I pass 'defined' filter to reject all undefined elements.
I hope this will help. Anyway, nice puzzle, thanks.
Hey thanks for the help! It's a good step forward but I really wanted to replace undefined with some sort of placeholder. Then I can iterate through the list and replace the placeholder with the corresponding i-#.
The end result I want is a list that says: [solomon-test-2, solomon-test, i-05736d2c52da72184]
Oh, that's simple too. There are filters map and default.
map_name: "{{ ec2_facts.instances | map(attribute='tags.Name') | map('default', 'foobar')|list }}"
That's what I needed! I can manipulate the list like I wanted now! I looked up defaults in ansible and did not see this command. Thanks a lot.
I cleaned up the script a bit and added output. In my AWS Console I have 3 ec2: solomon-test-2, solomon-test and 1 w/o a Name tag. As you can see from the output I can get all 3 i-#'s fine, but the Undefined in the Name query is screwing things up.