首页 > 解决方案 > ansible 变量名本身就是一个变量。如何阅读?需要语法

问题描述

我在变量文件中定义了一个 ansible 变量,如下所示:

cat myvarsfile.yml
newpass1: oldpass3
newpass2: oldpass9
newpass3: oldpass5
…

在我的主机剧本中,我加载如下变量文件:

   - name: Load password variable file
     include_vars: "{{ playbook_dir }}/myvarsfile.yml"

当用户传递参数时,newpass2我应该将其视为变量并从myvarsfile.yml文件中加载其值。

ansible-playbook -i /var/test.hosts test.yml -e mypass="newpass2"

old_pass考虑到未定义,我尝试了以下代码;但它不起作用。

   - debug:
       msg: "The old value for {{ mypass }} is {{ old_pass | default( vars[mypass] ) }}"

收到以下错误:

"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute u'newpass2'\n\nThe error appears to have been in ….

标签: variablesansibleruntime-errorundefinedlookup

解决方案


假设myvarsfile.yml在您的问题中,鉴于此剧本:

- hosts: localhost
  gather_facts: false
  tasks:
    - include_vars: myvarsfile.yml

    - debug:
        msg: "given mypass={{ mypass }}, old password={{old_pass|default(vars[mypass])}}"

运行此命令:

ansible-playbook playbook.yml -e mypass=newpass1

产生:


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

TASK [include_vars] *******************************************************************************************************************************************************
ok: [localhost]

TASK [debug] **************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "given mypass=newpass1, old password=oldpass3"
}

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

我相信这就是你正在寻找的行为。


推荐阅读