ansible playbook:使用 aws 秘密管理器连接到 Windows 主机 (winrm) 时出错

问题描述

我尝试使用 winrm 将我的 ansible 主机连接到 Windows 服务器

我的 ansible 版本:

ansible 2.10.8
  config file = None
  configured module search path = ['/home/ec2-user/.ansible/plugins/modules','/usr/share/ansible/plugins/modules']
  ansible python module location = /home/ec2-user/.local/lib/python3.6/site-packages/ansible
  executable location = /home/ec2-user/.local/bin/ansible
  python version = 3.6.8 (default,Dec  5 2019,15:45:45) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]

当密码在 vars 中时有效

 - hosts: win
  vars:
    ansible_user: "ansible"
    ansible_password: "Itismypassword"

并且它不适用于此配置:

- hosts: win
  vars:
    ansible_user: "ansible"
    ansible_password: "{{ lookup('amazon.aws.aws_secret','ansible_password',bypath=true) | regex_search ('ansible_password\\\":\\\"(.*)\\\"','\\1')}}"

我找回了密码(我使用正则表达式只获取密码,我不确定这是正确的方法

当我想使用它时,我收到此错误

fatal: [win_server]: Failed! => {
    "msg": "Invalid type for configuration option plugin_type: connection plugin: winrm setting: remote_password : Invalid type provided for \"string\": ['Itismypassword']"
}

感谢您的帮助!

解决方法

错误信息非常清楚:list[str] != str;虽然我没有要测试的 AWS Secret Manager,但幸运的是,错误消息使我很清楚知道修复程序:获取结果列表的 | first

    ansible_password: "{{
      lookup('amazon.aws.aws_secret','ansible_password',bypath=true)
      | regex_search ('ansible_password\\\":\\\"(.*)\\\"','\\1')
      | first }}"

至于你的旁白,答案是肯定不要使用正则表达式来提取这些值;根据您使用的正则表达式,我猜测 aws_secret 查找的输出实际上是 JSON,因此正确的行为是 | from_json 将其转回 {{1} }(或dict),然后提取你想要的密钥

类似这样的东西,但在不知道实际形状的情况下,这可能不是 100% 正确的:

list[dict]
,

感谢 mdaniel,我对 ansible 和 aws 秘密管理器的理解有所进步:它正在使用正则表达式,但我试图弄清楚如何以正确的方式做到这一点......

当我使用此命令从 aws 秘密管理器获取秘密时:

debug: msg="{{ lookup('amazon.aws.aws_secret','ansible_secret',bypath=true) | dict2items }} "

我有这个答案:

"msg": [
        {
            "key": "ansible_secret","value": "{\"password\":\"itismypassword\",\"user\":\"ansible_user\"}"
        }
    ]

我不知道如何从值字段中获取“itismypassword”>