使用Gitlab CI从Ansible部署,处理密码

8
我正在尝试使用Gitlab CI和Ansible实现“无密码”部署工作流程。一些步骤确实需要密码(我已经尽可能使用SSH密钥),因此我将这些密码存储在Ansible Vault中。接下来,运行playbook时,我只需要提供Vault密码即可。
但是如何将其与Gitlab CI良好地集成呢?我可以注册一个gitlab-ci任务(或适合于构建的任务?),它仅以某种方式提供保险库密码运行playbook!是否可以在纯文本中没有密码的情况下实现这一点?!
此外,如果有人能指出如何使用Ansible部署构建的材料,我会非常高兴。正如您所注意到的,我绝对找不到任何相关内容。

这是一个自托管的GitLab Runner吗?如果是,只需使用GitLab Runner用户的SSH密钥(或设置它们)。 - Rufinus
2个回答

11

您可以在GitLab CI中设置一个环境变量,用于保存Ansible Vault密码。在我的示例中,我将其命名为$ANSIBLE_VAULT_PASSWORD

以下是.gitlab-ci.yml的示例:

deploy:
  only:
    - master
  script:
    - echo $ANSIBLE_VAULT_PASSWORD > .vault_password.txt
    - ansible-playbook -i ansible/staging.yml --vault-password-file .vault_password.txt

希望这个技巧能对你有所帮助。

我喜欢那个答案,但是在CI中使用环境变量的值是否相同呢?如果担心保护问题,最终密码是以明文还是不带密码结束? - Diego
这种方法的一个缺点(我猜测)是Gitlab本身不会掩盖gitlab-vault中的密码?因此,我们想要保密的值很容易被暴露。 - Fredrik

1
我不是很熟悉gitlab ci或ansible vault,但我更喜欢的策略是创建一个单一、隔离、安全和持久的地方来存放你的密码或其他机密信息,例如私有的s3 bucket。然后,明确授权你的构建机器或构建集群访问该安全位置。当然,你还需要确保你的构建机器或集群也被锁定,例如在不可公开访问且只能通过vpn或其他非常安全的方式访问的vpc中。
这个想法是给需要你的密码的机器明确的知道在哪里获取它,并分别给予它们获取密码所需的权限和访问权限。前者不必是秘密(因此可以存在于源代码控制中),但后者几乎不可能在不损害整个系统的情况下获得,此时你已经完蛋了。
更具体地说,运行ansible的机器可以在安全集群内部。它知道如何访问密码,并且有权限这样做。因此,它可以简单地获取密码,将其存储为变量,并在运行过程中使用它来访问安全资源。您需要小心不要在此过程中泄露密码(例如通过将ansible日志与密码传输到集群外的某个地方,甚至是任何地方)。如果您想从集群外部启动ansible脚本,则需要通过VPN连接到远程计算机上运行ansible剧本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接