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}}"