我遇到多个Ansible角色,使用多个group_vars。围绕每个主机的变量(取决于主机)传播的是许多目录路径,每个目录路径位于hostvar树中的不同位置。
我需要确保在配置时存在一定数量的这些目录。所以我创建了一个使用file
模块的角色来确保这些目录存在。好吧,如果我能弄清楚如何让它发挥作用,它会这样做。
我有一个类似于:
的group_varensure_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
存在。
有人有什么想法吗?
答案 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;。
创建查找插件:
- file:
dest: "{{ item }}"
state: directory
with_dirs: "{{ ensure_dirs }}"
class LookupModule(LookupBase):
def run(self, terms, **kwargs):
return [dir.replace('.', '/') for dir in terms]
优点: *您的剧本更容易阅读 *你可以为你的插件创建python单一测试并改进它