如何在 ansible 任务中通过秘密工具在 gnome 密钥环中存储新记录或如何在 ansible shell 任务中通过管道传输 stdin?

问题描述 投票:0回答:1

我正在尝试在 ansible 任务中以编程方式将新密码记录存储在 gnome 密钥环中。由于没有专门的 ansible 模块来完成此任务,我尝试了

shell
模块 - 但我很难传递新记录的密码。

要转换为 ansible 任务的 (bash) 任务是:

$ echo "mysecret" | secret-tool store \
    --label='secret_label' 'secret_key 'secret_value'

secret-tool 的手册页指出

要存储的密码也可以通过标准输入输入。密码将 是 stdin 的内容,直到 EOF。如果您通过 stdin 提供换行符 它将作为密码的一部分存储。

但是我没有设法在我的 ansible 任务中通过 stdin 输入密码:

- name: Ensure gnome keyring entry for secret_label exists
  shell: secret-tool store --label='{{ secret_label }}' '{{ secret_key }}' '{{ secret_value }}'
  args:
    stdin: "{{ mysecret }}"
    stdin_add_newline: false

此任务不会产生任何错误,但不会在 gnome 密钥环中创建新的密码记录。

如何将

mysecret
作为标准输入传输到我的 ansible shell 命令?

ansible
1个回答
0
投票

您的剧本中似乎存在语法错误。 当您使用

|
文字块运算符时,将逐字使用该块的内容 - 包括换行符。 这意味着当你写: shell: | secret-tool store --label='{{ secret_label }}' '{{ secret_key }}' '{{ secret_value }}'

您正在尝试运行以下三个单独的命令:

    secret-tool store
  1. --label='{{ secret_label }}'
  2. '{{ secret_key }}' '{{ secret_value }}'
  3. 
    
  4. 这将失败,因为这些都不是有效的命令。如果我自己运行它,我会得到输出:

TASK [shell] ************************************************************************** fatal: [localhost]: FAILED! => {"changed": true, "cmd": "secret-tool store\n--label='secret_label'\n'secret_key' 'secret_Value'\n", "delta": "0:00:00.005253", "end": "2019-11-17 19:20:41.147034", "msg": "non-zero return code", "rc": 127, "start": "2019-11-17 19:20:41.141781", "stderr": "secret-tool: must specify a label for the new item\nusage: secret-tool store --label='label' attribute value ...\n secret-tool lookup attribute value ...\n secret-tool clear attribute value ...\n secret-tool search [--all] [--unlock] attribute value ...\n/bin/sh: line 1: --label=secret_label: command not found\n/bin/sh: line 2: secret_key: command not found", "stderr_lines": ["secret-tool: must specify a label for the new item", "usage: secret-tool store --label='label' attribute value ...", " secret-tool lookup attribute value ...", " secret-tool clear attribute value ...", " secret-tool search [--all] [--unlock] attribute value ...", "/bin/sh: line 1: --label=secret_label: command not found", "/bin/sh: line 2: secret_key: command not found"], "stdout": "", "stdout_lines": []}

有几种不同的方法可以解决这个问题。  一种选择是以与编写任何其他多行命令相同的方式编写它,并使用反斜杠将命令扩展到多行:

--- - hosts: localhost gather_facts: false vars: secret_label: secret_label secret_key: secret_key secret_value: secret_value mysecret: mysecret tasks: - shell: | secret-tool store \ --label='{{ secret_label }}' \ '{{ secret_key }}' '{{ secret_value }}' args: stdin: "{{ mysecret }}" stdin_add_newline: false

您还可以使用 YAML 折叠块运算符 
>

,如下所示:

---
- hosts: localhost
  gather_facts: false

  vars:
    secret_label: secret_label
    secret_key: secret_key
    secret_value: secret_value
    mysecret: mysecret

  tasks:
    - shell: >
        secret-tool store
        --label='{{ secret_label }}'
        '{{ secret_key }}' '{{ secret_value }}'
      args:
        stdin: "{{ mysecret }}"
        stdin_add_newline: false

本例的最终结果是一样的。  在这两种情况下,运行上述剧本后,我看到:

$ secret-tool lookup secret_key secret_value mysecret

	
© www.soinside.com 2019 - 2024. All rights reserved.