0

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确实存在。什么是最简洁的方法?你能提供在 when 子句中测试目标服务器上是否存在某些东西?

4

1 回答 1

2

如果您只想跳过命令执行,那么模块creates的参数 将解决您的问题。如果目标文件/目录已经存在,它指示模块跳过命令的执行。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,因此每次执行 playbook 时都可能会复制它。其次,可能需要引入一个额外的任务来检查 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
于 2014-01-21T11:53:25.793 回答