无法在Ansible中检索文件库机密

时间:2019-01-03 23:35:07

标签: ansible ansible-inventory

我无法使用VMware动态清单文件从Vault中读取机密。

库存:
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/
  inventory/
    vmware_inventory.py
  group_vars/
    all_vars.yml                 
    vmware/
     vmware.yml
     vault.yml                    
  roles/

我可以使用-ansible all -i vmware_inventory.py -m ping

对所有主机执行ping操作

试验A:
使用ansible-vault encrypt_string password123 --name 'password' --ask-vault-pass加密密码值。使用加密的密码更新vmware.yml。

cat 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)执行错误:由于以下原因,无法连接到ESXi服务器:   (vim.fault.InvalidLogin){dynamicType =,dynamicProperty =(vmodl.DynamicProperty)[],msg ='由于不正确而无法完成登录   用户名或密码。',faultCause =,faultMessage =(vmodl.LocalizableMessage)[]}

试验B:遵循link
创建一个Ansible保管库文件(ansible-vault创建../group_vars/vmware/vault),并添加为纯文本并在vmware.yml中读取该值

cat vmware.yml

server: vcsa.lab
port: 443
username: dev
password: "{{ vault_password}}"
validate_certs: False

仍然失败,并显示相同的错误

  

由于用户名或密码错误,无法完成登录。

但是我可以使用纯文本运行相同的命令,而无需使用Vault加密密码。

Env:

 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)]

任何人都可以帮助找到问题所在?非常感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您是否尝试调试已加密的值。

下面的代码可用于调试。

    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

答案 1 :(得分:0)

如果我没看错的话,说明您正在使用group_vars中的文件库,并且清单文件中还定义了一些变量。如果是这种情况,则在Ansible中,清单文件var优先于group_vars以上,并且您的保管变量可能会被Inventory中的值覆盖。 enter image description here是具有正确顺序的链接

最佳做法是始终将变量名设置为唯一,以免遇到冲突的情况。

您可以通过使用调试任务来查看该var的值进行故障排除。

ansible <name-of-your-target-host> -i vmware_inventory.py -m debug -a "msg={{ password }}"

您应该在目标主机上运行以上命令,以便将group_vars / host_vars考虑在内。

希望有帮助!