在 Ansible 中创建设备之前检查设备是否存在
Check if device exists before creating it in Ansible
我正在尝试使用以下代码创建多个设备,如 /dev/zero
、/dev/null
等:
- name: mknod devices in default chroot
shell: "mknod -m 0666 {{ item.localdev }} c 1 {{ item.localvalue }}"
args:
creates:{{ item.localdev }}
with_items:
- { localdev: '/var/www/dev/null', localvalue: '3'}
- { localdev: '/var/www/dev/random', localvalue: '8'}
- { localdev: '/var/www/dev/urandom', localvalue: '9'}
- { localdev: '/var/www/dev/zero', localvalue: '5'}
tags: mknod_devices
当我第一次执行它时它工作,但是第二次和每一次它都失败并显示某个设备已经存在的消息。我已经检查了 creates
参数的另一种语法,并且我已经硬编码了这样的值:
creates: /var/www/dev/null
现在 ansible 不会失败,但显然这不是解决方案。有没有办法将变量放入 creates
参数?
EDIT:明确地说,作为一种解决方法,我也可以使用以下 shell
语法(经过测试,有效),但我正在寻找更简洁的解决方案
shell: "if [[ ! -e {{ item.localdev }} ]]; then mknod -m 0666 {{ item.localdev }} c 1 {{ item.localvalue }}; else echo \"{{ item.localdev }} exists, skipping\"; fi"
使用命令模块代替shell模块,支持"creates"功能。
---
- hosts: localhost
become: yes
tasks:
- name: mknod devices in default chroot
command: "mknod -m 0666 {{ item.localdev }} c 1 {{ item.localvalue }} creates={{ item.localdev }}"
with_items:
- { localdev: '/var/www/dev/null', localvalue: '3'}
- { localdev: '/var/www/dev/random', localvalue: '8'}
- { localdev: '/var/www/dev/urandom', localvalue: '9'}
- { localdev: '/var/www/dev/zero', localvalue: '5'}
tags: mknod_devices
如果目录不存在,这将创建目录,如果目录存在,则不执行任何操作。
问题很简单:
- 您需要在参数和
creates:{{ item.localdev }}
中的值之间添加一个 space
- 添加 space 后需要引用
{{ item.localdev }}
正确的语法是:
- name: mknod devices in default chroot
shell: "mknod -m 0666 {{ item.localdev }} c 1 {{ item.localvalue }}"
args:
creates: "{{ item.localdev }}"
with_items:
- { localdev: '/var/www/dev/null', localvalue: '3'}
- { localdev: '/var/www/dev/random', localvalue: '8'}
- { localdev: '/var/www/dev/urandom', localvalue: '9'}
- { localdev: '/var/www/dev/zero', localvalue: '5'}
tags: mknod_devices
我正在尝试使用以下代码创建多个设备,如 /dev/zero
、/dev/null
等:
- name: mknod devices in default chroot
shell: "mknod -m 0666 {{ item.localdev }} c 1 {{ item.localvalue }}"
args:
creates:{{ item.localdev }}
with_items:
- { localdev: '/var/www/dev/null', localvalue: '3'}
- { localdev: '/var/www/dev/random', localvalue: '8'}
- { localdev: '/var/www/dev/urandom', localvalue: '9'}
- { localdev: '/var/www/dev/zero', localvalue: '5'}
tags: mknod_devices
当我第一次执行它时它工作,但是第二次和每一次它都失败并显示某个设备已经存在的消息。我已经检查了 creates
参数的另一种语法,并且我已经硬编码了这样的值:
creates: /var/www/dev/null
现在 ansible 不会失败,但显然这不是解决方案。有没有办法将变量放入 creates
参数?
EDIT:明确地说,作为一种解决方法,我也可以使用以下 shell
语法(经过测试,有效),但我正在寻找更简洁的解决方案
shell: "if [[ ! -e {{ item.localdev }} ]]; then mknod -m 0666 {{ item.localdev }} c 1 {{ item.localvalue }}; else echo \"{{ item.localdev }} exists, skipping\"; fi"
使用命令模块代替shell模块,支持"creates"功能。
---
- hosts: localhost
become: yes
tasks:
- name: mknod devices in default chroot
command: "mknod -m 0666 {{ item.localdev }} c 1 {{ item.localvalue }} creates={{ item.localdev }}"
with_items:
- { localdev: '/var/www/dev/null', localvalue: '3'}
- { localdev: '/var/www/dev/random', localvalue: '8'}
- { localdev: '/var/www/dev/urandom', localvalue: '9'}
- { localdev: '/var/www/dev/zero', localvalue: '5'}
tags: mknod_devices
如果目录不存在,这将创建目录,如果目录存在,则不执行任何操作。
问题很简单:
- 您需要在参数和
creates:{{ item.localdev }}
中的值之间添加一个 space
- 添加 space 后需要引用
{{ item.localdev }}
正确的语法是:
- name: mknod devices in default chroot
shell: "mknod -m 0666 {{ item.localdev }} c 1 {{ item.localvalue }}"
args:
creates: "{{ item.localdev }}"
with_items:
- { localdev: '/var/www/dev/null', localvalue: '3'}
- { localdev: '/var/www/dev/random', localvalue: '8'}
- { localdev: '/var/www/dev/urandom', localvalue: '9'}
- { localdev: '/var/www/dev/zero', localvalue: '5'}
tags: mknod_devices