Ansible 创建多个目录并在每个目录中创建文件

ayu*_*'ay 1 ansible

我正在尝试在每个目录中创建多个目录(具有不同的名称)和文件。

我有一个名为目录的变量,其中包含目录和文件名,如下所示:

directories:
  - directory: dir1
    static_files: 
      files: 
        - file1
        - file2

  - directory: dir2
    static_files: 
      files: 
        - file1
        - file2
Run Code Online (Sandbox Code Playgroud)

这是我能够使用 with_subelments 提出的解决方法,但有两个任务似乎有效。然而,我相信必须有一个只有一项任务的解决方案来实现这一目标。

- name: Creates directories
  file:
    path: "/tmp/{{ item[0].directory }}"
    state: directory
    recurse: yes
    mode: 0755
    owner: user
    group: group
  become: true
  with_subelements: 
    - "{{ directories }}"
    - static_files.files

- name: Creates files
  file:
    path: "/tmp/{{ item[0].directory }}/{{ item[1] }}"
    state: touch
    mode: 0644
    owner: user
    group: group
  become: true
  with_subelements: 
    - "{{ directories }}"
    - static_files.files
Run Code Online (Sandbox Code Playgroud)

我可能缺少一个可以完成这项工作的模块。我也尝试利用这个解决方案,但没有任何运气如何使用单个任务在ansible中的同一目录中创建目录和文件

我的问题是,如果可能的话,如何通过单个任务来实现这一目标?任何其他解决方案和方法也都很棒。

预期结果:

/tmp/dir1/file1
/tmp/dir1/file2
/tmp/dir2/file1
/tmp/dir2/file2
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏。

Vla*_*tka 7

创建结构

\n
  my_files: |\n    {% filter from_yaml %}\n    {% for dir in directories %}\n    - [{{ dir.directory}}, directory]\n    {% for file in dir.static_files.files %}\n    - [{{ dir.directory }}/{{ file }}, touch]\n    {% endfor %}\n    {% endfor %}\n    {% endfilter %}\n
Run Code Online (Sandbox Code Playgroud)\n

给出

\n
  my_files:\n    - [dir1, directory]\n    - [dir1/file1, touch]\n    - [dir1/file2, touch]\n    - [dir2, directory]\n    - [dir2/file1, touch]\n    - [dir2/file2, touch]\n
Run Code Online (Sandbox Code Playgroud)\n

列表的迭代

\n
    - file:\n        path: "/tmp/{{ item.0 }}"\n        state: "{{ item.1 }}"\n      loop: "{{ my_files }}"\n
Run Code Online (Sandbox Code Playgroud)\n

创建目录和文件

\n
TASK [file] ***************************************************************\nchanged: [localhost] => (item=[\'dir1\', \'directory\'])\nchanged: [localhost] => (item=[\'dir1/file1\', \'touch\'])\nchanged: [localhost] => (item=[\'dir1/file2\', \'touch\'])\nchanged: [localhost] => (item=[\'dir2\', \'directory\'])\nchanged: [localhost] => (item=[\'dir2/file1\', \'touch\'])\nchanged: [localhost] => (item=[\'dir2/file2\', \'touch\'])\n
Run Code Online (Sandbox Code Playgroud)\n
shell> tree /tmp/dir1\n/tmp/dir1\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 file1\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 file2\n\n0 directories, 2 files\n
Run Code Online (Sandbox Code Playgroud)\n
shell> tree /tmp/dir2\n/tmp/dir2\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 file1\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 file2\n\n0 directories, 2 files\n
Run Code Online (Sandbox Code Playgroud)\n

此任务不是幂等的。当您再次运行它时,文件将被触及,并且访问和修改时间都将被更新。如果您不想更改时间,请将参数access_timemodification_time设置为“保留”

\n
  my_files: |\n    {% filter from_yaml %}\n    {% for dir in directories %}\n    - [{{ dir.directory}}, directory]\n    {% for file in dir.static_files.files %}\n    - [{{ dir.directory }}/{{ file }}, touch, preserve, preserve]\n    {% endfor %}\n    {% endfor %}\n    {% endfilter %}\n
Run Code Online (Sandbox Code Playgroud)\n

给出

\n
  my_files:\n    - [dir1, directory]\n    - [dir1/file1, touch, preserve, preserve]\n    - [dir1/file2, touch, preserve, preserve]\n    - [dir2, directory]\n    - [dir2/file1, touch, preserve, preserve]\n    - [dir2/file2, touch, preserve, preserve]\n
Run Code Online (Sandbox Code Playgroud)\n

使参数access_timemodification_time可选

\n
    - file:\n        path: "/tmp/{{ item.0 }}"\n        state: "{{ item.1 }}"\n        access_time: "{{ item.2|d(omit) }}"\n        modification_time: "{{ item.3|d(omit) }}"\n      loop: "{{ my_files }}"\n
Run Code Online (Sandbox Code Playgroud)\n

这使得任务幂等

\n
TASK [file] ***************************************************************\nok: [localhost] => (item=[\'dir1\', \'directory\'])\nok: [localhost] => (item=[\'dir1/file1\', \'touch\', \'preserve\', \'preserve\'])\nok: [localhost] => (item=[\'dir1/file2\', \'touch\', \'preserve\', \'preserve\'])\nok: [localhost] => (item=[\'dir2\', \'directory\'])\nok: [localhost] => (item=[\'dir2/file1\', \'touch\', \'preserve\', \'preserve\'])\nok: [localhost] => (item=[\'dir2/file2\', \'touch\', \'preserve\', \'preserve\'])\n
Run Code Online (Sandbox Code Playgroud)\n
\n \n

用于测试的完整剧本示例

\n
- hosts: localhost\n\n  vars:\n\n    directories:\n      - directory: dir1\n        static_files: \n          files: \n            - file1\n            - file2\n      - directory: dir2\n        static_files: \n          files: \n            - file1\n            - file2\n\n    my_files: |\n      {% filter from_yaml %}\n      {% for dir in directories %}\n      - [{{ dir.directory}}, directory]\n      {% for file in dir.static_files.files %}\n      - [{{ dir.directory }}/{{ file }}, touch, preserve, preserve]\n      {% endfor %}\n      {% endfor %}\n      {% endfilter %}\n\n  tasks:\n\n    - debug:\n        var: my_files\n\n    - file:\n        path: "/tmp/{{ item.0 }}"\n        state: "{{ item.1 }}"\n        access_time: "{{ item.2|d(omit) }}"\n        modification_time: "{{ item.3|d(omit) }}"\n      loop: "{{ my_files }}"\n
Run Code Online (Sandbox Code Playgroud)\n
\n