0

在我的开发机器上,一切都很好。只是当 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 测试准备环境(创建预期的资源,例如属性文件)。

4

1 回答 1

0

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

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

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"

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

于 2017-01-04T09:46:07.827 回答