Ansible 如何在shell命令中使用本地注册变量

Ansible 如何在shell命令中使用本地注册变量,ansible,Ansible,我有以下ansible任务,其中注册了一个变量: - name: Get the existing access keys for the functional backup ID shell: "aws iam list-access-keys --user-name {{backup_functional_id}}" environment: AWS_ACCESS_KEY_ID: '{{aws_access_key_id}}' AWS_SECRET_ACCESS_KE

我有以下ansible任务,其中注册了一个变量:

- name: Get the existing access keys for the functional backup ID
  shell: "aws iam list-access-keys --user-name {{backup_functional_id}}"
  environment:
    AWS_ACCESS_KEY_ID: '{{aws_access_key_id}}'
    AWS_SECRET_ACCESS_KEY: '{{aws_secret_access_key}}'
  register: existing_access_keys
我希望在shell命令中使用此注册变量中的一些值

我能够记录我需要的值:

- name: Mark the old one as inactive for now
  debug:
    var: (existing_access_keys.stdout |from_json).AccessKeyMetadata[0].AccessKeyId
如何在shell中访问此文件:

- name: Get list of available access keys to make sure new one is generated
  shell: "aws iam update-access-key --access-key-id (existing_access_keys.stdout |from_json).AccessKeyMetadata[0].AccessKeyId --status Inactive"
  environment:
    AWS_ACCESS_KEY_ID: '{{aws_access_key_id}}'
    AWS_SECRET_ACCESS_KEY: '{{aws_secret_access_key}}'
我得到:

fatal: [localhost]: FAILED! => {"changed": true, "cmd": "aws iam update-access-key --access-key-id (existing_access_keys.stdout |from_json).AccessKeyMetadata[0].AccessKeyId --status Inactive", "delta": "0:00:00.003190", "end": "2019-03-28 12:53:42.283188", "msg": "non-zero return code", "rc": 2, "start": "2019-03-28 12:53:42.279998", "stderr": "/bin/sh: 1: Syntax error: \"(\" unexpected", "stderr_lines": ["/bin/sh: 1: Syntax error: \"(\" unexpected"], "stdout": "", "stdout_lines": []}
我尝试使用
{{}
,但效果不太好

我尝试使用简单调试进行调试:

- name: Set old_api_key
  set_fact:
    old_api_key: {{ (existing_access_keys.stdout |from_json).AccessKeyMetadata[0].AccessKeyId }}

- name: Print old_api_key
  debug:
    var: old_api_key
但是我在新的
[
中遇到了一个错误。我尝试使用
\
绘制它,但也不起作用

令人不快的一行似乎是:

      set_fact:
        old_api_key: {{ (existing_access_keys.stdout |from_json).AccessKeyMetadata[0].AccessKeyId }}
                                                                                  ^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes.  Always quote template expression brackets when they
start a value. For instance:

您需要将变量表达式括在{{}中

#!/usr/bin/env ansible-playbook
---
- hosts: localhost
  become: false
  gather_facts: false
  tasks:
  - vars:
      my_text: "World"
    shell: "echo 'Hello {{ my_text }}'"

$ ./playbook.yml -v
PLAY [localhost] *********************************************************************************************************************************************

TASK [shell] *************************************************************************************************************************************************
changed: [localhost] => {"changed": true, "cmd": "echo 'Hello World'", "delta": "0:00:00.002978", "end": "2019-03-28 15:06:58.623747", "rc": 0, "start": "2019-03-28 15:06:58.620769", "stderr": "", "stderr_lines": [], "stdout": "Hello World", "stdout_lines": ["Hello World"]}

PLAY RECAP ***************************************************************************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0   
就你而言:

- name: Get list of available access keys to make sure new one is generated
  environment:
    AWS_ACCESS_KEY_ID: "{{ aws_access_key_id }}"
    AWS_SECRET_ACCESS_KEY: "{{ aws_secret_access_key }}"
  shell: "aws iam update-access-key 
          --access-key-id {{ (existing_access_keys.stdout | from_json).AccessKeyMetadata[0].AccessKeyId }} 
          --status Inactive"

是的,当我以这种方式传递变量时,它是有效的。我的变量是注册的,正如您所看到的,并且您也可以在那里看到一些操作。我尝试使用
set\u fact
({existing\u access\u keys.stdout}}}}from\u json.)再次注册。AccessKeyMetadata[0]。AccessKeyId
)但这不起作用。你需要包围整个表达式,而不仅仅是一部分。为了清晰起见,我更新了主要帖子。添加了更多测试结果。所有模板表达式都必须用引号包围-old_api_key:“{(现有的_access_keys.stdout|from_json)。AccessKeyMetadata[0]。AccessKeyId}”