运行 Jenkins 中的 Ansible 剧本解密失败

Running Ansible playbooks in Jenkins fails decryption

在我的开发机器上一切正常。只是当 Jenkins 尝试 运行 与保险库加密文件关联的剧本时,我看到错误:

ERROR! Decryption failed on /data/jenkins/workspace/.../secrets.yml 
FATAL: command execution failed hudson.AbortException: Ansible playbook execution failed

从 Jenkins 作业执行的命令是:

/usr/bin/ansible-playbook playbook.yml -i prod/inventory -l localhost -s -f 1 --vault-password-file /etc/ansible/vault_password

保管库密码文件已确认存在于具有以下权限的位置:

-rw-r--r--. 1 root root 35 Dec 18 13:23 /etc/ansible/vault_password

如果我 运行 执行相同的命令但要求输入密码(交互式),则一切 运行 都可以。然而,这不是理想的工作流程:我希望 Jenkins 运行 这些剧本完全独立,无需用户交互。

我应该提一下,该剧本旨在 运行 本地任务,主要是为 Maven 测试准备环境(创建预期的资源,例如属性文件)。

事实证明,创建包含内容的文件和复制包含内容的文件之间存在巨大差异,即使最终结果是具有相同内容的文件。

让我解释一下:我的配置手册一直在通过将密码写入远程计算机上的文件来创建我的密码文件,如下所示:

copy: content="{{ ansibl_vault_password }}", dest="{{ ansibl_vault_password_file }}"

我所做的更改是将密码文件从我的机器复制到远程机器,如下所示:

  copy:
    src: "{{ ansibl_vault_password_file }}"
    dest: "{{ ansibl_vault_password_file }}"
    mode: "u=rw,g=r,o=r"

所以即使在宏伟的计划中我最终得到了一个包含第一行密码的文件,早期的方法仍然无法解密内容,而第二种方法工作得很好。