使用Ansible在特定目录配置和编译程序

70次阅读
没有评论

问题描述

在使用Ansible时遇到了一个问题。他有一个Ansible任务,该任务将一个程序的源代码压缩包解压到特定目录,并需要在解压后的目录中执行配置和编译命令。尽管解压步骤正常工作,但在执行./configuremakesudo make install命令时遇到了问题。用户尝试过多种方法,但未能成功执行这些命令。以下是用户尝试过的一个任务示例:

- name: doit
  command: chdir=/tmp/proftpd/ ./configure && make && make install
  become: yes

然而,这个示例未能成功执行命令。用户想知道如何在Ansible中正确地执行这些命令。

解决方案

请注意以下操作可能需要根据版本差异进行调整。

在Ansible中,可以使用command模块来执行命令。然而,上述任务的问题在于,command模块只接受一个单一的命令,而不能通过&&连接多个命令。为了解决这个问题,我们需要使用shell模块来执行多个命令。不过,需要注意的是,使用shell模块可能会破坏playbook的幂等性(即多次运行不会产生不同的结果)。

针对这个问题,我们可以将任务拆分成三个子任务来处理:

  1. 使用shell模块执行配置命令./configure,并使用creates参数指定一个标识性的输出文件,以便只有在该文件不存在时才运行任务。这有助于维护playbook的幂等性。

  2. 使用Ansible的make模块执行make命令。

  3. 同样地,使用shell模块执行sudo make install命令。

下面是如何在playbook中实现这个解决方案的步骤:

- name: Run configure
  shell: ./configure
  args:
    chdir: /tmp/proftpd/
  creates: /tmp/proftpd/configured

- name: Run make
  make:
    chdir: /tmp/proftpd/
  args:
    chdir: /tmp/proftpd/
  when: "'configured' in ansible_facts['discovered_interpreter_python']"

- name: Run make install
  shell: sudo make install
  args:
    chdir: /tmp/proftpd/
  when: "'configured' in ansible_facts['discovered_interpreter_python']"

在上述示例中,我们首先使用shell模块运行./configure命令,并通过creates参数指定了一个文件路径。这将确保只有在标识性的输出文件不存在时才会运行这个任务。接下来,我们使用Ansible的make模块运行make命令。最后,我们使用shell模块运行sudo make install命令。

为了维护幂等性,我们使用了when条件来检查是否已经运行了./configure任务。这样,即使在多次运行playbook时,也能保证只有在需要的情况下才会执行后续的编译和安装任务。

请根据实际情况进行调整,并根据需要处理可能出现的错误或异常情况。

正文完