Loops Ansible从列表创建目录

Loops Ansible从列表创建目录,loops,variables,dictionary,ansible,Loops,Variables,Dictionary,Ansible,我想从我的vars/main.yml中的列表中创建一些目录 - app_root: network_prod: "/var/www/prod/network/app" database_prod: "/var/www/prod/db/app" 到目前为止,我的tasks/main.yml有以下内容: - name: Create application directory structure file: path: "{{ item }}" stat

我想从我的
vars/main.yml
中的列表中创建一些目录

- app_root:
    network_prod:   "/var/www/prod/network/app"
    database_prod:  "/var/www/prod/db/app"
到目前为止,我的
tasks/main.yml
有以下内容:

- name: Create application directory structure
  file: 
    path: "{{ item }}"
    state: directory
    mode: 755
  with_items:
    - app_root
但是不起作用。我认为这可以通过使用
和_dict
来实现,我还尝试了:

- name: Create application directory structure
  file: 
    path: "{{ item.value }}"
    state: directory
    mode: 755
  with_dict:
    - app_root
但是我得到了:
fatal:[vagrant.dev]=>with_dict需要一个dict

我已经读过了,但这似乎不起作用


我之所以使用这种表示法,是因为我在其他地方也使用了这些变量,我需要知道如何调用它们。

我个人觉得将yaml转换为json更容易一些,以确保我正确理解它。以你为例:

- app_root:
    network_prod:   "/var/www/prod/network/app"
    database_prod:  "/var/www/prod/db/app"
这里的不是列表,而是嵌套字典。如果将其转换为json,则如下所示:

[
  {
    "app_root": {
      "network_prod": "/var/www/prod/network/app",
      "database_prod": "/var/www/prod/db/app"
    }
  }
]
file: path={{ item }}
      state=directory 
with_items: app_root
为了在Ansible中循环,您需要取消对字典的两个级别的引用,第一个级别是
app\u root
,第二个级别是path元素。不幸的是,我认为Ansible不支持通过嵌套字典循环,只支持通过嵌套循环

最好的办法可能是重新定义路径,这样就不会创建那么复杂的数据结构。如果您在本例中所做的只是迭代路径列表,以确保目录存在,那么我建议您在
vars/main.yml
文件中执行类似的操作:

network_prod:   "/var/www/prod/network/app"
database_prod:  "/var/www/prod/db/app"

app_root:
  - network_prod
  - database_prod
然后您可以执行如下任务:

[
  {
    "app_root": {
      "network_prod": "/var/www/prod/network/app",
      "database_prod": "/var/www/prod/db/app"
    }
  }
]
file: path={{ item }}
      state=directory 
with_items: app_root

vars/main.yml
中,尝试删除
app_root
前面的破折号

app_root:
  network_prod:   "/var/www/prod/network/app"
  database_prod:  "/var/www/prod/db/app"

我认为使用dict的
方法是正确的,我认为这里唯一的问题是
app\u root
变量前面的破折号
-
。而不是:

- name: Create application directory structure
  file: 
    path: "{{ item.value }}"
    state: directory
    mode: 755
  with_dict:
    - app_root
应该是:

- name: Create application directory structure
  file: 
    path: "{{ item.value }}"
    state: directory
    mode: 755
  with_dict: app_root
查看变量
app\u root
通过dict传递到
的方式的差异


YAML中的破折号启动一个列表,元素不被视为变量,而被视为文本,想象一下,就好像你正在用dict将一个不可变的字符串“app\u root”传递给
(不完全正确,但它帮助我这样想)因此,
当_dict
无法解析它时,因为它被提供了一个列表而不是预期的字典。但是,如果没有破折号,
with_dict
将填充变量
app\u root
,它将解析它而不会出现问题。

我最终做了与您建议的类似的事情。我只需引用列表项:app_root:-“{{network_prod}}”-“{{database_prod}}”