在Ansible中创建设备之前,请检查设备是否存在

在Ansible中创建设备之前,请检查设备是否存在,ansible,ansible-playbook,Ansible,Ansible Playbook,我正在尝试使用以下代码创建几个设备,如/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', lo

我正在尝试使用以下代码创建几个设备,如
/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不会失败,但显然这不是一个解决方案。是否有办法将变量放入
创建的
参数中

编辑:明确地说,作为一种解决办法,我还可以使用以下
shell
语法(经过测试,可以正常工作),但我正在寻找一种更干净的解决方案

shell: "if [[ ! -e {{ item.localdev }} ]]; then mknod -m 0666 {{ item.localdev }} c 1 {{ item.localvalue }}; else echo \"{{ item.localdev }} exists, skipping\"; fi"

使用命令模块而不是支持“创建”功能的shell模块

---
- 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

如果目录不存在,则会创建目录,如果目录存在,则不会执行任何操作。

使用命令模块而不是支持“创建”功能的shell模块

---
- 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}}
  • 添加空间后,需要引用
    {{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

问题非常简单:

  • creates:{{item.localdev}}
  • 添加空间后,需要引用
    {{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

我不知道你为什么删除了对我答案的负面评论。如果你想叫别人回答,至少要为你的推理辩护。我在发布之前测试了我的答案,它没有返回语法错误。此外,它可以按照OP的要求工作。我承认我忽略了他的语法错误,但两个答案仍然正确。事实上,“mknod-m0666/var/www/dev/zero c1 5”的输出不是您建议的“mknod-m0666/var/www/dev/zero c1 5 creates=/var/www/dev/dev/null”。我不确定您为什么删除了对我答案的负面评论。如果你想叫别人回答,至少要为你的推理辩护。我在发布之前测试了我的答案,它没有返回语法错误。此外,它可以按照OP的要求工作。我承认我忽略了他的语法错误,但两个答案仍然正确。来自的输出实际上是“mknod-m0666/var/www/dev/zeroc15”,而不是您建议的“mknod-m0666/var/www/dev/zeroc15 creates=/var/www/dev/null”。这个答案错误地解释了问题。和都支持
创建
参数。问题在于错误的语法而不是错误的模块用法。这个答案错误地解释了问题。和都支持
创建
参数。问题在于语法错误,而不是模块使用错误。