2014-01-21 39 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