2014-01-21 64 views
0

Ansible非常適合推出(在我們的例子中是JBoss)。該劇本的一部分是:Ansible和有條件的軟件安裝

- name: copy jboss-eap-6.2.0.tar.gz to server 
    action: copy src=jboss-eap-6.2.0.tar.gz 
       dest=/tmp/jboss-eap-6.2.0.tar.gz 
       owner=root 
       group=root 

- name: Extracting jboss-eap-6.2.0.tar.gz 
    command: /bin/tar xfz /tmp/jboss-eap-6.2.0.tar.gz -C /opt 

它就像一個魅力,但它的作品每一次,我想Ansible停止劇本時已經安裝JBoss(在我們的情況下,測試是,如果/opt/jboss-eap-6.2.0確實存在。什麼是做到這一點的最巧妙的方法?你能提供一個測試,如果在當子句在目標服務器上的東西存在嗎?

回答

2

如果你只是想跳過命令執行則commandmodulecreates參數會解決如果目標文件/目錄已經存在,它將指示模塊跳過命令的執行

下面是一個例子:

- name: Extracting jboss-eap-6.2.0.tar.gz 
    command: creates=/opt/jboss_dir /bin/tar xfz /tmp/jboss-eap-6.2.0.tar.gz -C /opt 

你的具體情況是比較麻煩一些。首先,由於您正在複製到/tmp,因此您的存檔可能無法在重新啓動後繼續存在,因此每次執行劇本時都可能會被複制。其次可能需要引入額外的任務來檢查jboss目錄是否存在。

以下任務將:

  • 創建/opt/jboss_dir目錄,如果不存在了,這個任務的結果將被存儲在jbossDirectory可變
  • 如果jbossDirectorychanged狀態,存檔會複製到/tmp
  • 相同changed狀態也會造成檔案的提取

實例劇本:

- name: create jboss directory 
    file: state=directory dest=/opt/jboss_dir owner=root user=root 
    register: jbossDirectory 

- name: copy jboss-eap-6.2.0.tar.gz to server 
    copy: src=jboss-eap-6.2.0.tar.gz dest=/tmp/jboss-eap-6.2.0.tar.gz owner=root group=root 
    when: jbossDirectory|changed 

- name: extracti jboss-eap-6.2.0.tar.gz 
    command: /bin/tar xfz /tmp/jboss-eap-6.2.0.tar.gz -C /opt 
    when: jbossDirectory|changed