使用 Ansible 在远程节点上执行多个 shell 命令

132次阅读
没有评论

问题描述

在使用 Ansible 执行一系列 shell 命令时遇到问题。以下是用户提供的 Ansible 任务示例:

- name: "Delete existing keys and de-arm"
  become: true
  shell: |
    "rm -rf /usr/share/keyrings/jenkins.gpg"
    "gpg --dearmor -o /usr/share/keyrings/jenkins.gpg /usr/share/keyrings/jenkins.io.key"

用户的任务旨在删除现有密钥并对密钥进行解除武装。然而,任务失败并显示了一个错误消息。

解决方案

首先,让我们分析一下你的 Ansible 任务,它似乎存在一些语法问题。接下来,我将为你提供两种可能的解决方案,以及一些额外的建议。

解决方案1:修复任务语法

根据回复1中提供的信息,你的任务语法存在问题。你不需要在 shell 命令前加上双引号,而且应该将多个命令用分号或逻辑与操作符连接。以下是修复后的任务示例:

- name: Delete existing keys and de-arm
  become: true
  shell: |
    rm -rf /usr/share/keyrings/jenkins.gpg
    gpg --dearmor -o /usr/share/keyrings/jenkins.gpg /usr/share/keyrings/jenkins.io.key

修复后的任务将逐行执行你指定的命令。

解决方案2:使用单个 shell 命令

如果你希望在单个 shell 命令中执行这两个操作,你可以使用逻辑与操作符 && 将它们连接起来。这样,只有在第一个命令成功执行后,才会执行第二个命令。以下是示例:

- name: Delete existing keys and de-arm
  become: true
  shell: "rm -rf /usr/share/keyrings/jenkins.gpg && gpg --dearmor -o /usr/share/keyrings/jenkins.gpg /usr/share/keyrings/jenkins.io.key"

额外建议:避免使用 shell 模块

虽然你可以使用 shell 模块在 Ansible 中执行命令,但最好的实践是尽可能使用 Ansible 模块来执行任务。在你的情况下,你可以使用 Ansible 的 file 模块来管理文件,并使用 command 模块来执行命令。这样可以提高可读性并减少与 shell 相关的问题。

下面是使用 Ansible 模块的示例:

- name: Delete existing keys
  become: true
  file:
    path: /usr/share/keyrings/jenkins.gpg
    state: absent

- name: De-arm the keys
  become: true
  command: gpg --dearmor -o /usr/share/keyrings/jenkins.gpg /usr/share/keyrings/jenkins.io.key
  register: jenkinskey

以上解决方案应该能够帮助你解决问题。如果你遇到进一步的困难,可以查看回复1中提供的类似问题和答案链接,或者考虑使用 Ansible 的其他模块来执行任务。

正文完