鱼鱼鱼三条鱼
鱼鱼鱼三条鱼

Reputation: 69

Ansible how to reference the variables from different tasks files

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 undefined\n\nThe error appears to be in '/etc/ansible/roles/EC2/tasks/create-public-subnet.yml': line 3, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name:  print vpc_info_fact\n  ^ here\n"}

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

Upvotes: 1

Views: 2464

Answers (2)

TRW
TRW

Reputation: 1004

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.

Upvotes: 0

Rshad Zhran
Rshad Zhran

Reputation: 636

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

Upvotes: 1

Related Questions