Ansible Playbook 使用变量 stdout 作为输入来创建文件

Ansible Playbook using variable stdout as input to create files

我正在创建一个剧本来验证 fstab 中存在的所有 NFS 都已安装并且它们是 RW [read/write]。

这是我的剧本中实际有效的第一个部分。 将 mount 输出与当前 fstab.

进行比较
  tasks:

    -
      name: Get mounted devices
      shell: /usr/bin/mount | /usr/bin/sed -n {'/nfs / {/#/d;p}'} | /bin/awk '{print }'
      register: current_mount
    -
      set_fact:
        block_devices: "{{ current_mount.stdout_lines }}"

    -
      shell: /usr/bin/sed -n '/nfs/ {/#/d;p}' /root/testtab | /usr/bin/awk '{print }'
      register: fstab
    -
      set_fact:
        fstab_devices: "{{ fstab.stdout_lines }}"
    -
      name: Device not mounted
      fail:
        msg: "ONE OR MORE NFS ARE NOT MOUNTED, PLEASE VERIFY"
      when: block_devices != fstab_devices

现在验证这些 Read/Write 准备就绪:

  1. 我需要在 {{ current_mount }}
  2. 上存储的路径中实际创建一个文件

1.1) 如果成功我们继续并删除新创建的文件

1.2) 如果在创建一个或所有文件时失败,我们需要让 playbook 失败,msg 其中哪一个不是 read/write [也就是说,如果我们不能touch[create]里面的一个文件然后FS就不是RW了]

我尝试了下面的操作,但它似乎并不像那样工作。

    -
      file:
        path: "{{ current_mount }}"/ansibletestfile
        state: touch
    -
      file:
        path: "{{ current_mount }}"/ansibletestfile
        state: absent

这是 {{ current_mount }}

中内容的示例
/testnfs
/testnfs2
/testnfs3

经过一些研究,似乎要在一个变量中列出的不同 FS 中创建多个文件,我将不得不使用 item 模块,但我没有运气

如果有办法执行此任务,请告诉我。

实现:

  1. {{ current_mount }}
  2. 上存储的路径中创建一个文件

您需要 loop 超过 current_mount.stdout_linesblock_devices,例如:

- file:
    path: "{{ item }}/ansibletestfile"
    state: "touch"
  loop: "{{ current_mount.stdout_lines }}"

对于 1.1 和 1.2,我们可以使用 blocks。所以,总的来说,代码看起来像:

- block:
    # Try to touch file
    - file:
        path: "{{ item }}/ansibletestfile"
        state: "touch"
      loop: "{{ current_mount.stdout_lines }}"
  rescue:
    # If file couldn't be touched
    - fail:
        msg: "Could not create/touch file"
  always:
    # Remove the file regardless
    - file:
        path: "{{ item }}/ansibletestfile"
        state: "absent"
      loop: "{{ current_mount.stdout_lines }}"