问题描述
在使用 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 的其他模块来执行任务。
正文完