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 准备就绪:
- 我需要在
{{ current_mount }}
上存储的路径中实际创建一个文件
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 模块,但我没有运气
如果有办法执行此任务,请告诉我。
实现:
- 在
{{ current_mount }}
上存储的路径中创建一个文件
您需要 loop 超过 current_mount.stdout_lines
或 block_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 }}"
我正在创建一个剧本来验证 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 准备就绪:
- 我需要在
{{ current_mount }}
上存储的路径中实际创建一个文件
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 模块,但我没有运气
如果有办法执行此任务,请告诉我。
实现:
- 在
{{ current_mount }}
上存储的路径中创建一个文件
您需要 loop 超过 current_mount.stdout_lines
或 block_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 }}"