如何将 ansible_become_pass 存储在保管库中以及如何使用它?

问题描述 投票:0回答:3

我是 ansible 的新手,我正在使用一个非常简单的剧本在几台服务器上发出

sudo apt-get update
sudo apt-get upgrade

这是我正在使用的剧本:

---

- name: Update Servers
  hosts: my-servers
  become: yes
  become_user: root
  tasks:
    - name: update packages
      apt: update_cache=yes

    - name: upgrade packages
      apt: upgrade=dist

这是我的

~/.ansible/inventory/hosts
文件的摘录:

[my-servers]
san-francisco ansible_host=san-francisco ansible_ssh_user=user ansible_become_pass=<my_sudo_password_for_user_on_san-francisco>
san-diego     ansible_host=san-diego     ansible_ssh_user=user ansible_become_pass=<my_sudo_password_for_user_on_san-diego>

这就是我启动剧本后得到的结果:

$ ansible-playbook update-servers-playbook.yml                                                                                                                                     

PLAY [Update Servers] **********************************************************

TASK [setup] *******************************************************************
ok: [san-francisco]
ok: [san-diego]

TASK [update packages] *********************************************************
ok: [san-francisco]
ok: [san-diego]

TASK [upgrade packages] ********************************************************
ok: [san-francisco]
ok: [san-diego]

PLAY RECAP *********************************************************************
san-francisco              : ok=3    changed=0    unreachable=0    failed=0   
san-diego                  : ok=3    changed=0    unreachable=0    failed=0

令我困扰的是,我的用户

user
的密码以明文形式存储在我的
~/.ansible/inventory/hosts
文件中。

我已经阅读了vaults,我还阅读了变量和vaults的最佳实践,但我不明白如何将其应用到我的最小用例中。

我还尝试使用查找。虽然一般来说它们也在库存文件中工作,我可以做这样的事情:

[my-servers]
san-francisco ansible_host=san-francisco ansible_ssh_user=user ansible_become_pass="{{ lookup('env', 'ANSIBLE_BECOME_PASSWORD_SAN_FRANCISCO') }}"

在这种情况下,密码将存储在名为

ANSIBLE_BECOME_PASSWORD_SAN_FRANCISCO
的环境变量中;据我所知,无法在保险库中查找变量。

那么,我如何组织我的文件,以便能够从某处查找我的密码并安全存储它们?

security ansible ansible-vault
3个回答
44
投票

您需要创建一些保管的变量文件,然后将它们包含在您的剧本中或命令行中。

如果您更改清单文件以使用变量进行传递,则可以保存该变量:

[my-servers]
san-francisco ansible_host=san-francisco ansible_ssh_user=user ansible_become_pass='{{ sanfrancisco_become_pass }}'
san-diego     ansible_host=san-diego     ansible_ssh_user=user ansible_become_pass='{{ sandiego_become_pass }}'

然后使用

ansible-vault create vaulted_vars.yml
创建包含以下内容的保管文件:

sanfrancisco_become_pass: <my_sudo_password_for_user_on_san-francisco>
sandiego_become_pass    : <my_sudo_password_for_user_on_san-diego>

然后将保管文件作为额外变量包含在内,如下所示:

ansible-playbook -i ~/.ansible/inventory/hosts playbook.yml --ask-vault-pass -e@~/.ansible/inventory/vault_vars

或者通过 include_vars 任务将 vars 文件包含在您的 playbook 中:

- name        : include vaulted variables
  include_vars: ~/.ansible/inventory/vault_vars

15
投票

解决这个问题的最好方法是使用host_vars。最简单的设置是将 Vault 加密文件中的

ansible_become_pass
放入相应的 host_vars 目录中,如下所示:

myplaybook.yml
host_vars/onehost.com/crypted
host_vars/otherhost.com/crypted

crypted
文件中放置
ansible_become_pass
变量的赋值:

ansible_become_pass: SuperSecre3t

使用

ansible-vault create
创建文件,使用
ansible-vault edit
进行编辑。

按照 Ansible 文档中的建议,您需要为每个主机创建一个附加文件,用于从具有不同名称的加密变量中分配

ansible_become_passwd
。这样就可以在项目文件中搜索
ansible_become_passwd

myplaybook.yml
host_vars/onehost.com/plain
host_vars/onehost.com/crypted
host_vars/otherhost.com/plain
host_vars/otherhost.com/crypted

其中

plain
文件包含如下内容:

ansible_become_pass: "{{ vaulted_become_pass }}"

并且

crypted
文件设置
vaulted_become_pass
,如上所示。

所有

crypted
文件必须使用相同的密钥加密,并且
ansible-playbook
必须使用
--ask-vault-pass
调用。


7
投票

使用您自己的相关设置设置库存后。这些设置假设您已经设置了 rsa 密钥对来访问您的服务器。

您应该能够通过 ssh 连接到您的服务器:

ssh [email protected]

[local]
localhost    ansible_connection=local
  
[remote]
155.42.88.199   ansible_connection=ssh    ansible_user=remoteuser ansible_become_user=root ansible_become=yes  ansible_ssh_private_key_file=<private_key_file_path>

您需要将 root 密码存储在一个文件中(我将其命名为“my_vault.yml”)。您可以使用以下命令来执行此操作:

~/.ansible$ ansible-vault create my_vault.yml

简单存储您的远程服务器密码如下(不包含“<>”标签)

su_password: <myreallyspecialpassword> 

密码现在将由保管库加密,查看密码的唯一方法是输入以下命令。

~/.ansible$ ansible-vault edit my_vault.yml

我们现在需要将“my_vault.yml”文件包含在我们的剧本中。我们可以通过使用

vars-files
来获取
su-password
的值来做到这一点。我们现在可以创建一个名为
ansible_become_pass
的 var,它将传递来自
my_vault.yml
文件的值,这将允许我们的远程用户在服务器上 su 一次。

---
- name: My Awesome Playbook
  hosts: remote
  become: yes

  vars_files:
    - ~/.ansible/my_vault.yml 

  vars:
    ansible_become_pass: '{{ su_password }}'

  roles:
      - some_awesome_role

由于我们每次想要运行此剧本时都使用Vault,因此我们需要使用以下命令。

ansible-playbook myawesome_playbook.yml --ask-vault-pass
© www.soinside.com 2019 - 2024. All rights reserved.