7

我正在尝试使用 Gitlab CI 和 Ansible 实现“无密码”部署工作流程。有些步骤确实需要密码(我已经在尽可能使用 SSH 密钥)所以我将这些密码存储在Ansible Vault中。接下来,我只需要在运行 playbook 时提供 Vault 密码。

但是我怎样才能很好地将它与 Gitlab CI 集成呢?

我可以注册一个 gitlab-ci 作业(或者作业仅适用于构建?),它只是运行以某种方式提供保险库密码的剧本?!这可以在没有密码的情况下以纯文本形式实现吗?!

另外,如果有人能指出一些材料来展示我们如何使用 Ansible 部署构建,我会非常高兴。如您所见,我确实对此一无所知。

4

2 回答 2

8

你可以在 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

希望这个技巧能帮到你。

于 2017-07-31T17:07:25.653 回答
1

我对 gitlab ci 或 ansible vault 不是很熟悉,但是对于这种情况,我更喜欢的一种策略是创建一个单独的、隔离的、安全的、持久的地方,你的密码或其他秘密存在。例如,私有 s3 存储桶。然后,让您的构建盒或构建集群显式访问该安全位置。当然,您随后需要确保您的构建盒或集群也被锁定,例如在不可公开访问且只能通过 vpn 或其他非常安全的方式访问的 vpc 中。

这个想法是让需要密码的机器明确知道从哪里获取密码,并分别获得他们需要的权限和访问权限。前者不必是秘密(因此它可以存在于源代码控制中),但后者实际上是不可能在不损害整个系统的情况下实现的,此时无论如何你已经筋疲力尽了。

因此,更具体地说,运行 ansible 的机器可能位于安全集群内。它知道如何访问密码。它有权这样做。因此,它可以简单地获取密码,存储为变量,并在运行时使用它来访问安全资源。您需要注意不要在此过程中泄漏密码(例如将带有 pw 的 ansible 日志传送到集群外部的某个地方,甚至可能是任何地方)。如果你想从集群外部启动 ansible 脚本,那么你可以 vpn in 在远程机器上运行 ansible playbook。

于 2015-09-16T07:20:56.853 回答