【问题标题】:Ansible how to reference the variables from different tasks filesAnsible 如何从不同的任务文件中引用变量
【发布时间】:2022-01-23 18:11:44
【问题描述】:

我希望能够从文件 create-public-sunbet 中引用文件 create-public-vpc 注册的变量 vpc_info

/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"

创建-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 }}"

创建-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

当我运行ansible-playbookec2-provision.yml时,报错信息如下:

[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  

【问题讨论】:

  • 问题不在于不同的文件,而在于不同的播放。如果这些任务在不同的播放中被调用,请使用set_fact 在第一次播放中存储 var。然后在下一个“正常”调用它(如果它在不同的主机上注册,则使用hostvars)。
  • 请使用MCVE 编辑您的问题。我们不知道您如何准确设置事实,在哪个主机上,在哪个游戏中以及您稍后尝试如何/在何处重用该 var。
  • 我尝试 set_ fact 一个变量,然后从 create-public-sunbet.yml 文件中访问它(使用 hostvars ['localhost']),但返回值有没有变量 vpc_info_fact 和 vpc_info
  • 我已经阅读了这条评论 3 次。删除它并重新粘贴它和/或将它复制到您的问题和下面的答案中不会告诉我们您如何准确设置事实,使用哪个主机来自哪个库存,在哪个游戏中,使用哪个模块加载您的文件(包括,include_tasks,角色...),在哪个剧本中。等等。请阅读How to ask 并创建一个真实 MCVE,您将其添加为对您的问题的编辑,而不是在评论中。谢谢。
  • 感谢您的建议,我再次编辑了问题描述

标签: ansible ansible-facts


【解决方案1】:

创建变量后,尝试将 variable 值设置为 fact,然后您将通过 访问相应的 fact >主机变量

例如:

- 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 }}"

要从不同的文件访问它,我们有以下任务:

- 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

【讨论】:

  • 我尝试 set_ fact 一个变量,然后从 create-public-sunbet.yml 文件中访问它(使用 hostvars ['localhost']),但返回值有没有变量 vpc_info_factvpc_info
  • 如果你在同一个游戏中使用这2个不同的任务文件,则不需要set_fact。可以直接使用注册的var。
  • 感谢您的建议。我知道如何纠正它
猜你喜欢
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 2022-11-18
相关资源
最近更新 更多