2016-10-04 108 views
-1
創建它之前

我試圖像/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" 

回答

2

使用命令模塊,而不是外殼模塊,它支持「創建」功能。

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

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