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

时间:2016-05-18 10:44:13

标签: security ansible ansible-vault

我是ansible的新手,我使用一个非常简单的剧本在几台服务器上发布sudo apt-get updatesudo 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的内容,我还阅读了best practices for variables and vaults,但我不明白如何将其应用于我的极少用例。

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

[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的环境变量中;据我所知,没有办法在保险库中查找变量。

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

3 个答案:

答案 0 :(得分:17)

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

如果您更改您的库存文件以使用变量作为成为传递,则此变量可以是存储的:

[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文件:

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

答案 1 :(得分:2)

使用您自己的相关设置设置广告资源后。这些设置假设您已设置rsa密钥对来访问您的服务器。您应该能够使用ssh remoteuser@155.42.88.199

进入服务器
[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

如下所示简单存储您的远程服务器密码(不包括'&lt;&gt;'标记)

su_password: <myreallyspecialpassword> 

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

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

我们现在需要在我们的剧本中加入'my_vault.yml'文件。我们可以使用vars-files来获取su-password的值。我们现在可以创建一个名为ansible_become_pass的var,它将从我们的my_vault.yml文件中传递值,这将允许我们的remoteuser在服务器上进行一次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

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

ansible-playbook myawesome_playbook.yml --ask-vault-pass

答案 2 :(得分:0)

解决此问题的最佳方法是使用host_vars。最简单的设置是将ansible_become_pass放入相应host_vars目录中的Vault加密文件中,如下所示:

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编辑文件。

advice in the Ansible docs之后,您需要为每个主机创建一个附加文件,该文件从具有不同名称的加密变量中分配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进行调用。