#Ansible

#Debian

Ansible password_hash Filter Error "Unexpected templating type error occurred on / expected string or bytes-like object, got 'AnsibleVaultEncryptedUnicode'"

Bei der Verwendung des Ansible password_hash Filters bin ich in der Kombination mit ansible-vault encrypt_string auf einen Fehler gestoßen, der anscheinend ein Ansible Bug ist.

Der Fehler tritt nur auf, wenn man die Input Variablen für den password_hash Filter mit ansible-vault encrypt_string im Variablen File verschlüsselt. Wenn die Variablen im Klartext gespeichert oder das ganze Variablen File mit ansible-vault encrypt verschlüsselt ist, tritt der Fehler nicht auf.

Group Vars File mit ansible-vault encrypt_string Feldern und password_hash Fehler

encrypted_password: !vault |
  $ANSIBLE_VAULT;1.1;AES256
  33613566396665383038343939376263633637646666336332623131343139323432323834343939
  3337303834316135383738613032643330616463303333340a653230386233636161373633363531
  62393035613861333462636564366633316366656336626237353930636536626534396566656231
  6463323333303338350a336634636130363432363533393634353363306530616263623061306533
  3163

encrypted_salt: !vault |
  $ANSIBLE_VAULT;1.1;AES256
  66343832623566393831333138323161376361353139646465393838626137623034613161656162
  6231666638356132326263376161333133656433376636330a353138626139663434333434666138
  62663462663032363239303733663534626363373838646239373463626230333966666661313733
  6338373465303135310a323138653065316435613035613639616362393737663063646333636565
  3861

Task der den Fehler erzeugt:

- name: encrypted password, encrypted salt 
      debug:
        msg: "{{ encrypted_password | password_hash('sha512', encrypted_salt ) }}"

Fehlermeldung:

TASK [encrypted password, encrypted salt] ******************************************************************************
fatal: [localhost]: FAILED! => {"msg": "Unexpected templating type error occurred on ({{ encrypted_password | password_hash('sha512', encrypted_salt ) }}): secret must be unicode or bytes, not ansible.parsing.yaml.objects.AnsibleVaultEncryptedUnicode. secret must be unicode or bytes, not ansible.parsing.yaml.objects.AnsibleVaultEncryptedUnicode"}

Der Fehler tritt auch auf wenn, die python3-passlib, wie von Ansible empfohlen, installiert ist. Sie wird bei Debian Bookworm nicht automatisch mit installiert wenn man Ansible installiert.

Workaround mit String Filter

Da Ansible sich anscheinend am Typ der übergebenen Werte stört, kann man diese in Strings umwandeln.

 - name: workaround for encrypted password, encrypted salt with crypt module
      debug:
        msg: "{{ (encrypted_password | string) | password_hash('sha512', (encrypted_salt | string)) }}"

Damit wird der Fehler umgangen und das Playbook läuft durch.

TASK [workaround for encrypted password, encrypted salt with crypt module] *********************************************
ok: [localhost] => {
    "msg": "$6$rounds=656000$salt12345$DFMarRCWSXSxndha2VBuDFGtPLyWjJlCl72HIY/ywi6nw/MhsiVjWcBcfjjEGz03DZzKBQj5ACvBc7uowD1LM/"
}