#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» из поля значения >>