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