首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用shell模块执行的多个shell命令

不使用shell模块执行的多个shell命令
EN

DevOps用户
提问于 2023-02-07 06:36:20
回答 1查看 272关注 0票数 0

由于某些原因,这一做法失败了:

代码语言:javascript
复制
- name: "Get GPG key from the Jenkins portal"
  get_url:
    url: https://pkg.jenkins.io/debian-stable/jenkins.io.key
    dest: /usr/share/keyrings/jenkins.io.key
- 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"

这是从另一个文件调用的任务文件的一部分。我不明白为什么第一个失败了。失败的原因是:

代码语言:javascript
复制
fatal: [localhost]: FAILED! => {
    "changed": true,
    "cmd": "\"rm -rf /usr/share/keyrings/jenkins.gpg\"\n\"gpg --dearmor -o /usr/share/keyrings/jenkins.gpg /usr/share/keyrings/jenkins.io.key\"\n",
    "delta": "0:00:00.021351",
    "end": "2023-02-07 12:00:17.975367",
    "invocation": {
        "module_args": {
            "_raw_params": "\"rm -rf /usr/share/keyrings/jenkins.gpg\"\n\"gpg --dearmor -o /usr/share/keyrings/jenkins.gpg /usr/share/keyrings/jenkins.io.key\"\n",
            "_uses_shell": true,
            "argv": null,
            "chdir": null,
            "creates": null,
            "executable": null,
            "removes": null,
            "stdin": null,
            "stdin_add_newline": true,
            "strip_empty_ends": true
        }
    },
    "msg": "non-zero return code",
    "rc": 127,
    "start": "2023-02-07 12:00:17.954016",
    "stderr": "/bin/sh: 1: rm -rf /usr/share/keyrings/jenkins.gpg: not found\n/bin/sh: 2: gpg --dearmor -o /usr/share/keyrings/jenkins.gpg /usr/share/keyrings/jenkins.io.key: not found",
    "stderr_lines": [
        "/bin/sh: 1: rm -rf /usr/share/keyrings/jenkins.gpg: not found",
        "/bin/sh: 2: gpg --dearmor -o /usr/share/keyrings/jenkins.gpg /usr/share/keyrings/jenkins.io.key: not found"
    ],
    "stdout": "",
    "stdout_lines": []
}

我不知道not found在这种情况下意味着什么。我可以在一个真实的shell上按顺序运行这些命令,它们可以工作。

代码语言:javascript
复制
- name: "Get GPG key from the Jenkins portal"
  get_url:
    url: https://pkg.jenkins.io/debian-stable/jenkins.io.key
    dest: /usr/share/keyrings/jenkins.io.key
- name: "Delete existing key"
  become: true
  shell: "rm -rf /usr/share/keyrings/jenkins.gpg"
- name: "De-arm the keys"
  become: true
  shell: "gpg --dearmor -o /usr/share/keyrings/jenkins.gpg /usr/share/keyrings/jenkins.io.key"
  register: jenkinskey

因为这些都是经过外壳处理的,所以我相信它们应该很好。

有什么暗示吗?

EN

回答 1

DevOps用户

回答已采纳

发布于 2023-02-07 11:07:45

我不明白为什么第一个失败了。

看起来任务有语法错误。

代码语言:javascript
复制
- 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"

根据错误信息

代码语言:javascript
复制
    "stderr": "/bin/sh: 1: rm -rf /usr/share/keyrings/jenkins.gpg: not found\n/bin/sh: 2: gpg --dearmor -o /usr/share/keyrings/jenkins.gpg /usr/share/keyrings/jenkins.io.key: not found",
    "stderr_lines": [
        "/bin/sh: 1: rm -rf /usr/share/keyrings/jenkins.gpg: not found",
        "/bin/sh: 2: gpg --dearmor -o /usr/share/keyrings/jenkins.gpg /usr/share/keyrings/jenkins.io.key: not found"

这些行被处理为一个命令,如果我正确解释它的话。此外,不需要引号。

我不知道not found在这种情况下意味着什么。

这意味着命令的整体或部分没有找到,这是一个语法错误,是预期的行为。

可能的解决方案

你可以试试

代码语言:javascript
复制
  - name: Exec sh script on Remote Node
    shell:
      cmd: |
        rm -f /usr/share/keyrings/jenkins.gpg
        gpg --dearmor -o /usr/share/keyrings/jenkins.gpg /usr/share/keyrings/jenkins.io.key
    register: result

甚至连

代码语言:javascript
复制
    shell: "rm -f /usr/share/keyrings/jenkins.gpg && gpg --dearmor -o /usr/share/keyrings/jenkins.gpg"

相似Q&A

进一步建议

而不是使用shell模块,而是使用Ansible模块实现命令

票数 1
EN
页面原文内容由DevOps提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://devops.stackexchange.com/questions/17382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档