如何将 ansible_become_pass 存储在保险库中以及如何使用它?
How to store ansible_become_pass in a vault and how to use it?
我是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>
这是我启动 playbook 时得到的结果:
$ 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, I have also read about the 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
的环境变量中;据我所知,没有办法在保险库中查找变量。
那么,我该如何组织我的文件,以便我能够从某个地方查找我的密码并安全地存储它们?
您需要创建一些 vaulted 变量文件,然后将它们包含在您的 playbook 或命令行中。
如果您将库存文件更改为使用一个变量作为 become pass,则可以存储此变量:
[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
使用您自己的相关设置设置库存后。这些设置假定您已经设置了一个 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
按如下方式简单存储您的远程服务器密码(不包括“<>”标签)
su_password: <myreallyspecialpassword>
密码现在将由保管库加密,查看密码的唯一方法是输入以下命令。
~/.ansible$ ansible-vault edit my_vault.yml
我们现在需要将 'my_vault.yml' 文件包含在我们的剧本中。我们可以通过使用 vars-files
来获取 su-password
的值来做到这一点。我们现在可以创建一个名为 ansible_become_pass
的变量,它将从我们的 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
因为我们每次想要运行这个剧本时都在使用保险库,所以我们需要使用以下命令。
ansible-playbook myawesome_playbook.yml --ask-vault-pass
解决这个问题的最好方法是使用host_vars。最简单的设置是将 ansible_become_pass
in Vault 加密文件放在相应的 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
编辑它。
在 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
调用。
我是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>
这是我启动 playbook 时得到的结果:
$ 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, I have also read about the 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
的环境变量中;据我所知,没有办法在保险库中查找变量。
那么,我该如何组织我的文件,以便我能够从某个地方查找我的密码并安全地存储它们?
您需要创建一些 vaulted 变量文件,然后将它们包含在您的 playbook 或命令行中。
如果您将库存文件更改为使用一个变量作为 become pass,则可以存储此变量:
[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
使用您自己的相关设置设置库存后。这些设置假定您已经设置了一个 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
按如下方式简单存储您的远程服务器密码(不包括“<>”标签)
su_password: <myreallyspecialpassword>
密码现在将由保管库加密,查看密码的唯一方法是输入以下命令。
~/.ansible$ ansible-vault edit my_vault.yml
我们现在需要将 'my_vault.yml' 文件包含在我们的剧本中。我们可以通过使用 vars-files
来获取 su-password
的值来做到这一点。我们现在可以创建一个名为 ansible_become_pass
的变量,它将从我们的 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
因为我们每次想要运行这个剧本时都在使用保险库,所以我们需要使用以下命令。
ansible-playbook myawesome_playbook.yml --ask-vault-pass
解决这个问题的最好方法是使用host_vars。最简单的设置是将 ansible_become_pass
in Vault 加密文件放在相应的 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
编辑它。
在 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
调用。