我在json文件中有一个数据结构,它被作为额外的变量文件提供给ansible,它看起来像这样:
"files_from_ftp":
{
"file1":
{
"full_name":"very-long-file-name-1"
"url":"ftp://.....very-long-file-name-1.zip"
},
"file2":
{
"full_name":"very-long-file-name-2"
"url":"ftp://.....very-long-file-name-2.zip"
}
},
"files_from_network":
{
"file3":
{
"full_name":"very-long-file-name-3"
"network_path":"file:///SOMEWHERE/ON/THE/NETWORK/very-long-file-name.zip"
}
},
"files_from_s3":
{
"file4":
{
"full_name":"very-long-file-name-4"
"url":"s3://some.s3.bucket/very-long-file-name-4.tar"
}
}
这三个部分指定从不同来源下载的文件。
它们来自不同的来源,并且知道它们中的一些是不同的类型(tar文件来自s3,来自本地网络和ftp服务器的zip)所以我有三个不同的播放来处理每个下载。但是在每次播放结束时,有一个文件,其名称是full_name
的值(这些哈希中的所有条目将具有名为full_name
的元素)在目录中/home/ubuntu/downloaded_files
。
在下载后,它们都以相同的方式处理。现在,我有三个单独的游戏做同样的事情,但迭代不同的哈希,如下:
- name: process files from ftp
shell: some_command -f /home/ubuntu/downloaded_files/{{ item.value.full_name }}
with_dict: files_from_ftp | default({})
- name: process files from network
shell: some_command -f /home/ubuntu/downloaded_files/{{ item.value.full_name }}
with_dict: files_from_network | default({})
- name: process files from s3
shell: some_command -f /home/ubuntu/downloaded_files/{{ item.value.full_name }}
with_dict: files_from_s3 | default({})
我希望能够有一个处理所有这些哈希的游戏,但我不确定这是否可行。我似乎无法弄清楚语法。我在假设的(可能是语法上无效的)代码中想到的是:
- name: process all downloaded files
shell: some_command -f /home/ubuntu/downloaded_files/{{ item.value.full_name }}
with_dict: ( files_from_s3 | default({}) )
and ( files_from_ftp | default({}) )
and ( files_from_network | default({}) )
在这段代码示例中,我想象with_dict
将迭代其他三个哈希的并集。
这有意义吗?我甚至想做什么?自从这种情况下的数据结构以来,更改播放比数据结构更容易。
答案 0 :(得分:2)
我个人认为你应该从使用文件哈希变为哈希列表。但是:
在Ansible 2.0中,你可以像hash_merge
这样做:
- shell: echo "{{ item.value.full_name }}"
with_dict: files_from_s3|hash_merge(files_from_ftp)|hash_merge(files_from_network)
您可以通过添加此hash_merge filter plugin
来配置