首页 > 解决方案 > 如何包含角色(vars)目录中的变量?

问题描述

我有我的 ansible 剧本,它基本上从 esxi 中的模板创建一个新的虚拟机,我必须将剧本转换为角色。我是 ansible 的新手,所以我不知道如何从角色(安装)->vars 目录中调用我的硬编码变量。

这是我的剧本

---
# create a new VM from a template

- name: VM from template
  hosts: localhost
  gather_facts: false
  connection: local
  vars:
    vcenter_hostname: vcenter-app
    vcenter_user: john@doe
    vcenter_pass: blabla6
    esxhost: esx-4.cbalo.fr
    datastore: VM-PROD-02-NORMAL
    vmtemplate: Centos7-template
    name: "newvm2"
    notes: Ansible Test
    dumpfacts: False
  tasks:
    - name: Create VM from template
      vmware_guest:
        validate_certs: False
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_user }}"
        password: "{{ vcenter_pass }}"
        esxi_hostname: "{{ esxhost }}"
        datacenter: CD06
        folder: Test
        name: "{{ name }}"
        template: "{{ vmtemplate }}"
        hardware:
          memory_mb: "{{ vm_memory | default(1024) }}"
        wait_for_ip_address: True
        state: present
      register: newvm2

我已经把它分成了我的角色(安装)->任务->main.yml,就像这样

---
- name: Create VM from template
              vmware_guest:
                validate_certs: False
                hostname: "{{ vcenter_hostname }}"
                username: "{{ vcenter_user }}"
                password: "{{ vcenter_pass }}"
                esxi_hostname: "{{ esxhost }}"
                datacenter: CD06
                folder: Test
                name: "{{ name }}"
                template: "{{ vmtemplate }}"
                hardware:
                  memory_mb: "{{ vm_memory | default(1024) }}"
                wait_for_ip_address: True
                state: present
              register: newvm2

然后在我的主目录中创建新文件run.yml并包含我的角色

---
    # create a new VM from a template
    
    - name: VM from template
      hosts: localhost
      gather_facts: false
      connection: local
      
      roles:
        - install

问题是我不知道如何从角色-> vars 目录调用 vars,正如您在我的剧本中看到的那样,我有硬代码变量。我需要在文件中获取或设置变量并从该文件中调用它。

**vcenter_hostname: vcenter-app
vcenter_user: john@doe
vcenter_pass: blabla6
esxhost: esx-4.cbalo.fr
datastore: VM-PROD-02-NORMAL
vmtemplate: Centos7-template
name: "newvm2"
datacenter: CD06
folder: Test**

标签: ansible

解决方案


ansible 中的变量是一组将替换某些占位符的值。你在运行你的剧本时提供它们,如果你包含角色等,它们将“涓涓细流”。检查文档以了解 ansible 中的变量优先级。

因此,您要做的是将变量分配放入库存中(您也可以使用 将变量拆分到单独的文件中group_vars),然后使用-i path/to/inventory.ymlon 您的ansible-playbook命令。

结构可能如下所示:

my-ansible/
  roles/
    my-role/
      tasks/
        main.yaml
      defaults/
        main.yaml # contains default values for your variables
  inventory/
    inventory.yaml # contains hosts and variable assignments
  run.yaml
  

然后,您可以像这样运行它:

ansible-playbook -i inventory/inventory.yaml run.yaml

提示:

  • 不要使用my-role/vars,因为在那里覆盖变量分配非常困难。(见变量优先级)
  • defaults/main.yaml不是必需的,但可以方便您很少更改的变量

推荐阅读