|
|
|
#!/usr/bin/env bash
|
|
|
|
|
|
|
|
set -eux
|
|
|
|
|
|
|
|
source virtualenv.sh
|
|
|
|
|
|
|
|
pip install "python-dateutil>=2.1,<2.7.0" jmespath "Jinja2>=2.10"
|
|
|
|
|
|
|
|
# create boto3 symlinks
|
|
|
|
ln -s "$(pwd)/lib/boto" "$(pwd)/lib/boto3"
|
|
|
|
ln -s "$(pwd)/lib/boto" "$(pwd)/lib/botocore"
|
|
|
|
|
|
|
|
# override boto's import path(s)
|
|
|
|
export PYTHONPATH
|
|
|
|
PYTHONPATH="$(pwd)/lib:$PYTHONPATH"
|
|
|
|
|
|
|
|
#################################################
|
|
|
|
# RUN THE SCRIPT
|
|
|
|
#################################################
|
|
|
|
|
|
|
|
# run the script first
|
|
|
|
cat << EOF > "$OUTPUT_DIR/ec2.ini"
|
|
|
|
[ec2]
|
|
|
|
regions = us-east-1
|
|
|
|
cache_path = $(pwd)/.cache
|
|
|
|
cache_max_age = 0
|
|
|
|
group_by_tag_none = False
|
|
|
|
|
|
|
|
[credentials]
|
|
|
|
aws_access_key_id = FOO
|
|
|
|
aws_secret_acccess_key = BAR
|
|
|
|
EOF
|
|
|
|
|
|
|
|
ANSIBLE_JINJA2_NATIVE=1 ansible-inventory -vvvv -i ./ec2.sh --list --output="$OUTPUT_DIR/script.out"
|
|
|
|
RC=$?
|
|
|
|
if [[ $RC != 0 ]]; then
|
|
|
|
exit $RC
|
|
|
|
fi
|
|
|
|
|
|
|
|
#################################################
|
|
|
|
# RUN THE PLUGIN
|
|
|
|
#################################################
|
|
|
|
|
|
|
|
# run the plugin second
|
|
|
|
export ANSIBLE_INVENTORY_ENABLED=aws_ec2
|
|
|
|
export ANSIBLE_INVENTORY=test.aws_ec2.yml
|
|
|
|
export AWS_ACCESS_KEY_ID=FOO
|
|
|
|
export AWS_SECRET_ACCESS_KEY=BAR
|
|
|
|
export ANSIBLE_TRANSFORM_INVALID_GROUP_CHARS=never
|
|
|
|
|
|
|
|
cat << EOF > "$OUTPUT_DIR/test.aws_ec2.yml"
|
|
|
|
plugin: aws_ec2
|
|
|
|
cache: False
|
|
|
|
use_contrib_script_compatible_sanitization: True
|
|
|
|
strict: True
|
|
|
|
regions:
|
|
|
|
- us-east-1
|
|
|
|
hostnames:
|
|
|
|
- network-interface.addresses.association.public-ip
|
|
|
|
- dns-name
|
|
|
|
filters:
|
|
|
|
instance-state-name: running
|
|
|
|
compose:
|
|
|
|
# vars that don't exist anymore in any meaningful way
|
|
|
|
ec2_item: undefined | default("")
|
|
|
|
ec2_monitoring: undefined | default("")
|
|
|
|
ec2_previous_state: undefined | default("")
|
|
|
|
ec2_previous_state_code: undefined | default(0)
|
|
|
|
ec2__in_monitoring_element: undefined | default(false)
|
|
|
|
# the following three will be accessible again after #53645
|
|
|
|
ec2_requester_id: undefined | default("")
|
|
|
|
ec2_eventsSet: undefined | default("")
|
|
|
|
ec2_persistent: undefined | default(false)
|
|
|
|
|
|
|
|
# vars that change
|
|
|
|
ansible_host: public_ip_address
|
|
|
|
ec2_block_devices: dict(block_device_mappings | map(attribute='device_name') | map('basename') | list | zip(block_device_mappings | map(attribute='ebs.volume_id') | list))
|
|
|
|
ec2_dns_name: public_dns_name
|
|
|
|
ec2_group_name: placement['group_name']
|
|
|
|
ec2_id: instance_id
|
|
|
|
ec2_instance_profile: iam_instance_profile | default("")
|
|
|
|
ec2_ip_address: public_ip_address
|
|
|
|
ec2_kernel: kernel_id | default("")
|
|
|
|
ec2_monitored: monitoring['state'] in ['enabled', 'pending']
|
|
|
|
ec2_monitoring_state: monitoring['state']
|
|
|
|
ec2_account_id: owner_id
|
|
|
|
ec2_placement: placement['availability_zone']
|
|
|
|
ec2_ramdisk: ramdisk_id | default("")
|
|
|
|
ec2_reason: state_transition_reason
|
|
|
|
ec2_security_group_ids: security_groups | map(attribute='group_id') | list | sort | join(',')
|
|
|
|
ec2_security_group_names: security_groups | map(attribute='group_name') | list | sort | join(',')
|
|
|
|
ec2_state: state['name']
|
|
|
|
ec2_state_code: state['code']
|
|
|
|
ec2_state_reason: state_reason['message'] if state_reason is defined else ""
|
|
|
|
ec2_sourceDestCheck: source_dest_check | lower | string # butchered snake_case case not a typo.
|
|
|
|
|
|
|
|
# vars that just need ec2_ prefix
|
|
|
|
ec2_ami_launch_index: ami_launch_index | string
|
|
|
|
ec2_architecture: architecture
|
|
|
|
ec2_client_token: client_token
|
|
|
|
ec2_ebs_optimized: ebs_optimized
|
|
|
|
ec2_hypervisor: hypervisor
|
|
|
|
ec2_image_id: image_id
|
|
|
|
ec2_instance_type: instance_type
|
|
|
|
ec2_key_name: key_name
|
|
|
|
ec2_launch_time: 'launch_time | regex_replace(" ", "T") | regex_replace("(\+)(\d\d):(\d)(\d)$", ".\g<2>\g<3>Z")'
|
|
|
|
ec2_platform: platform | default("")
|
|
|
|
ec2_private_dns_name: private_dns_name
|
|
|
|
ec2_private_ip_address: private_ip_address
|
|
|
|
ec2_public_dns_name: public_dns_name
|
|
|
|
ec2_region: placement['region']
|
|
|
|
ec2_root_device_name: root_device_name
|
|
|
|
ec2_root_device_type: root_device_type
|
|
|
|
ec2_spot_instance_request_id: spot_instance_request_id | default("")
|
|
|
|
ec2_subnet_id: subnet_id
|
|
|
|
ec2_virtualization_type: virtualization_type
|
|
|
|
ec2_vpc_id: vpc_id
|
|
|
|
tags: dict(tags.keys() | map('regex_replace', '[^A-Za-z0-9\_]', '_') | list | zip(tags.values() | list))
|
|
|
|
|
|
|
|
keyed_groups:
|
|
|
|
- key: '"ec2"'
|
|
|
|
separator: ""
|
|
|
|
- key: 'instance_id'
|
|
|
|
separator: ""
|
|
|
|
- key: tags
|
|
|
|
prefix: tag
|
|
|
|
- key: key_name | regex_replace('-', '_')
|
|
|
|
prefix: key
|
|
|
|
- key: placement['region']
|
|
|
|
separator: ""
|
|
|
|
- key: placement['availability_zone']
|
|
|
|
separator: ""
|
|
|
|
- key: platform | default('undefined')
|
|
|
|
prefix: platform
|
|
|
|
- key: vpc_id | regex_replace('-', '_')
|
|
|
|
prefix: vpc_id
|
|
|
|
- key: instance_type
|
|
|
|
prefix: type
|
|
|
|
- key: "image_id | regex_replace('-', '_')"
|
|
|
|
separator: ""
|
|
|
|
- key: security_groups | map(attribute='group_name') | map("regex_replace", "-", "_") | list
|
|
|
|
prefix: security_group
|
|
|
|
EOF
|
|
|
|
|
|
|
|
ANSIBLE_JINJA2_NATIVE=1 ansible-inventory -vvvv -i "$OUTPUT_DIR/test.aws_ec2.yml" --list --output="$OUTPUT_DIR/plugin.out"
|
|
|
|
|
|
|
|
#################################################
|
|
|
|
# DIFF THE RESULTS
|
|
|
|
#################################################
|
|
|
|
|
|
|
|
./inventory_diff.py "$OUTPUT_DIR/script.out" "$OUTPUT_DIR/plugin.out"
|