Ansible - 迭代直到包含文件的文件夹。输出到文件

时间:2017-11-22 02:29:00

标签: ansible ansible-2.x

希望有人能够为我提供答案。我目前有一个像这样的文件夹结构。

/BASE_DIR
    /FOLDER_A
       - file1.txt
       - file2.txt
    /FOLDER_B
    /FOLDER_C
       - file3.txt

我试图创建一个可以告诉我哪些文件夹包含文件的剧本。我的最终目标是拥有一个平面文件:

FOLDER_A, file1.txt
FOLDER_A, file2.txt
FOLDER_C, file3.txt

目前这是我的剧本:

- name: get files from all folders
  shell: cd /BASE_DIR/{{ item.name }} && ls -p | grep -v / |grep .txt |cat
  with_items:
     - name: "FOLDER_A"
     - name: "FOLDER_B"
     - name: "FOLDER_C"
  register: "fileitems"

- name: combine to have folder name as key, filenames as values
  set_fact:
     folders_with_files: "{{ folders_with_files|default({}) | combine( { item.item.name: item.stdout_lines } ) }}"
  with_items: "{{ fileitems.results }}"
  when: "{{ item.stdout_lines|length }} > 0"

- debug:
  var: folders_with_files

我以为我可以遍历每个文件夹寻找* .txt然后使用合并,这将是一种简单的迭代方式。

ok: [localhost] => {
    "folders_with_files": {
        "FOLDER_A": [
            "file1.txt",
            "file2.txt"
        ],
        "FOLDER_C": [
            "file3.txt"
        ]
    }
}

但即使有了这个输出,我也不认为我可以按照我需要的方式正确地解析它。我想也许嵌套循环可能会有所帮助,但这意味着我需要事先知道密钥的名称。

任何帮助将不胜感激!

谢谢, Ť

1 个答案:

答案 0 :(得分:1)

我发布问题后立即找到数字,我找到了自己的答案......

我决定删除联合收割机,然后附加到空列表中。

- set_fact:
 folders_with_files: []

- name: get all sql from each adapter
  shell: cd /tmp/{{ item.name }} && ls -p | grep -v / |grep .txt |cat
  with_items:
    - name: "FOLDER_A"
    - name: "FOLDER_B"
    - name: "FOLDER_C"
  register: "fileitems"

- name: combine to display which adapters have files
  set_fact:
    folders_with_files: "{{ folders_with_files + [{ 'name': item.item.name, 'files': item.stdout_lines }] }}"
  with_items: "{{ fileitems.results }}"
  when: "{{ item.stdout_lines|length }} > 0"

- debug:
    var: folders_with_files

我的输出变为:

ok: [localhost] => {
    "folders_with_files": [
        {
            "files": [
                "file1.txt",
                "file2.txt"
            ],
            "name": "FOLDER_A"
        },
        {
            "files": [
                "file3.txt"
            ],
            "name": "FOLDER_C"
        }
    ]
}

然后我可以使用with_subelements:

- name: echo
  shell: echo "{{ item.0.name }}, {{ item.1}}" >> /tmp/output.txt
  with_subelements:
     - "{{ folders_with_files }}"
     - files