检查设备是否存在Ansible

问题描述:

创建它之前

我试图像/dev/zero/dev/null等使用创建几个设备下面的代码:检查设备是否存在Ansible

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

使用命令模块,而不是外壳模块,它支持“创建”功能。

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

这将创建目录如果他们不存在,并且如果他们做什么也不做。

+0

这个答案错误地解释了pro blem。 ['command'](https://docs.ansible.com/ansible/command_module.html)和['shell'](https://docs.ansible.com/ansible/shell_module.html)都支持'creates''参数。有问题的问题是错误的语法没有错误的模块使用。 – techraf

的问题是平凡简单:

  • 你需要一个空间在参数和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 
+0

我不知道为什么你在我的回答中删除了你的否定评论。如果你想呼唤某人回答,至少可以捍卫你的推理。我在发布之前测试了我的答案,并且没有返回语法错误。另外,它可以像OP要的那样工作。我承认我确实忽略了他的语法错误,但两个答案都是正确的。输出来自“mknod -m 0666/var/www/dev/zero c 1 5”NOT“mknod -m 0666/var/www/dev/zero c 1 5 created =/var/www/dev/null “如你所建议的那样。 – Avalon

+0

因为我纠正了它。 – techraf