以下のようなAnsibleプレイブックがあります。次のようなネストされた変数を使用します:msg={{{{Component}}.community_release_num}}
が、プレイブックを実行すると:
ansible-playbook vartest.yml -e 'version=version_402', it not work
[es@vpn-server nested-var]$ tree
.
├── vars
│ ├── horizon.yml
│ └── version_402.yml
└── vartest.yml
1 directory, 3 files
[es@vpn-server nested-var]$ cat vartest.yml
---
- name: test
hosts: localhost
vars_files:
- vars/{{version}}.yml
tasks:
- debug: msg={{{{Component}}.community_release_num}}
- debug: msg={{{{Component}}.release_num}}
[es@vpn-server nested-var]$ cat vars/horizon.yml
Component: horizon
[es@vpn-server nested-var]$ cat vars/version_402.yml
- horizon:
community_release_num: '9.0.1'
release_num: '4.0.2'
[es@vpn-server nested-var]$
エラーメッセージ
[es@vpn-server nested-var]$ ansible-playbook vartest.yml -e 'version=version_402'
/usr/lib64/python2.6/site-packages/cryptography/__init__.py:25: DeprecationWarning: Python 2.6 is no longer supported by the Python core team, please upgrade your Python.
DeprecationWarning
PLAY [test] *******************************************************************************************************
/usr/lib64/python2.6/site-packages/Crypto/Util/number.py:57: PowmInsecureWarning: Not using mpz_powm_sec. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.
_warn("Not using mpz_powm_sec. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.", PowmInsecureWarning)
TASK [debug] ******************************************************************************************************
fatal: [localhost]: FAILED! => {"failed": true, "msg": "template error while templating string: expected token 'colon', got '}'. String: {{{{Component}}.community_release_num}}"}
to retry, use: --limit @/data/wangqian/artemis-code-test/artemis/ansible/update/nested-var/vartest.retry
PLAY RECAP ********************************************************************************************************
localhost : ok=0 changed=0 unreachable=0 failed=1
Ansibleはネストされた変数を使用できますか?
もう1つのルールは、「口ひげは積み重ねない」です。これはよく見られます:
{{ somevar_{{other_var}} }}
上記は機能しません。動的変数を使用する必要がある場合は、必要に応じてhostvarsまたはvars辞書を使用してください。
{{ hostvars[inventory_hostname]['somevar_' + other_var] }}
あなたの場合:
- debug: msg={{hostvars[inventory_hostname][Component].community_release_num}}
または:
- debug: msg={{vars[Component].community_release_num}}
または(Ansible 2.5以降):
- debug: msg={{(lookup('vars', Component)).community_release_num}}