ansible playbook : Ошибка при подключении к хосту Windows (winrm) с помощью aws secret manager

#amazon-web-services #ansible #winrm #aws-secrets-manager

Вопрос:

я пытаюсь подключить свой узел ansible к серверу Windows с помощью winrm

моя ансибельная версия :

 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']"
}
 

спасибо за вашу помощь !

Ответ №1:

Сообщение об ошибке довольно четкое: list[str] != str ; хотя у меня нет секретного менеджера AWS для тестирования, к счастью, сообщение об ошибке делает знание исправления довольно очевидным: возьмите | first полученный список

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

Что касается вашей стороне, ответ — точно не использовать regex для извлечения этих значений; на основе регулярных выражений вы используете, я предполагаю, что результатом этого aws_secret поиска является в действительности JSON и, следовательно, правильное поведение, чтобы | from_json превратить его обратно в dict (Или list[dict] ), а затем извлечь ключ, который вы хотите

что — то вроде этого, но без знания фактической формы это, скорее всего, не на 100% правильно:

     ansible_password: >-
      {{ lookup('amazon.aws.aws_secret', 'ansible_password', bypath=true)
      | from_json | map(attribute='ansible_password') | first }}
 

Ответ №2:

благодаря 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» из поля значения >>