如何判断SSH密钥文件是否被Ansible Vault加密?
问题分析与解决
核心问题1:ansible_vault测试报错
ansible_vault是Ansible旧版本中的测试名称,新版本已将其更名为ansible.builtin.vault_encrypted,直接使用旧名称会触发加载失败错误,你替换为ansible.builtin.vault_encrypted的操作是正确的。
核心问题2:测试结果全为false的原因
你在变量thisistrue中使用的"$ANSIBLE_VAULT;1.2;AES256;dev...."是截断的示例字符串,而ansible.builtin.vault_encrypted测试要求输入完整的、符合Ansible Vault加密格式的字符串,不能用省略号替代加密内容。
另外需要明确:ansible.builtin.vault_encrypted仅用于检测被Ansible Vault加密的内容,和SSH私钥自身的密码保护(比如带passphrase的id_rsa,用OpenSSL加密)是完全不同的格式。如果你的真实需求是判断SSH密钥是否被密码加密,需要用其他方法。
正确示例(检测Ansible Vault加密内容)
如果确实需要检测Ansible Vault加密的字符串,先通过ansible-vault encrypt_string生成测试用的真实加密内容,再进行测试:
# site4.yml - name: test vault encrypted check hosts: localhost gather_facts: no vars: # 用ansible-vault encrypt_string "secret"生成的真实加密内容 vault_encrypted_str: | $ANSIBLE_VAULT;1.2;AES256;dev 32313036333236383336353038373438363433363730393735373835383337353639323030333432 3137343830353036353335313835313237343638373334350a3137383232303930333730363835 383035333730303232383936323938303638333531373532303539383030353736323837353736 3734353134303836380a3833323136373730303235393135363431373934313939363937393834 353735323639373438343937323336363231373632303534303637323334303335353130303235 323437363438383230373535373039383535373139333038313534363638333233373635383734 303534383435373835343330343736333936353533303637 plain_str: "any string" is_vault_encrypted: '{{ vault_encrypted_str is ansible.builtin.vault_encrypted }}' is_not_vault: '{{ plain_str is ansible.builtin.vault_encrypted }}' tasks: - name: show vault encrypted check result ansible.builtin.debug: var: is_vault_encrypted - name: show plain string check result ansible.builtin.debug: var: is_not_vault
执行后会得到正确结果:
ok: [localhost] => is_vault_encrypted: true ok: [localhost] => is_not_vault: false
如果需要检测SSH私钥是否被密码加密
如果你的真实需求是判断SSH私钥(比如id_rsa)是否被passphrase保护,可以通过检查文件内容中是否包含Proc-Type: 4,ENCRYPTED字段实现:
- name: check if SSH key is encrypted hosts: localhost gather_facts: no tasks: - name: read SSH private key content ansible.builtin.slurp: src: ~/.ssh/id_rsa register: ssh_key_content - name: check for encryption marker ansible.builtin.set_fact: ssh_key_encrypted: '{{ "Proc-Type: 4,ENCRYPTED" in ssh_key_content.content | b64decode }}' - name: show result ansible.builtin.debug: var: ssh_key_encrypted
内容的提问来源于stack exchange,提问作者rustyshamrock
相关产品推荐
相关产品推荐

