在 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