一、Ansible Vault
1、什么是Ansible Vault
- Ansible提供的Ansible Vault可以加密和解密任何由Ansible使用的结构化数据文件
- 若要使用Ansible Vault,可通过一个名为ansible-vault的命令行工具创建、编辑、加密、解密和查看文件
- Ansible Vault可以加密任何由Ansible使用的结构化数据文件。
- 包括清单变量、playbook中含有的变量文件、以及在执行playbook时作为参数传递的变量文件,或者Ansible角色中定义的变量
2、使用ansible-vault创建加密文件
1️⃣:用ansible-vault filename命令创建加密的文件,该命令在执行时会提示输入新的vault密码,然后利用默认编辑器vi打开文件
- 演示实例:
[root@localhost project]# ansible-vault create playbook.yaml New Vault password: //输入密码 Confirm New Vault password: //再次输入密码 [root@localhost project]# cat playbook.yaml $ANSIBLE_VAULT;1.1;AES256 30613061633963633139383032353436386231646364366436613736346432313435613439353833 3761386338616239613065323934653637393833633862330a366532343533343838396561336366 36636630313930623463656431663736303336653833653235663931376234366431386534363966 3236326565623739620a326264613365376163333663613136343931323466373333303366323434 32356530633865623935613434663337646661356465343866333862373431646339 //已经加密
2️⃣:使用vault密码文件来存储vault密码,而不是通过标准输入途径输入vault密码,这样做需要使用文件权限和其他方式来严密保护该文件
- 演示实例:
//首先创建密码文件 [root@localhost project]# cat password 123456 [root@localhost project]# chmod 600 password [root@localhost project]# ll total 4 -rw------- 1 root root 7 Sep 2 02:05 password //创建加密的YAML文件 [root@localhost project]# ansible-vault create --vault-password-file=./password example.yaml [root@localhost project]# cat example.yaml $ANSIBLE_VAULT;1.1;AES256 65623133336639346338396639623239336435633037303265353231383035356163656262646431 3536633038363832363336306236313839343330363661390a656530376439373434393435353263 63623536623564366630373438656537386431386362323534363332653035653663646662653537 6139313566363732640a353232323633303064373430396365353865653231323962373864653038 3836 //已经加密
3、查看已经加密的文件
1️⃣:使用ansible-vault view filename命令查看Ansible Vault加密的文件,而不必打开它进行编辑
- 演示实例:
//查看已经加密的YAML文件 [root@localhost project]# cat playbook.yaml $ANSIBLE_VAULT;1.1;AES256 33393839353335326235666163306639353236616564366137326632666464643733336661313261 3333636239393734323233326165616238353338386665330a353439363266346532396138343866 63393038623139363663373635626662383533656531383139373039316562313835383138386632 3637303261316631320a383034656461366630316430643733376637653134383131386238666139 64316361303763613762636437666263353965346561343635303236613366666264323736623663 39646432633364383437386237336638386463313337313431626338653261653631646538316630 63623935333436643232376562666562343761313061626162396131633635326635386662353065 64393232363731383136643839636137346239396164353038666564666466643038333539313861 38643934646565393635323862366462333465373034313331393665343832383934326330306438 3338376365613361313766316233333435353366393639653033 //查看文件内容 [root@localhost project]# ansible-vault view playbook.yaml Vault password: //输入加密的密码 --- - name: test files hosts: all tasks: - name: install httpd yum: name: httpd state: present
4、编辑已经加密的文件
1️⃣:Ansible Vault提供ansible-vault edit filename命令继续编辑已经加密文件;工作时将文件解密为一个临时文件,并允许编辑;保存时,它将复制其内容并删除临时文件
- 演示实例:
//查看已经加密文件内容 [root@localhost project]# ansible-vault view playbook.yaml Vault password: --- - name: test files hosts: all tasks: - name: install httpd yum: name: httpd state: present //继续添加内容 [root@localhost project]# ansible-vault edit playbook.yaml Vault password: //输入加密时的密码 [root@localhost project]# ansible-vault view playbook.yaml Vault password: //输入密码 --- - name: test files hosts: all tasks: - name: install httpd yum: name: httpd state: present - name: start httpd service: name: httpd state: started
5、加密和解密现有的未加密的文件
1️⃣:使用ansible-vault encrypt filename加密现有的未加密的文件;此命令可以一次加密多个现有的未加密文件
- 其次还可以使用--output选项将需要加密的文件加密后另存为具有新名称的文件,一次只能有一个输入文件
-
ansible-vault encrypt playbook.yaml --output=test.yaml
-
2️⃣:使用anisble-vault decrypt filename解密现有的已经加密的文件,并且是永久解密
- 解密也可以是使用--output选项,在解密单个文件时加改选项将解密文件以另一个新名称来保存文件
-
ansible-vault decrypt playbook.yaml --output=test.yaml
-
3️⃣:演示实例:
//查看两个现有的未加密的文件 [root@localhost project]# cat playbook.yaml --- - name: test files hosts: all tasks: - name: install httpd yum: name: httpd state: present //加密该文件 [root@localhost project]# ansible-vault encrypt playbook.yaml New Vault password: //输入密码 Confirm New Vault password: //再次输入密码 Encryption successful [root@localhost project]# cat playbook.yaml $ANSIBLE_VAULT;1.1;AES256 34613930356665386565313263616638666464303837633561633866353166653865636238333833 6430346665376264343434346233663666373064383764300a646265613630643335353930396534 35613339326263313465343637393331323461336562313335353766343161623738393965376234 3462373363323934620a616330373036346564323763333030356332353864616464303236353336 33636231386531363538346134636336613238316565373235663366656538376234656132303735 61353766633562353933313731323662616530363462656433373565663532666233386236383739 31663136336630663532613736666462643033383034313463343632316638356136363833353138 31363134396532623937373232306435303362386639663865333064353162373634623238353837 31373733356334366562373863663736383132646432363037326161396666366437376463363564 6133336438666333373037623464383962306366316432336463 //解密 [root@localhost project]# ansible-vault decrypt playbook.yaml Vault password: //输入刚刚加密设置的密码 Decryption successful [root@localhost project]# cat playbook.yaml --- - name: test files hosts: all tasks: - name: install httpd yum: name: httpd state: present
6、更改已经加密文件的密码
1️⃣:使用ansible-vault rekey filename 命令更改已经加密文件的密码;此命令一次可以更改多个已经加密文件密码;并且需要提供原始密码
- 演示实例:
//查看已经加密的文件 [root@localhost project]# ansible-vault view playbook.yaml Vault password: //此处我设置的密码是123456 --- - name: test files hosts: all tasks: - name: install httpd yum: name: httpd state: present //更改密码为654321 [root@localhost project]# ansible-vault rekey playbook.yaml Vault password: //输入原始密码123456 New Vault password: //输入更改的密码654321 Confirm New Vault password: //再次输入更改的密码654321 Rekey successful
2️⃣:除此之外还可以使用vault文件作为面密码:使用--new-vault-password-file选项指定更改的密码
- 演示实例:
//创建vault维纳 [root@localhost project]# cat new_password 123456 //更改密码 [root@localhost project]# ansible-vault rekey --new-vault-password-file=./new_password playbook.yaml Vault password: //输入原始密码 Rekey successful
二、Playbook和Ansible vault
1、执行ansible-playbook与交互密码
1️⃣:通过Ansible Vault加密的文件的playbook,需要向ansible-playbook命令提供加密密码
2️⃣:为playbook提供vault密码,可使用--vault-id选项,以交互方式提供vault密码
- 演示实例:
[root@localhost project]# ansible-playbook --vault-id @prompt playbook.yaml -C //prompt:提示的意思,提示输入default密码 Vault password (default): PLAY [test files] ********************************************************************************************************************************************************* TASK [Gathering Facts] **************************************************************************************************************************************************** ok: [client.example.com] TASK [create user] ******************************************************************************************************************************************************** changed: [client.example.com] PLAY RECAP **************************************************************************************************************************************************************** client.example.com : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3️⃣:此外,也可以使用--vault-password-file选项指定密码文件;密码应当在该文件中存储为一行字符串
- 演示实例:
[root@localhost project]# ansible-playbook --vault-password-file=./password playbook.yaml -C PLAY [test files] ********************************************************************************************************************************************************* TASK [Gathering Facts] **************************************************************************************************************************************************** ok: [client.example.com] TASK [create user] ******************************************************************************************************************************************************** changed: [client.example.com] PLAY RECAP **************************************************************************************************************************************************************** client.example.com : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
4️⃣:也可以使用ANSIBLE_VAULT_PASSWORD_FILE环境变量,指定密码文件的默认位置
5️⃣:从Ansible2.4开始,可以通过ansible-playbook使用多个Ansible Vault密码。要使用多个密码,需要将多个--vault-id或--vault-password-file选项传递给ansible-playbook命令
- 演示实例:
[root@localhost project]# ansible-playbook --vault-id 1@prompt playbook.yaml -C Vault password (1): PLAY [test files] ********************************************************************************************************************************************************* TASK [Gathering Facts] **************************************************************************************************************************************************** ok: [client.example.com] TASK [create user] ******************************************************************************************************************************************************** changed: [client.example.com] PLAY RECAP **************************************************************************************************************************************************************** client.example.com : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
-
注意: 1、@prompt前面的vaultID,数字1可以是任何字符,甚至可以完全省略它们 2、如果在使用ansible-vault命令加密文件时,使用--vault-id 选项,则在运行ansible-playbook时,将最先尝试匹配vaultID的密码;如果不匹配,将会尝试用户提供的其他密码 3、没有ID的vaultID@prompt实际上是default@prompt的简写,这意味着提示输入vaultIDdefault的密码
2、变量文件最值得推荐的做法
1️⃣:简化管理,务必要设置Ansible项目,使敏感变量和其他变量保存在相互独立的文件中;包含敏感变量的文件可通过ansible-vault命令进行保护
2️⃣:管理组变量和主机变量的首选方式是在playbook级别上创建目录;
- group_vars目录通常包含名称与它们所应用的主机组匹配的变量文件
- host_vars目录通常包含名称与它们所应用的受管主机名称匹配的变量文件
3️⃣:Playbook变量(与清单变量相对)也可通过Ansible Vault加密保护;敏感的playbook变量可以放在单独的文件中,此文件通过Ansible Vault加密,并且vars_files指令包含在该playbook中
4️⃣:如果需要在playbook中使用多个vault密码,请确保每个加密文件分配一个vaultID,并在运行playbook时输入具有该vaultID的匹配密码