无法在 Ansible 中检索保管库机密
Unable to retrieve vault secrets in Ansible
我无法使用 VMware 动态清单文件从保管库读取机密。
库存:
https://github.com/ansible/ansible/blob/devel/contrib/inventory/vmware_inventory.ini(在我的 Ansible 目录结构中将其用作 vmware.yml)
https://github.com/ansible/ansible/blob/devel/contrib/inventory/vmware_inventory.py
更新了动态清单脚本中的几行
(vmware_inventory.py -#L213) 读取变量 -
'ini_path': os.path.join(os.path.dirname(__file__), '../group_vars/vmware/vmware.yml'),
Ansible 目录结构:
ansible/
inventory/
vmware_inventory.py
group_vars/
all_vars.yml
vmware/
vmware.yml
vault.yml
roles/
我可以 ping 通使用中的所有主机 - ansible all -i vmware_inventory.py -m ping
试用A:
使用 ansible-vault encrypt_string password123 --name 'password' --ask-vault-pass
加密密码值。使用加密密码更新 vmware.yml。
猫vmware.yml
server: vcsa.lab
port: 443
username: devuser
password: !vault |
$ANSIBLE_VAULT;1.1;AES256
62616231653730653366633966626531383362323165643034336533356165626166313466396462
3866363332663963366231636230646465363530666366320a346539343366663135353639646234
65363163386136636662356534343430663133313865333731336230373437663230356361373363
3434633132343731370a393139383464306432626638633837333030623539653462343230373562
6433
validate_certs: False
错误:
vmware_inventory.py) had an execution error: Unable to connect to ESXi server due to
(vim.fault.InvalidLogin) { dynamicType = , dynamicProperty = (vmodl.DynamicProperty) [], msg = 'Cannot complete login due to an incorrect
user name or password.', faultCause = , faultMessage = (vmodl.LocalizableMessage) [] }
试验B:按照这个
创建 ansible 保险库文件 (ansible-vault create ../group_vars/vmware/vault) 并添加为纯文本并在 vmware.yml
中读取该值
猫vmware.yml
server: vcsa.lab
port: 443
username: dev
password: "{{ vault_password}}"
validate_certs: False
仍然失败并出现同样的错误
Cannot complete login due to an incorrect user name or password.
但我可以 运行 使用纯文本执行相同的命令,而无需使用保险库加密密码。
环境:
ansible 2.7.0
python version = 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23:13) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
谁能帮忙找出问题所在?非常感谢您的帮助!
您是否尝试调试已加密的值。
下面的代码可以用来调试
ansible-vault encrypt_string password123 --name 'password'
New Vault Password: test
Confirm New Vault Password: test
--> Copy the generated string to the play as below
---
- name: test
hosts: localhost
vars:
password: !vault |
$ANSIBLE_VAULT;1.1;AES256
35366238333361633133643238666132353564393838306662316139663037666664316461366437
6434386663373838303766643034653832636363313237300a356533396138643531353434386564
66643239346365656631646335613764366136643137666533393031346238633363373662623964
3330396530633331640a626430666335303439653330646565616131376630373932653264386363
3239
tasks:
- name: debug password
debug:
msg: "{{ password }}"
--- 执行播放
ansible-playbook test2.yml --vault-id password@prompt
Vault password (password): test
如果我没看错的话,您在 group_vars 中使用了一个 vaulted 文件,并且您还在清单文件中定义了一些变量。如果是这种情况,在 ansible 中,清单文件变量的优先级高于 group_vars,并且您的 vaulted 变量有可能被 Inventory 中的值覆盖。 Here 是具有正确顺序的 link
最佳做法是始终将变量名称设置为唯一,这样您就不会 运行 陷入冲突的场景。
您可以通过使用调试任务查看该变量的值来进行故障排除。
ansible <name-of-your-target-host> -i vmware_inventory.py -m debug -a "msg={{ password }}"
您应该 运行 目标主机上的上述内容,以便 group_vars/host_vars 被考虑在内。
希望对您有所帮助!
我无法使用 VMware 动态清单文件从保管库读取机密。
库存:
https://github.com/ansible/ansible/blob/devel/contrib/inventory/vmware_inventory.ini(在我的 Ansible 目录结构中将其用作 vmware.yml)
https://github.com/ansible/ansible/blob/devel/contrib/inventory/vmware_inventory.py
更新了动态清单脚本中的几行 (vmware_inventory.py -#L213) 读取变量 -
'ini_path': os.path.join(os.path.dirname(__file__), '../group_vars/vmware/vmware.yml'),
Ansible 目录结构:
ansible/
inventory/
vmware_inventory.py
group_vars/
all_vars.yml
vmware/
vmware.yml
vault.yml
roles/
我可以 ping 通使用中的所有主机 - ansible all -i vmware_inventory.py -m ping
试用A:
使用 ansible-vault encrypt_string password123 --name 'password' --ask-vault-pass
加密密码值。使用加密密码更新 vmware.yml。
猫vmware.yml
server: vcsa.lab
port: 443
username: devuser
password: !vault |
$ANSIBLE_VAULT;1.1;AES256
62616231653730653366633966626531383362323165643034336533356165626166313466396462
3866363332663963366231636230646465363530666366320a346539343366663135353639646234
65363163386136636662356534343430663133313865333731336230373437663230356361373363
3434633132343731370a393139383464306432626638633837333030623539653462343230373562
6433
validate_certs: False
错误:
vmware_inventory.py) had an execution error: Unable to connect to ESXi server due to (vim.fault.InvalidLogin) { dynamicType = , dynamicProperty = (vmodl.DynamicProperty) [], msg = 'Cannot complete login due to an incorrect user name or password.', faultCause = , faultMessage = (vmodl.LocalizableMessage) [] }
试验B:按照这个
创建 ansible 保险库文件 (ansible-vault create ../group_vars/vmware/vault) 并添加为纯文本并在 vmware.yml
猫vmware.yml
server: vcsa.lab
port: 443
username: dev
password: "{{ vault_password}}"
validate_certs: False
仍然失败并出现同样的错误
Cannot complete login due to an incorrect user name or password.
但我可以 运行 使用纯文本执行相同的命令,而无需使用保险库加密密码。
环境:
ansible 2.7.0
python version = 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23:13) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
谁能帮忙找出问题所在?非常感谢您的帮助!
您是否尝试调试已加密的值。
下面的代码可以用来调试
ansible-vault encrypt_string password123 --name 'password'
New Vault Password: test
Confirm New Vault Password: test
--> Copy the generated string to the play as below
---
- name: test
hosts: localhost
vars:
password: !vault |
$ANSIBLE_VAULT;1.1;AES256
35366238333361633133643238666132353564393838306662316139663037666664316461366437
6434386663373838303766643034653832636363313237300a356533396138643531353434386564
66643239346365656631646335613764366136643137666533393031346238633363373662623964
3330396530633331640a626430666335303439653330646565616131376630373932653264386363
3239
tasks:
- name: debug password
debug:
msg: "{{ password }}"
--- 执行播放
ansible-playbook test2.yml --vault-id password@prompt
Vault password (password): test
如果我没看错的话,您在 group_vars 中使用了一个 vaulted 文件,并且您还在清单文件中定义了一些变量。如果是这种情况,在 ansible 中,清单文件变量的优先级高于 group_vars,并且您的 vaulted 变量有可能被 Inventory 中的值覆盖。 Here 是具有正确顺序的 link
最佳做法是始终将变量名称设置为唯一,这样您就不会 运行 陷入冲突的场景。
您可以通过使用调试任务查看该变量的值来进行故障排除。
ansible <name-of-your-target-host> -i vmware_inventory.py -m debug -a "msg={{ password }}"
您应该 运行 目标主机上的上述内容,以便 group_vars/host_vars 被考虑在内。
希望对您有所帮助!