It's even stranger than that (until you realize what's going on).
Rather than commenting out the "ansible_ssh_user:" line, just misspell the 
variable, like "ansible_ssh_userx". It'll work then, too — but with the 
wrong user of course.

What you're running into is a combination of things: set_fact, delegate_to, 
and the bit you didn't show, which is your playbook's "hosts:" line and/or 
your command's "--limit" specification. Also the "special variable" 
function of the "ansible_ssh_user" variable itself. Maybe throw in lazy 
variable template evaluation for good measure.

The error message is correct but incomplete, in that "aws_region" is 
undefined. What the message leaves out is "… in the context of the 
delegation host 'ec2.instances.0.network_interfaces.0.private_ip_address'".

You set the task variable "ansible_ssh_user" to a template. By lazy 
template evaluation, that template isn't evaluated until the variable is 
used, which is at the point of connection. So it's evaluated in the context 
of a host *which has no set_fact-derived variables defined*: 
'ec2.instances.0.network_interfaces.0.private_ip_address'. Only your play 
hosts will have set_fact-derived variables.

Assuming your hosts line is something like "hosts: localhost", then you can 
work around it by changing your variable definition to
ansible_ssh_user: "{{ amis[*hostvars['localhost'].*aws_region][
*hostvars['localhost'].*os_version].user }}"

I'm reasonably sure (but could be wrong) that the "amis" dict is defined, 
because it isn't a host variable. That's different from set_fact-derived 
variables which are both host-specific and template resolved at their 
creation.

Let us know if this resolves your issue.
--
Todd


On Saturday, January 13, 2024 at 9:40:57 AM UTC-5 ricardo barbosa wrote:

> Hello guys
>
> I created the following structure:
>
> ```
> amis:
>   us-east-1:
>     amazonlinux:
>       owner_id: "137112412989"
>       x86_64: "ami-01bc990364452ab3e"
>       arm64: "ami-0900a8f768a21540a"
>       user: "ec2-user"
>     ubuntu:
>       owner_id: "099720109477"
>       x86_64: "ami-0fc5d935ebf8bc3bc" # Ubuntu 22
>       arm64: "ami-016485166ec7fa705"  # 
>       user: "ubuntu"
> ```
>
> and I have a json file that I fill in to raise an ec2 instance:
>
> ```json
> {
>     "aws_region":"us-east-1",
>     "architecture":"arm64",
>     "os_version":"ubuntu",
>     "instance_name":"test6",
>     "domain":"example.corp",
>     "subnet":"SUBNET-PUB-A",
>     "instance_type":"t4g.micro",
>     "security_groups": [ "sg-xxxxxx", "sg-yyyyyyyy"],
>     "aws_role":"default-role",
>     "root_volume_size":20,
>     "ebs_swap_size": 4,
>     "keyname": "ssh-key",
>     "ebs_type": "gp3",
>     "backup": "no",
>     "boxenv":"DEV"
> }
> ```
>
> And I read this json and create the variables with the tasks:
>
> ```
> - name: Read json configuration
>     shell: cat config-ec2-launch.json
>     register: result
>       
>   - name: save the Json data to a Variable as a Fact
>     set_fact: 
>       jsondata: "{{ result.stdout | from_json }}"
>
>   - name: Variable | Get aws_region variable
>     set_fact:
>       aws_region: "{{ jsondata | json_query(jmesquery) }}"
>     vars:
>       jmesquery: 'aws_region'
>       
>   - name: Variable | Get architecture variable
>     set_fact:              
>       architecture: "{{ jsondata | json_query(jmesquery) }}"
>     vars:
>       jmesquery: 'architecture'
>
>   - name: Variable | Get os_version variable
>     set_fact:
>       os_version: "{{ jsondata | json_query(jmesquery) }}"
>     vars:
>       jmesquery: 'os_version'
> ```
>
> and created the tasks right away:
>
> ```
> - name: AWS Ec2 Instance | Create the EC2 instance
>     ec2_instance:
>       state: started   #  started state=running + waits for EC2 status 
> checks to report OK if wait=true
>       image_id: "{{ newest_ami }}"
>       name: "{{ instance_name }}"
>       detailed_monitoring: false
>       metadata_options:
>         http_tokens: required
>       instance_type: "{{ instance_type }}"
>       region: "{{ aws_region }}"
>       vpc_subnet_id: "{{ subnet_facts.subnets.0.id }}"    
>       instance_initiated_shutdown_behavior: stop
>       instance_role: "{{ aws_roles[aws_role] }}"
>       volumes:
>         - device_name: "{{ name_device_root_ami.images.0.root_device_name 
> }}"
>           ebs:
>             volume_type: gp3
>             volume_size: "{{ root_volume_size }}"
>             delete_on_termination: true
>       security_groups: "{{ security_groups }}"
>       tags:
>         Name: "{{ instance_name }}"
>         Domain: "{{ domain }}"
>         Backup: "{{ backup }}"
>         BOXENV: "{{ boxenv }}"
>       key_name: "{{ aws_key_names[keyname] }}"
>       wait: yes
>     register: ec2
>     
>   - name: AWS Ec2 ebs | Add volume to swap
>     amazon.aws.ec2_vol:
>       instance: "{{ ec2.instances[0].instance_id }}"
>       volume_size: "{{ ebs_swap_size }}"
>       volume_type: "{{ ebs_type }}"
>       delete_on_termination: True
>       device_name: "/dev/sdf"
>       region: '{{ aws_region }}'
>       tags:
>         Name: "{{ instance_name }}:swap"
>         BOXENV: "{{ boxenv }}"
>     
>
>   - name: Swap | List all devices on {{ instance_name }} 
>     vars:
>         ansible_ssh_user: "{{ amis[ aws_region ][ os_version ].user }}"
>     ansible.builtin.shell: echo "{{ aws_region }} {{ 
> ec2.instances.0.network_interfaces.0.private_ip_address }}"
>     register: devices_host
>     delegate_to: "{{ 
> ec2.instances.0.network_interfaces.0.private_ip_address }}"
>     args:
>       executable: /bin/bash
> ```
>
> But when I run it, it displays the error below
>
> ```
> FAILED! => {"msg": "'aws_region' is undefined"}
> ```
>
> If I comment the line `ansible_ssh_user: "{{ amis[ aws_region ][ 
> os_version ].user }}"` it displays the contents of the aws_region variable. 
> Any 
> idea where I'm going wrong? 
>
> Thanks
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to ansible-project+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/679a3397-c893-4b88-be21-7faa3caeb2fen%40googlegroups.com.

Reply via email to