如何在Cron执行的Ansible Playbook中安全传递加密的ansible_become_pass
当然可以!针对你这种通过Cron每日执行Ansible Playbook、需要sudo权限但又不能明文存储密码的场景,我平时处理这类自动化任务时,有几个实用且安全的解决方案,给你逐一拆解:
这是Ansible官方推荐的加密敏感数据的方式,既安全又省心,完全匹配你的需求:
加密sudo密码变量
执行以下命令生成加密后的ansible_become_pass变量内容:ansible-vault encrypt_string '你的实际sudo密码' --name 'ansible_become_pass'命令执行后会输出类似这样的加密内容:
ansible_become_pass: !vault | $ANSIBLE_VAULT;1.1;AES256 36343839323736363537303638343832333537383637393533343837353237363638313735333934 3435313032363530303936353734363835373736323538310a383533363237333137313738303937 39323839363738333531303336383337323736343337353834373630343330363730303732363934 3537383830353335390a323036353939363831373730313535383438363539323531383739303537 3139将加密变量添加到配置中
你可以把这段加密内容直接放到你的inventory文件、group_vars或者host_vars里,比如在inventory中:[target_hosts] server1.example.com [target_hosts:vars] ansible_become_pass: !vault | $ANSIBLE_VAULT;1.1;AES256 36343839323736363537303638343832333537383637393533343837353237363638313735333934 ...配置Cron任务时自动解密
你需要创建一个仅你和root能读取的Vault密码文件(权限设为600),比如/home/your_user/.vault_pass,里面只存Ansible Vault的解密密码。然后在Cron任务里指定这个密码文件:0 2 * * * ansible-playbook /path/to/your/playbook.yml --vault-id /home/your_user/.vault_pass另外,你也可以通过设置环境变量
ANSIBLE_VAULT_PASSWORD_FILE来指定密码文件,这样Cron命令里就不用加--vault-id参数了,比如在Cron的环境配置里添加:ANSIBLE_VAULT_PASSWORD_FILE=/home/your_user/.vault_pass
如果你不想用Vault管理,也可以把加密后的sudo密码先解密,再通过环境变量传递,但要注意严格管控环境变量的安全性:
加密sudo密码到文件
先创建一个加密文件存储sudo密码:ansible-vault create encrypted_become_pass.yml在文件里写入:
ansible_become_pass: 你的实际sudo密码Cron任务中解密并导出环境变量
在Cron任务里先解密文件,把密码导出为环境变量后再执行Playbook:0 2 * * * export ANSIBLE_BECOME_PASS=$(ansible-vault view encrypted_become_pass.yml --vault-id /home/your_user/.vault_pass | grep ansible_become_pass | awk '{print $2}') && ansible-playbook /path/to/your/playbook.yml这种方式要确保解密过程不会在系统日志中泄露密码,尽量减少风险。
如果你的环境允许,也可以在目标机器上配置特定用户执行Playbook任务时无需输入sudo密码:
编辑目标机器的sudoers规则
用visudo命令编辑sudoers文件,添加类似规则:your_ansible_user ALL=(ALL) NOPASSWD: /path/to/task1, /path/to/task2这里的
your_ansible_user是Ansible连接目标机器用的用户,后面的路径是Playbook中需要sudo执行的具体命令,一定要尽量限制命令范围,绝对不要用ALL开放全权限,不然会带来严重的安全隐患。无需密码执行Playbook
配置完成后,Playbook里的become: yes就不需要密码了,Cron执行时也不用再处理密码相关的配置。
内容的提问来源于stack exchange,提问作者Flomp

