如何使用Ansible变量的值来定位并获取hostvar的值?

时间:2016-10-05 14:51:05

标签: variables reference ansible

我遇到多个Ansible角色,使用多个group_vars。围绕每个主机的变量(取决于主机)传播的是许多目录路径,每个目录路径位于hostvar树中的不同位置。

我需要确保在配置时存在一定数量的这些目录。所以我创建了一个使用file模块的角色来确保这些目录存在。好吧,如果我能弄清楚如何让它发挥作用,它会这样做。

我有一个类似于:

的group_var
ensure_dirs:
  - "daemons.builder.dirs.pending"
  - "processor.prep.logdir"
  - "shed.logdir"

这3个值中的每一个都直接映射到一个组var,该组包含一个字符串值,表示该var的相应文件系统路径,例如:

daemons:
  builder:
    dirs:
      pending: /home/builder/pending

我想以某种方式迭代ensure_dirs并评估每个项目的值,以便将其解析为FS路径。

我尝试了几种方法,但似乎无法获得我需要的价值。以下是我所取得的最大成功,它只返回构造字符串的文字。

- file:
    dest: "hostvars['{{ ansible_hostname }}']['{{ item.split('.') | join(\"']['\") }}']"
    state: directory
  with_items: "{{ ensure_dirs }}"

这会导致在工作目录中命名为hostvars['builder']['daemons']['builder']['dirs']['pending']的目录。当然,我希望文件模块使用存储在hostvars中该路径的,这样它将确保/home/builder/pending存在。

有人有什么想法吗?

2 个答案:

答案 0 :(得分:1)

有一种简单的方法 - 模拟你的组变量。

<强> group_var

ensure_dirs:
  - "{{ daemons.builder.dirs.pending }}"
  - "{{ processor.prep.logdir }}"
  - "{{ shed.logdir }}"

<强>任务

- file:
    path: "{{ item }}"
    state: directory
  with_items: "{{ ensure_dirs }}"

答案 1 :(得分:0)

我建议您创建并使用查找插件。

Ansible定义了很多lookup plugins,最受欢迎的是&#39;项目&#39;当你使用&#39; with_items&#39;时。惯例是&#39; with_(插件名称)&#39;。

创建查找插件:

  • 修改文件ansible.cfg并取消注释关键字&#39; lookup_plugins&#39;有价值&#39; ./ plugins / lookup&#39;
  • 创建一个名为&#39; dirs.py&#39;的插件文件。在&#39; ./ plugins / lookup&#39;
  • 在您的剧本中使用它:

- file: dest: "{{ item }}" state: directory with_dirs: "{{ ensure_dirs }}"

  • 使用类似的东西实现你的插件dirs.py(更多示例请参阅lookup plugins

class LookupModule(LookupBase): def run(self, terms, **kwargs): return [dir.replace('.', '/') for dir in terms]

优点: *您的剧本更容易阅读 *你可以为你的插件创建python单一测试并改进它