如何从字符串创建Ansible变量

yan*_*ael 4 ansible ansible-playbook

例如:

我有变量{{ami_redhat_7_2}}我想要使用它

vars:
  OsType: redhat
  OsVersion: '7_2'

tasks:
- debug: 'msg="{{ ami_{{OsType}}_{{ OsVersion }} }}"'
Run Code Online (Sandbox Code Playgroud)

我得到了错误:

fatal: [localhost]: FAILED! => {
    "failed": true,
    "msg": "template error while templating string: expected token 'end of print statement', got '{'. String: {{ ami_{{ OsType }}_{{ OsVersion }} }}"
}
Run Code Online (Sandbox Code Playgroud)

Kon*_*rov 11

具有动态名称的"root"变量在Ansible中是一件棘手的事情.
如果它们是主机事实,您可以像这样访问它们:

{{ hostvars[inventory_hostname]['ami_'+OsType+'_'+OsVersion] }}
Run Code Online (Sandbox Code Playgroud)

如果它们是游戏绑定变量,您可以通过未记录的vars对象访问它们:

{{ vars['ami_'+OsType+'_'+OsVersion] }}
Run Code Online (Sandbox Code Playgroud)

但是他们永远不会被模仿,因为他们会vars以特殊的方式对待.

最简单的方法是使用预定义名称和动态密钥名称的dict,例如:

ami:
   redhat_7_2: 827987234/dfhksdj/234ou234/ami.id
Run Code Online (Sandbox Code Playgroud)

要访问它,您可以使用:

{{ ami[OsType+'_'+OsVersion] }}
Run Code Online (Sandbox Code Playgroud)

PS并删除msg其他答案中建议的引号.