Ansible Vault加密的使用

公司已经由 saltstack 全面转向了 ansible 。

用 ansible-playbook 执行各种任务的时候,需要登录主机,就必然涉及到主机 ssh 密码的输入。

最早我们是在 inventory 里做了定义:

1[deqin:vars]
2ansible_ssh_common_args="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
3host_key_checking=False
4ansible_ssh_user="peadmin"
5ansible_ssh_pass="Fuck2021!"
6
7[deqin]
8192.168.1.19

太直白了,所有看到这文件内容的人都会知道密码了。完全没有安全性,这样行不通啊!

好在 ansible-vault 提供了一种方法来解决:那就是生成一个密文放进去,然后解开它必须再输入一个密码。这样看到的人也不知道实际的密码到底是什么

具体的做法如下,首先生成 key –> 加密字符串的键值对:

1ansible-vault encrypt_string 'Fuck2021!' --name 'ansible_ssh_pass'

输入密码,会得到下面一串字符

1ansible_ssh_pass: !vault |
2          $ANSIBLE_VAULT;1.1;AES256
3          37393235646234613332646366306233346330656666623862313339313861393239646261366237
4          6663343263363161643634653266343466356634656539650a393834663938636165336431656433
5          66333761643538623434363334316661653035313166333137373562363436613636366162353239
6          3661623733323933350a373164626131646235616361356638653733646534616163393362373135
7          6139

这个就是密文了,必须用输入的密码才能解开。

注意:这里的键值 name 不可改变,如果你想把字符串拷贝下来,改掉 ansible_ssh_pass 的名字,改成别的,想改名引用,是不行的。

这一大长串密文有以下两种用法:

一、ini格式的inventory引用

最原始的 inventory.ini 内容如下:

1[deqin:vars]
2ansible_ssh_common_args="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
3host_key_checking=False
4ansible_ssh_user="peadmin"
5
6[deqin]
7192.168.1.19
8

我们定义 playbook 文件 shenji.yml:

 1- hosts: deqin
 2  become: yes
 3  vars_files:
 4    - pass.yml
 5  vars:
 6    ansible_ssh_pass: '{{ ansible_ssh_pass }}'
 7
 8  tasks:
 9    - name: mkdirs
10      file: path="{{ item }}" state=directory
11      with_items:
12        - "OS.05"
13        - "OS.06"

把密文放进 pass.yml 文件

1cat << EOF >> pass.yml
2ansible_ssh_pass: !vault |
3          $ANSIBLE_VAULT;1.1;AES256
4          37393235646234613332646366306233346330656666623862313339313861393239646261366237
5          6663343263363161643634653266343466356634656539650a393834663938636165336431656433
6          66333761643538623434363334316661653035313166333137373562363436613636366162353239
7          3661623733323933350a373164626131646235616361356638653733646534616163393362373135
8          6139
9EOF

运行 playbook:

1ansible-playbook --ask-vault-pass -i inventory.ini shenji.yml -vvv

为什么这样呢?因为 ansible-vault 加密过的字符串是 yaml 格式的,在 ini 里无法直接引用。

所以在 playbook 的 yaml 文件中引入它,然后再跟从 inventory.ini 中获取的变量合作一起。

二、yaml格式的inventory引用

上面我们看到了必须间接引用才可以,为了避免掉 pass.yml 文件,那么干脆把 inventroy 用 yaml 格式来写,那不就可以了么

如下即可:

 1cat << EOF >> inventory.yml
 2---
 3all:
 4  hosts:
 5    deqin:
 6      ansible_host: 192.168.1.19
 7    vars:
 8      host_key_checking: "False"
 9      ansible_ssh_common_args: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
10      ansible_ssh_pass: !vault |
11          $ANSIBLE_VAULT;1.1;AES256
12          37393235646234613332646366306233346330656666623862313339313861393239646261366237
13          6663343263363161643634653266343466356634656539650a393834663938636165336431656433
14          66333761643538623434363334316661653035313166333137373562363436613636366162353239
15          3661623733323933350a373164626131646235616361356638653733646534616163393362373135
16          6139
17EOF

然后运行就可以了:

1ansible-playbook --ask-vault-pass -i inventory.yml shenji.yml -vvv

使用FreeIPA和FreeRadius搭建双因子认证服务器
Kubernetes的hpa和自定义指标hpa
comments powered by Disqus