【问题标题】:Ansible - dynamically prompt vault password when neededAnsible - 需要时动态提示保管库密码
【发布时间】:2017-12-04 15:13:17
【问题描述】:

上下文

在我的公司,我们有一个共享存储库,其中包含用于服务器的 ansible 脚本。我想在不久的将来引入保险库变量来处理服务密码。目前,我们在剧本的开头使用加密的密码提示。这个解决方案很烦人(它在某些剧本上要求 3 个密码)。

需要

由于我们的大多数 ansible 用户都不是专家,我希望他们能够顺利运行 playbook。这意味着ansible-playbook 命令应该很短,并且可以在没有任何强制参数的情况下工作(例如,没有--ask-sudo-pass 等等)。这也意味着我更喜欢仅在需要时才在剧本开头提示输入保险库密码。 此外,我不想使用 ansible 密码文件,因为它不容易共享,而且我不喜欢在我们所有的 ansible 用户计算机上都有一个明文密码文件的想法。

问题

为每个相关的剧本添加--ask-vault-pass 不是一种选择。我们的 ansible 用户不会理解为什么有时需要这个参数,而有时又不需要。相反,为每个 playbook 询问 vault 密码是一种负担,因为我们有很多 playbook,而且每次都要求 sudo 密码。

我尝试使用prompts 和各种选项来实现以下解决方案。似乎没有任何效果。文档没有解释如何做到这一点:

最好的解决方案(根据我)

让我们看看这个main.yml 文件:

- import_tasks: foo.yml
  tags: always

- import_tasks: bar.yml
  tags: bar

# Only this tasks uses a vault encrypted variable
- import_tasks: baz.yml
  tags: [baz, vault]

现在,有一个playbook.yml,正在导入这个main.yml 文件。

在一个完美的世界里,我希望这样:

例子1:

ansible-playbook -i prod playbook.yml

Vault password:

例子2:

ansible-playbook -i prod playbook.yml --tags baz

Vault password:

例子3:

ansible-playbook -i prod playbook.yml --tags foo

# it runs without asking for vault password, because no tasks needing vault
# password will be run

问题

如何将 ansible 配置为仅在需要时询问保险库密码(意思是:每次遇到保险库加密变量时)?甚至可能吗?如果不是,考虑到我的情况,什么解决方法是可行的?

谢谢。

【问题讨论】:

    标签: ansible ansible-2.x


    【解决方案1】:

    我找到了解决方法。

    我们的想法是始终从 ansible vault 文件加载所有密码(包括 sudo),只需要每个 playbook 的 vault 密码。这意味着所有机器都应该有相同的部署者用户密码。这比以前更简单,因为有一个主密码(保险库密码)来控制所有这些。

    它是这样完成的:

    ansible.cfg:

    [privilege_escalation]
    become_ask_pass = False
    become = True
    
    [defaults]
    ask_vault_pass = True
    

    vars/vault/环境

    _vault:
      sudo: !vault |
            $ANSIBLE_VAULT;1.1;AES256
            BLAHBLAHBLAH
      another_pass: !vault |
                    $ANSIBLE_VAULT;1.1;AES256
                    ANOTHERENCRYPTEDPASSWORD
    

    对于每个剧本:

    # Playbook stuff
    # [...]
    
    vars:
      ansible_become_pass: "{{ _vault.sudo }}"
    vars_files:
      # env var is set dynamically in inventory file, so I can have different password per env.
      # If the file is not found, it loads an empty null file
      - [ "vars/vault/{{ env }}", "vars/null"]
    
    # [...] Loading other var files
    

    现在,一个简单的ansible-playbook -i env/prod myPlayBook.yml 只会询问保管库密码,不会提示输入 sudo 或其他任何内容。一致且易于共享(只需共享加密的密码文件和保管库密码)。

    【讨论】:

      猜你喜欢
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多