Ansible:使用寄存器评估变量内部的变量
Ansible : evaluate variable inside a variable with register
我有一个任务需要评估一个变量属性,其中的名称已经是一个变量。
场景如下:
我正在执行 shell 命令(docker ps
)并且我正在将输出注册到一个变量中,其中该名称已经是动态的:
- name : Display running containers for {{apiType}}
shell: docker ps
register: docker_containers_{{apiType}}
when:
- '"containers" in type'
不,我想显示输出的内容而不仅仅是字符串本身,所以我需要做这样的事情:
- name: Display running containers for {{apiType}}
debug:
msg: {{docker_containers_{{apiType}}.stdout}}
when:
- '"containers" in type'
当然,这个:{{docker_containers_{{apiType}}.stdout}}
在语法上被拒绝
我试过这个:{{docker_containers_[apiType].stdout}}
但是失败了。
有什么建议吗?
这是一个FAQ。您可以构建一个字符串并使用它来索引当前主机的 hostvars
:
- name: Display running containers for {{apiType}}
debug:
msg: "{{ hostvars[inventory_hostname]['docker_containers_' + apiType].stdout}}"
when:
- '"containers" in type'
...这假设您的 docker_containers_...
变量是主机事实,而不是通过 group_vars
或剧本中的 vars
节设置的内容。
这是一个可运行的例子:
- hosts: localhost
gather_facts: false
vars:
apiType: foo
tasks:
- set_fact:
docker_containers_foo:
stdout: "this is foo"
- set_fact:
docker_containers_bar:
stdout: "this is bar"
- name: Display running containers for {{apiType}}
debug:
msg: "{{ hostvars[inventory_hostname]['docker_containers_' + apiType].stdout}}"
我有一个任务需要评估一个变量属性,其中的名称已经是一个变量。
场景如下:
我正在执行 shell 命令(docker ps
)并且我正在将输出注册到一个变量中,其中该名称已经是动态的:
- name : Display running containers for {{apiType}}
shell: docker ps
register: docker_containers_{{apiType}}
when:
- '"containers" in type'
不,我想显示输出的内容而不仅仅是字符串本身,所以我需要做这样的事情:
- name: Display running containers for {{apiType}}
debug:
msg: {{docker_containers_{{apiType}}.stdout}}
when:
- '"containers" in type'
当然,这个:{{docker_containers_{{apiType}}.stdout}}
在语法上被拒绝
我试过这个:{{docker_containers_[apiType].stdout}}
但是失败了。
有什么建议吗?
这是一个FAQ。您可以构建一个字符串并使用它来索引当前主机的 hostvars
:
- name: Display running containers for {{apiType}}
debug:
msg: "{{ hostvars[inventory_hostname]['docker_containers_' + apiType].stdout}}"
when:
- '"containers" in type'
...这假设您的 docker_containers_...
变量是主机事实,而不是通过 group_vars
或剧本中的 vars
节设置的内容。
这是一个可运行的例子:
- hosts: localhost
gather_facts: false
vars:
apiType: foo
tasks:
- set_fact:
docker_containers_foo:
stdout: "this is foo"
- set_fact:
docker_containers_bar:
stdout: "this is bar"
- name: Display running containers for {{apiType}}
debug:
msg: "{{ hostvars[inventory_hostname]['docker_containers_' + apiType].stdout}}"