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

时间:2016-10-04 19:37:19

标签: 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',    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参数?

编辑:要明确,作为一种解决方法,我也可以使用以下shell语法(已测试,有效),但我正在寻找更清晰的解决方案

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

2 个答案:

答案 0 :(得分:3)

使用命令模块而不是支持“创建”功能的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

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

答案 1 :(得分:0)

这个问题非常简单:

  • 您需要在参数和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