amazon.aws icon indicating copy to clipboard operation
amazon.aws copied to clipboard

ec2_instance should still return instance details when instances already exist

Open nethershaw opened this issue 3 years ago • 3 comments

Summary

I am duplicating issue #859 because it was incorrectly closed.

Idempotency -- the core design pattern and expectation on which Ansible is built -- requires that the module's return data be complete and consistent whether a change occurs or not. Any instances that matched filters passed to the module because they already exist must be included in the module's instances return key.

It is an anti-pattern to suggest inserting a second task to cover a fault in idempotency of the first, especially after breaking the expectation set by the original "ec2" module. In Linux design philosophy, any such breaking change is automatically a bug.

Issue Type

Bug Report

Component Name

ec2_instance

Ansible Version

$ ansible --version
ansible [core 2.13.2]
  config file = /home/mvaughn/Documents/git/ansible/ansible.cfg
  configured module search path = ['/home/mvaughn/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.10/site-packages/ansible
  ansible collection location = /home/mvaughn/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/lib/python-exec/python3.10/ansible
  python version = 3.10.5 (main, Jun 30 2022, 16:31:10) [GCC 11.3.0]
  jinja version = 3.1.2
  libyaml = True

Collection Versions

$ ansible-galaxy collection list
# /usr/lib/python3.10/site-packages/ansible_collections
Collection                    Version
----------------------------- -------
amazon.aws                    3.3.1  
ansible.netcommon             3.0.1  
ansible.posix                 1.4.0  
ansible.utils                 2.6.1  
ansible.windows               1.10.0 
arista.eos                    5.0.1  
awx.awx                       21.2.0 
azure.azcollection            1.13.0 
check_point.mgmt              2.3.0  
chocolatey.chocolatey         1.3.0  
cisco.aci                     2.2.0  
cisco.asa                     3.1.0                     
cisco.dnac                    6.5.0  
cisco.intersight              1.0.19 
cisco.ios                     3.2.0  
cisco.iosxr                   3.2.0  
cisco.ise                     2.5.0  
cisco.meraki                  2.10.0 
cisco.mso                     2.0.0  
cisco.nso                     1.0.3  
cisco.nxos                    3.1.0                                                                                                                                                                                                                                                                                                                                                           
cisco.ucs                     1.8.0  
cloud.common                  2.1.2  
cloudscale_ch.cloud           2.2.2  
community.aws                 3.4.0  
community.azure               1.1.0  
community.ciscosmb            1.0.5  
community.crypto              2.4.0  
community.digitalocean        1.21.0 
community.dns                 2.2.1  
community.docker              2.7.0  
community.fortios             1.0.0  
community.general             5.3.0  
community.google              1.0.0  
community.grafana             1.5.0  
community.hashi_vault         3.0.0  
community.hrobot              1.4.0  
community.libvirt             1.1.0  
community.mongodb             1.4.1  
community.mysql               3.3.0  
community.network             4.0.1  
community.okd                 2.2.0  
community.postgresql          2.1.5  
community.proxysql            1.4.0  
community.rabbitmq            1.2.1  
community.routeros            2.1.0  
community.sap                 1.0.0  
community.sap_libs            1.1.0  
community.skydive             1.0.0  
community.sops                1.2.3  
community.vmware              2.7.0  
community.windows             1.10.0 
community.zabbix              1.7.0  
containers.podman             1.9.4  
cyberark.conjur               1.1.0  
cyberark.pas                  1.0.14 
dellemc.enterprise_sonic      1.1.1  
dellemc.openmanage            5.5.0  
dellemc.os10                  1.1.1  
dellemc.os6                   1.0.7  
dellemc.os9                   1.0.4  
f5networks.f5_modules         1.18.0 
fortinet.fortimanager         2.1.5  
fortinet.fortios              2.1.6  
frr.frr                       2.0.0  
gluster.gluster               1.0.2  
google.cloud                  1.0.2  
hetzner.hcloud                1.8.1  
hpe.nimble                    1.1.4  
ibm.qradar                    2.0.0  
infinidat.infinibox           1.3.3  
infoblox.nios_modules         1.3.0  
inspur.sm                     2.0.0  
junipernetworks.junos         3.1.0  
kubernetes.core               2.3.2  
mellanox.onyx                 1.0.0  
netapp.aws                    21.7.0 
netapp.azure                  21.10.0
netapp.cloudmanager           21.18.0
netapp.elementsw              21.7.0 
netapp.ontap                  21.20.0
netapp.storagegrid            21.10.0
netapp.um_info                21.8.0 
netapp_eseries.santricity     1.3.0  
netbox.netbox                 3.7.1  
ngine_io.cloudstack           2.2.4  
ngine_io.exoscale             1.0.0  
ngine_io.vultr                1.1.2  
openstack.cloud               1.8.0
openvswitch.openvswitch       2.1.0  
ovirt.ovirt                   2.1.0  
purestorage.flasharray        1.13.0 
purestorage.flashblade        1.9.0  
purestorage.fusion            1.0.2  
sensu.sensu_go                1.13.1 
servicenow.servicenow         1.0.6  
splunk.es                     2.0.0  
t_systems_mms.icinga_director 1.30.0 
theforeman.foreman            3.4.0  
vmware.vmware_rest            2.2.0  
vyos.vyos                     3.0.1  
wti.remote                    1.0.4

# /home/mvaughn/.ansible/collections/ansible_collections
Collection           Version
-------------------- -------
amazon.aws           4.1.0  
ansible.netcommon    1.1.2  
ansible.posix        1.3.0  
community.aws        4.0.0  
community.kubernetes 2.0.0  
kubernetes.core      2.3.2

AWS SDK versions

$ pip show boto boto3 botocore
Name: boto
Version: 2.49.0
Summary: Amazon Web Services Library
Home-page: https://github.com/boto/boto/
Author: Mitch Garnaat
Author-email: [email protected]
License: MIT
Location: /usr/lib/python3.10/site-packages
Requires: 
Required-by: 
---
Name: boto3
Version: 1.21.36
Summary: The AWS SDK for Python
Home-page: https://github.com/boto/boto3
Author: Amazon Web Services
Author-email: 
License: Apache License 2.0
Location: /home/mvaughn/.local/lib/python3.10/site-packages
Requires: s3transfer, jmespath, botocore
Required-by: 
---
Name: botocore
Version: 1.24.36
Summary: Low-level, data-driven core of boto 3.
Home-page: https://github.com/boto/botocore
Author: Amazon Web Services
Author-email: 
License: Apache License 2.0
Location: /home/mvaughn/.local/lib/python3.10/site-packages
Requires: jmespath, urllib3, python-dateutil
Required-by: s3transfer, boto3, awscli

Configuration

$ ansible-config dump --only-changed
CACHE_PLUGIN(/home/mvaughn/Documents/git/ansible/ansible.cfg) = redis
CACHE_PLUGIN_CONNECTION(/home/mvaughn/Documents/git/ansible/ansible.cfg) = localhost:6379:0
CALLBACKS_ENABLED(/home/mvaughn/Documents/git/ansible/ansible.cfg) = ['ansible.posix.profile_tasks']
DEFAULT_FORKS(/home/mvaughn/Documents/git/ansible/ansible.cfg) = 32
DEFAULT_GATHER_TIMEOUT(/home/mvaughn/Documents/git/ansible/ansible.cfg) = 30
DEFAULT_LOG_PATH(/home/mvaughn/Documents/git/ansible/ansible.cfg) = /var/log/ansible.log
DEFAULT_LOOKUP_PLUGIN_PATH(/home/mvaughn/Documents/git/ansible/ansible.cfg) = ['/home/mvaughn/.ansible/plugins/lookup', '/home/mvaughn/Documents/git/ansible/plugins/lookup', '/usr/share/ansible/plugins/lookup']
DEFAULT_MANAGED_STR(/home/mvaughn/Documents/git/ansible/ansible.cfg) = Ansible managed: {file} modified on %Y-%m-%d %H:%M:%S by {uid} on {host}
DEFAULT_REMOTE_USER(/home/mvaughn/Documents/git/ansible/ansible.cfg) = ansible
HOST_KEY_CHECKING(/home/mvaughn/Documents/git/ansible/ansible.cfg) = False
INVENTORY_ENABLED(/home/mvaughn/Documents/git/ansible/ansible.cfg) = ['amazon.aws.aws_ec2', 'host_list', 'script', 'auto', 'yaml', 'ini', 'toml']

OS / Environment

Gentoo Linux

Steps to Reproduce

- Launch an instance that already exists.

Expected Results

- Module return includes `[instances]`.

Actual Results

- Module return does not include `[instances]`.

Code of Conduct

  • [X] I agree to follow the Ansible Code of Conduct

nethershaw avatar Aug 10 '22 20:08 nethershaw

Files identified in the description:

  • [plugins/modules/ec2_instance.py](https://github.com/['ansible-collections/amazon.aws', 'ansible-collections/community.aws', 'ansible-collections/community.vmware']/blob/main/plugins/modules/ec2_instance.py)

If these files are inaccurate, please update the component name section of the description or use the !component bot command.

click here for bot help

ansibullbot avatar Aug 10 '22 20:08 ansibullbot

cc @jillr @ryansb @s-hertel @tremble click here for bot help

ansibullbot avatar Aug 10 '22 20:08 ansibullbot

@nethershaw,

Thanks for taking the time to open this issue. I personally prefer to consistently return details of the resource, even when no changes are made. I've tweaked the subject line a little, to reflect the desired change as this makes it easier for other people to find the issue.

tremble avatar Aug 11 '22 05:08 tremble

So, is there a recommended workaround for the moment? I've just taught myself how to debug tasks because I expected this pattern to work, when it didn't.

The documentation even leads me to believe that the 'instances' key would be present if 'wait == true' -- it isn't:

Screenshot 2022-12-21 at 8 22 06 AM

daraul avatar Dec 21 '22 12:12 daraul

So, is there a recommended workaround for the moment? I've just taught myself how to debug tasks because I expected this pattern to work, when it didn't.

ec2_instance_info: https://docs.ansible.com/ansible/devel/collections/amazon/aws/ec2_instance_info_module.html

tremble avatar Dec 21 '22 12:12 tremble

FTR: this works, but shouldn't be necessary:

    - name: Create EC2 instances
      amazon.aws.ec2_instance:
        instance_type: t2.nano
        state: running
        image:
          id: ami-f2b39792
        region: us-west-1
        name: myinstance
        exact_count: 2

    - name: Gather information about EC2 instances
      amazon.aws.ec2_instance_info:
        region: us-west-1
        filters:
          "tag:Name": myinstance
          instance-state-name: ["running"]
      register: ec2_instances

daraul avatar Dec 21 '22 12:12 daraul