管理机密


文章目录

  • 管理机密
  • 1. Ansible Vault
  • 2. 创建加密的文件,并查看
  • 3. 编辑现有的加密文件
  • 4. 加密现有的文件
  • 5. 解密现有的文件
  • 6. 更改加密文件的密码
  • 7. playbook和ansible vault
  • 8. 变量文件管理的推荐做法
  • 9. yml语言


1. Ansible Vault

  • Ansible提供的Ansible Vault可以加密和解密任何由Ansible使用的结构化数据文件。
  • 若要使用Ansible Vault,可通过一个名为ansible-vault的命令行工具创建、编辑、加密、解密和查看文件。
  • Ansible Vault可以加密任何由Ansible使用的结构化数据文件。这可能包括清单变量、playbook中含有的变量文件、在执行playbook时作为参数传递的变量文件,或者Ansible角色中定义的变量。

2. 创建加密的文件,并查看

[root@129a ~]# cd /opt/httpd/
[root@129a httpd]# ls
ansible.cfg  group_vars  install.yml  test.yml  web
files        host_vars   inventory    vars
[root@129a httpd]# cd vars/
[root@129a vars]# ls
httpd
//1.创建加密文件
[root@129a vars]# ansible-vault create 123
New Vault password: 
Confirm New Vault password: 
[root@129a vars]# ll
total 8
-rw-------. 1 root root 419 Jun  1 09:53 123
-rw-r--r--. 1 root root  71 May 29 23:59 httpd
//2.查看加密文件,自己输入密码
[root@129a vars]# ansible-vault view 123
Vault password: 
name: httpd
port: 80
[root@129a vars]# 
//3.可以用vault密码文件来存储vault密码,而不是通过标准输入途径输入vault密码。这样做需要使用文件权限和其他方式来严密保护该文件。
[root@129a httpd]# vim .passwd
[root@129a httpd]# cat .passwd 
123456
[root@129a httpd]# ansible-vault view --vault-password-file .passwd vars/123 
name: httpd
port: 80
[root@129a httpd]#

3. 编辑现有的加密文件

  • 要编辑现有的加密文件,Ansible Vault提供了ansible-vault edit filename命令。此命令将文件解密为一个临时文件,并允许编辑。保存时,它将复制其内容并删除临时文件。
[root@129a httpd]# ansible-vault edit vars/123 
Vault password: 
[root@129a httpd]# ansible-vault view --vault-password-file .passwd vars/123 
name: httpd
port: 81
[root@129a httpd]#
  • edit子命令始终重写文件,因此只应在进行更改时使用它。要查看文件的内容而不进行更改时,应使用view子命令

4. 加密现有的文件

[root@129a httpd]# ansible-vault encrypt vars/httpd 
New Vault password: 
Confirm New Vault password: 
Encryption successful
[root@129a httpd]# ansible-vault view vars/httpd 
Vault password: 
lamp:
  pkg:
    web: httpd
    database: mariadb
    application: php

5. 解密现有的文件

[root@129a httpd]# ansible-vault decrypt vars/123 
Vault password: 
Decryption successful
[root@129a httpd]# cat vars/123 
name: httpd
port: 81
[root@129a httpd]#

6. 更改加密文件的密码

[root@129a httpd]# ansible-vault view --vault-password-file .passwd vars/httpd 
ERROR! Decryption failed (no vault secrets were found that could decrypt) on vars/httpd for vars/httpd
[root@129a httpd]# ansible-vault rekey vars/httpd 
Vault password: 
New Vault password: 
Confirm New Vault password: 
Rekey successful
[root@129a httpd]# ansible-vault view --vault-password-file .passwd vars/httpd 
lamp:
  pkg:
    web: httpd
    database: mariadb
    application: php
[root@129a httpd]# 

在使用vault密码文件时,请使用--new-vault-password-file选项
[root@129a httpd]# vim .httpd
[root@129a httpd]# cat .httpd
123123
[root@129a httpd]# 

[root@129a httpd]# ansible-vault rekey --new-vault-password-file .httpd vars/httpd 
Vault password: 
Rekey successful
[root@129a httpd]# 

[root@129a httpd]# ansible-vault view --vault-password-file .httpd vars/httpd 
lamp:
  pkg:
    web: httpd
    database: mariadb
    application: php
[root@129a httpd]#

7. playbook和ansible vault

  • 要为playbook提供vault密码,可使用–vault-id选项。例如,要以交互方式提供vault密码
[root@129a httpd]# ansible-playbook -C --vault-id @prompt install.yml 
Vault password (default): 

PLAY [webservers] **************************************************************

TASK [Gathering Facts] *********************************************************
ok: [130h]

[root@129a httpd]# ansible-playbook -C --vault-id @prompt install.yml 
Vault password (default): 

PLAY [webservers] **************************************************************

TASK [Gathering Facts] *********************************************************
ok: [130h]

TASK [Delete the yum source] ***************************************************
changed: [130h]

TASK [Provide the yum source file] *********************************************
ok: [130h]

TASK [install apache] **********************************************************
ok: [130h]

TASK [Provides web site] *******************************************************
ok: [130h]

TASK [config apache] ***********************************************************
ok: [130h]

TASK [run httpd] ***************************************************************
ok: [130h]

TASK [close firewalld] *********************************************************
ok: [130h]

PLAY RECAP *********************************************************************
130h                       : ok=8    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@129a httpd]#
  • 也可使用–vault-password-file选项指定以纯文本存储加密密码的文件。密码应当在该文件中存储为一行字符串。由于该文件包含敏感的纯文本密码,因此务必要通过文件权限和其他安全措施对其加以保护。
[root@129a httpd]# ansible-playbook -C --vault-password-file .httpd install.yml 

PLAY [webservers] **************************************************************

TASK [Gathering Facts] *********************************************************
ok: [130h]

TASK [Delete the yum source] ***************************************************
changed: [130h]

TASK [Provide the yum source file] *********************************************
ok: [130h]

TASK [install apache] **********************************************************
ok: [130h]

TASK [Provides web site] *******************************************************
ok: [130h]

TASK [config apache] ***********************************************************
ok: [130h]

TASK [run httpd] ***************************************************************
ok: [130h]

TASK [close firewalld] *********************************************************
ok: [130h]

PLAY RECAP *********************************************************************
130h                       : ok=8    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@129a httpd]# 

环境变量
export ANSIBLE_VAULT_PASSWORD_FILE=/opt/httpd/.httpd
ansible-playbook install.yml


[root@129a httpd]# ansible-vault create vars/port
New Vault password: 
Confirm New Vault password: 
[root@129a httpd]# ansible-vault view vars/port 
Vault password: 
port: 82
[root@129a httpd]# 
[root@129a httpd]# ansible-playbook --vault-id one@prompt --vault-id two@prompt install.yml 
Vault password (one): 
Vault password (two): 

PLAY [webservers] **************************************************************

TASK [Gathering Facts] *********************************************************
ok: [130h]

TASK [Delete the yum source] ***************************************************
changed: [130h]

TASK [Provide the yum source file] *********************************************
changed: [130h]

TASK [install apache] **********************************************************
ok: [130h]

TASK [Provides web site] *******************************************************
ok: [130h]

TASK [config apache] ***********************************************************
ok: [130h]

TASK [run httpd] ***************************************************************
ok: [130h]

TASK [close firewalld] *********************************************************
ok: [130h]

PLAY RECAP *********************************************************************
130h                       : ok=8    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@129a httpd]#

8. 变量文件管理的推荐做法

  • 若要简化管理,务必要设置Ansible项目,使敏感变量和其他变量保存在相互独立的文件中。然后,包含敏感变量的文件可通过ansible-vault命令进行保护
  • 管理组变量和主机变量的首选方式是在playbook级别上创建目录。group_vars目录通常包含名称与它们所应用的主机组匹配的变量文件。host_vars目录通常包含名称与它们所应用的受管主机名称匹配的变量文件
  • 除了使用group_vars和host_vars中的文件外,也可对每一主机组或受管主机使用目录。这些目录可包含多个变量文件,它们都由该主机组或受管主机使用
  • 例如,在playbook.yml的以下项目目录中,webservers的主机组的成员将使用group_vars/webservers/vars文件中的变量,而172.16.103.129将使用host_vars/172.16.103.129/vars和host_vars/172.16.103.129/vault中的变量
  • 用于172.16.103.129的大部分变量可以放在vars文件中,敏感变量则可单独放在vault文件中保密。然后使用ansible-vault加密vault文件,而将vars文件保留为纯文本
  • Playbook变量(与清单变量相对)也可通过Ansible Vault保护。敏感的playbook变量可以放在单独的文件中,此文件通过Ansible Vault加密,并能vars_files指令包含在该playbook中,playbook变量的优先级高于清单变量
  • 如果需要在playbook中使用多个vault密码,请确保每个加密文件分配一个vaultID,并在运行playbook时输入具有该vaultID的匹配密码。这可确保在解密vault加密文件时先选择正确的密码,这比强制Ansible尝试用户提供的所有vault密码直至找到正确的密码要快。

9. yml语言

  • YAML是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。
  • 它类似于标准通用标记语言的子集XML的数据描述语言,语法比XML简单很多
  • YAML的基本规则:
  • 使用缩进来表示层级关系,每层2个空格,禁止使用TAB键
  • 当冒号不是处于最后时,冒号后面必须有一个空格
  • 用 - 表示列表,- 的后面必须有一个空格
  • 用 # 表示注释