skip to Main Content

I want to be able to reference the variable vpc_info registered by file create-public-vpc from file create-public-sunbet

/etc/ansible/roles/ec2/tasks/main.yml

# tasks file for ec2-provision

- name:
  import_tasks: create-vpc.yml
  import_tasks: create-public-subnet.yml

/etc/ansible/roles/ec2/vars/main.yml

---
# vars file for ec2-provision

################################### designate python interpreter  ########################

ansible_python_interpreter: /usr/local/bin/python3.8


############################## VPC INFO #########################################
vpc_name: "My VPC"
vpc_cidr_block: "10.0.0.0/16"
aws_region: "us-east-1"


################################### VPC Subnet ###############################################
aws_zone: "us-east-1a"
# Subnets
vpc_public_subnet_cidr: "10.0.0.0/24"

# Subnet
vpc_private_subnet_cidr: "10.0.1.0/24"

create-vpc.yml

- name: Create AWS VPC
  ec2_vpc_net:  
    name: "{{ vpc_name }}"
    cidr_block: "{{ vpc_cidr_block }}"
    region: "{{ aws_region }}"
    aws_access_key: "{{ access_key }}"
    aws_secret_key: "{{ secret_key }}"
    state: present
  register: vpc_info    

- name: Set vpc_info as fact
  set_fact: 
    vpc_info_fact: "{{ vpc_info }}"

create-public-sunbet.yml

- name:  print vpc_info_fact
  debug:
    msg: "{{ hostvars['localhost']['vpc_info_fact'] }}"


- name: Create Public Subnet in VPC 
  ec2_vpc_subnet:
    vpc_id: "{{ vpc_info['vpc']['id'] }}"
    cidr: "{{ vpc_public_subnet_cidr }}"
    region: "{{ aws_region }}"
    az: "{{ aws_zone }}" 
    aws_access_key: "{{ access_key }}"
    aws_secret_key: "{{ secret_key }}"
    state: present
    tags:
      Name: Public Subnet
  register: public_subnet_info

When I run ansible-playbook ec2-provision.yml, the error message is as follows:

[root@VM-0-14-centos tasks]# ansible-playbook ec2-provision.yml 
[WARNING]: While constructing a mapping from /etc/ansible/roles/EC2/tasks/main.yml, line 4, column 3, found a duplicate dict key (import_tasks). Using last defined value
only.

PLAY [localhost] ************************************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [localhost]

TASK [EC2 : print vpc_info_fact] ********************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'vpc_info_fact' is undefinednnThe error appears to be in '/etc/ansible/roles/EC2/tasks/create-public-subnet.yml': line 3, column 3, but maynbe elsewhere in the file depending on the exact syntax problem.nnThe offending line appears to be:nnn- name:  print vpc_info_factn  ^ heren"}

PLAY RECAP ******************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0  

2

Answers


  1. Try to set the variable value as a fact once the variable is created and then you’d access the corresponding fact via hostvars.

    For example:

    - name: Create AWS VPC
      ec2_vpc_net:  
         name: "{{ vpc_name }}"
         cidr_block: "{{ vpc_cidr_block }}"
         region: "{{ aws_region }}"
         aws_access_key: "{{ access_key }}"
         aws_secret_key: "{{ secret_key }}"
         state: present
      register: vpc_info  
    
    - name: Set vpc_info as fact
      set_fact: vpc_info_fact="{{ vpc_info }}"
    

    To access it from a different file, we have the following task:

    - name: Create Public Subnet in VPC 
      ec2_vpc_subnet:
         vpc_id: "{{ hostvars['localhost']['vpc_info']['vpc']['id'] }}"
         cidr: "{{ vpc_public_subnet_cidr }}"
         region: "{{ aws_region }}"
         az: "{{ aws_zone }}" 
         aws_access_key: "{{ access_key }}"
         aws_secret_key: "{{ secret_key }}"
         state: present
         tags:
            Name: Public Subnet
      register: public_subnet_info
    
    Login or Signup to reply.
  2. Your main.yml contains a tasks with two modules. It should be

    - name: Create VPC
      import_tasks: create-vpc.yml
    
    - name: Create Public Subnets
      import_tasks: create-public-subnet.yml
    

    The running playbooks prints the warning about that issue.

    [WARNING]: While constructing a mapping from /etc/ansible/roles/EC2/tasks/main.yml, line 4, column 3, found a duplicate dict key (import_tasks). Using last defined value
    only.
    

    Ansible cannot have more then one module per task – and include_tasks is a module. It picks the last module, if there are multiple modules in one task (after writing the warning message and not exiting).

    This is the main problem of all your issues. Everything else looks ok to me.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search