我尝试使用以下代码创建多个设备,例如/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"
答案 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