问题描述
在使用Ansible时遇到了一个问题。他有一个Ansible任务,该任务将一个程序的源代码压缩包解压到特定目录,并需要在解压后的目录中执行配置和编译命令。尽管解压步骤正常工作,但在执行./configure
、make
和sudo make install
命令时遇到了问题。用户尝试过多种方法,但未能成功执行这些命令。以下是用户尝试过的一个任务示例:
- name: doit
command: chdir=/tmp/proftpd/ ./configure && make && make install
become: yes
然而,这个示例未能成功执行命令。用户想知道如何在Ansible中正确地执行这些命令。
解决方案
请注意以下操作可能需要根据版本差异进行调整。
在Ansible中,可以使用command
模块来执行命令。然而,上述任务的问题在于,command
模块只接受一个单一的命令,而不能通过&&
连接多个命令。为了解决这个问题,我们需要使用shell
模块来执行多个命令。不过,需要注意的是,使用shell
模块可能会破坏playbook的幂等性(即多次运行不会产生不同的结果)。
针对这个问题,我们可以将任务拆分成三个子任务来处理:
-
使用
shell
模块执行配置命令./configure
,并使用creates
参数指定一个标识性的输出文件,以便只有在该文件不存在时才运行任务。这有助于维护playbook的幂等性。 -
使用Ansible的
make
模块执行make
命令。 -
同样地,使用
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时,也能保证只有在需要的情况下才会执行后续的编译和安装任务。
请根据实际情况进行调整,并根据需要处理可能出现的错误或异常情况。