公司已经由 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
我们定义 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