Ansible Vault参考教程

时间:2020-02-23 14:29:38  来源:igfitidea点击:

如何使用Ansible Vault加密敏感数据?
,如何使用Vault保护Ansible PlayBook?
,如何在我的项目上使用Ansible Vault ?.本教程已作为使用拱顶的Ansible爱好者的参考教程/速查表,以确保在ansible项目上工作时加密和安全。

已被证明是所有类的开发人员和Sysadmins的最常用和喜爱的配置管理工具。
通过更多的采用,产生安全问题。
为了保持我们需要保险库的密码或者私钥等敏感信息。
Vault加密数据在运行时自动解密。

Ansible是本教程的要求。
确保系统上安装了Ansible,它提供了我们在整个教程中使用的Ansible-Vault命令行工具。
在开始之前,请为Ansible Vault设置一个默认编辑器。

--- For Bash --
$echo "export EDITOR=vim" >> ~/.bashrc
$source ~/.bashrc
--- For Zsh --
$echo "export EDITOR=vim" >> ~/.zshrc
$source ~/.zshrc

代替 vim用你最喜欢的编辑。

第1步:安装Ansible/Ansible Vault

在Linux上安装Ansible和大多数UNIX系统的最简单方法是通过Ansible Package Manager - PIP。

安装pip:

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py --user

一旦安装了PIP,请使用它来安装Ansible。

pip install --user ansible

第2步:使用Ansible Vault

在本节中,我们将看到许多关于如何使用Ansible Vault的示例。
ansible-vault命令用于管理Ansible中的加密内容。
使用它,我们可以创建,编辑,查看和解密加密文件。

示例1:创建新的加密文件

要创建使用Vault加密的新文件,请使用"创建"选项并追加文件的名称。
例如,要创建名为create_users.yml的加密yaml文件,它将包含敏感数据,运行:

$ansible-vault create create_users.yml

系统将提示我们输入并确认安全密码:

New Vault password: 
Confirm New Vault password:

然后,Ansible将打开一个编辑窗口,供我们输入所需的内容。

示例2:加密现有文件

对于现有文件,请使用ansible-vault encypt命令设置密码。

$echo "SecurePassword" > passwords.txt
$ansible-vault encrypt passwords.txt
New Vault password: 
Confirm New Vault password: 
Encryption successful

这将替换加密的未加密文件。

$cat passwords.txt
$ANSIBLE_VAULT;1.1;AES256
30653331363933343563396461623132623437636232373462646538333736666531333732353033
3134666133626361623330376534336632633462643233650a386137626561663938313463396236
63376166313530636461306636623638623835666263326431646333663665313563373766643039
6337393539396562360a643237346262353461303738663134383739366532613538653635383466
3634

示例3:编辑加密文件

要编辑加密文件,请使用命令ansible-vault编辑命令。

$ansible-vault edit passwords.yml

这将要求我们输入文件密码。

Vault password:

示例4:更新加密密码

我们可以始终使用Ansible-Vault rekey命令更新加密密码。

$ansible-vault rekey create_users.yml
Vault password: 
New Vault password: 
Confirm New Vault password: 
Rekey successful

出现提示时输入旧密码和新密码和新密码。
更新后,将使用新密码访问该文件。

示例5:查看Ansible加密文件

我们可以在不打开窗口编辑器的情况下查看Vault加密文件的内容。
为此,我们将使用命令Ansible-Vault视图。

$ansible-vault view create_users.yml

在可以显示内容之前,应要求我们要求输入文件密码。

Vault password:
Secret information

示例6:解密Vault加密文件

如果我们不再需要加密,则可以使用Ansible-Vault Decrypt命令解密Vault加密文件。

$ansible-vault decrypt myfile.yml

为文件提供加密密码。

Vault password:
Decryption successful

在解密后,我们将能够看到文件的实际内容。

示例7:使用Vault加密文件执行Ansible

一旦加密敏感数据,我们显然希望运行一个Ansible PlayBook,以某种方式引用加密数据。
如果提供了正确的密码,Ansible和Ansible-PlayBook命令可以解密保管库受保护的文件。

使用密码提示

对于PlayBook执行,通过 --ask-vault-pass旗帜。

$ansible-playbook --ask-vault-pass <vault-encrypted-playbook-file>.yaml

对于ansible大于或者等于2.4,我们可以使用-vault-id @prompt标志。

请参见下面的示例。

$ansible-playbook --ask-vault-pass -i hosts osp-pre.yml 
Vault password: 
PLAY [Run presetup on OSP nodes] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
TASK [Gathering Facts] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **
...................................................................................

或者

$ansible-playbook -i hosts osp-pre.yml --vault-id @prompt
Vault password (default):

使用密码文件

如果要在Playbook执行期间避免交互式密码提示,请考虑使用密码文件的Ansible Vault。

创建密码文件。

$echo 'MyStrongVaulPassword' > .ansible_vault_pass

对于使用诸如Git等版本控制系统的人,请考虑将.Ansible_Vault_pass文件添加到忽略文件列表中。

$echo '.ansible_vault_pass' >> .gitignore

现在正在引用ansible或者ansible-playbook命令时的引用密码文件。

$ansible --vault-password-file=.ansible_vault_pass ...
$ansible-playbook --vault-password-file=.ansible_vault_pass ....

例子:

$ansible-playbook --vault-password-file=.ansible_vault_pass -i hosts osp-pre.yml 
PLAY [Run presetup on OSP nodes] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
TASK [Gathering Facts] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **

如上所述,输入密码文件没有提示。

设置ansible_vault_password_file环境变量

如果不喜欢提供密码标志或者使用交互式密码提示,则可以配置ASSIBLE以自动读取密码文件。
这是通过将ansible_vault_password_file环境变量与密码文件的路径设置:

export ANSIBLE_VAULT_PASSWORD_FILE=./.ansible_vault_pass

要持续配置,请将其设置为本地Ansible.cfg文件。

$vim ansible.cfg
[defaults]
........
vault_password_file = ./.ansible_vault_pass

Ansible将使用所有加密和创建操作的配置密码。

示例8:仅加密敏感变量

在具有协作的理想自动化世界中,我们只需要加密敏感数据,如数据库密码,API键,用户凭据等

创建加密变量文件。

$vim vars/vault.yml
vault_db_pass: MyStrongPassword
$ansible-vault encrypt vars/vault.yml
New Vault password: 
Confirm New Vault password: 
Encryption successful

确认它是加密的。

$cat vars/vault.yml 
$ANSIBLE_VAULT;1.1;AES256
62383961353832333263356333356465633635633731393039303834623832626162613235343930
6238663730366237616639326233393361626639616136300a393665326434633438613436316630
61656261616132366436646434393833613064326531346631666630616535663535353038666135
3732333338313739340a656434633336666662393161393663303662616264643364313630383163
30643763323038396161316339663037353632626462626233363836346461656238393035623533
6531353930326133656165326130303661303965316464306330

然后,我们将定义在Vault变量中加密的其他未加密的变量和引用。

$vim vars/plain.yml
db_user: theitroad
db_port: 3306
db_pass: "{{ vault_db_pass }}"

请注意,我们使用Jinja2模板引用保管库中定义的变量。

创建PlayBook文件。

$vim vault.yml 
--
- name: Create users
  hosts: localhost
  tasks:
    - name: Include vars
      include_vars:
        dir: vars
    - name: Generate dummy variables data
      blockinfile:
        path: /tmp/vault
        block:
            Database user: "{{ db_user }}"
            Database Port: "{{ db_port }}"
            Database Password: "{{ db_pass }}"

运行PlayBook:

$ansible-playbook --connection=local vault.yml --ask-vault-pass
Vault password: 
PLAY [Create users] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
TASK [Gathering Facts] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **
ok: [localhost]
TASK [Include vars] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost]
TASK [Generate dummy variables data] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
changed: [localhost]
PLAY RECAP ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **
localhost                  : ok=3    changed=1    unreachable=0    failed=0

让我们检查创建文件的内容。

$cat /tmp/vault
# BEGIN ANSIBLE MANAGED BLOCK
Database user: "theitroad"
Database Port: "3306"
Database Password: "MyStrongPassword"
# END ANSIBLE MANAGED BLOCK