Ansible - 在单个游戏中迭代多个哈希值

时间:2015-07-29 15:52:22

标签: ansible ansible-playbook

我在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将迭代其他三个哈希的并集。

这有意义吗?我甚至想做什么?自从这种情况下的数据结构以来,更改播放比数据结构更容易。

1 个答案:

答案 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

来配置