Ansible很适合推出(在我们的例子中是JBoss)。该剧本的一部分是:
- 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
确实存在。最好的是什么这样做的方法?如果if子句中的目标服务器上存在某些东西,你能提供一个测试吗?
答案 0 :(得分:2)
如果您只想跳过命令执行,则creates
module的command
参数可以解决您的问题。如果目标文件/目录已存在,它指示模块跳过命令的执行。
以下是一个例子:
- 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
变量jbossDirectory
状态为changed
,则归档文件将被复制到/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