我正在尝试在 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 命令?
您的剧本中似乎存在语法错误。 当您使用
|
文字块运算符时,将逐字使用该块的内容 - 包括换行符。 这意味着当你写:
shell: |
secret-tool store
--label='{{ secret_label }}'
'{{ secret_key }}' '{{ secret_value }}'
您正在尝试运行以下三个单独的命令:
secret-tool store
--label='{{ secret_label }}'
'{{ secret_key }}' '{{ secret_value }}'
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