我正在设置 MySQL 服务器,并希望 Ansiblemysql-root
在安装期间设置密码。
在互联网的帮助下我想出了这个解决方案:
- name: Set MySQL root password before installing
debconf: name='mysql-server' question='mysql-server/root_password' value='{{mysql_root_pwd | quote}}' vtype='password'
- name: Confirm MySQL root password before installing
debconf: name='mysql-server' question='mysql-server/root_password_again' value='{{mysql_root_pwd | quote}}' vtype='password'
- name: Install Mysql
apt: pkg=mysql-server state=latest
mysql_root_pwd
是从 Ansible Vault 加载的变量。这运行正常,但现在服务器上的日志中有很多行:
Apr 10 14:39:59 servername ansible-debconf: Invoked with value=THEPASSWORD vtype=password question=mysql-server/root_password name=mysql-server unseen=None
Apr 10 14:39:59 servername ansible-debconf: Invoked with value=THEPASSWORD vtype=password question=mysql-server/root_password_again name=mysql-server unseen=None
我如何阻止 Ansible 将明文密码写入日志文件?
答案1
为了防止包含机密信息的任务被记录在系统日志或其他文件中,请no_log: true
在任务上进行设置:
- name: secret stuff
command: "echo {{secret_root_password}} | sudo su -"
no_log: true
任务的运行仍将被记录,但细节较少。此外,使用的模块必须支持no_log
,因此请测试自定义模块。
看Ansible 常见问题解答了解更多详情。它可以应用于整个剧本,但是输出结果有点令人讨厌,因为“被审查了!“消息。
答案2
观察到的行为似乎是 debconf 模块中的一个错误。我提交了一个错误报告。
github 上的用户 bcoca 指出,可以使用no_log: true
设置密码的任务中的指令来阻止日志记录。这是一种解决方法,在错误修复之前对我来说是有效的。
答案3
有比 no_log 更好的方法:True
- name: write in string variables login and password
set_fact:
temp_user: "{{ USER_VAR }}"
temp_pass: "{{ PASSWORD_VAR }}"
- name: Your operation with password in output
shell: '/opt/hello.sh'
ignore_errors: True
no_log: True
register: myregister
- debug:
msg: '{{ myregister.stderr | regex_replace(temp_user) | regex_replace(temp_pass) }}'
when: myregister.stderr != ""
- debug:
msg: '{{ myregister.stdout | regex_replace(temp_user) | regex_replace(temp_pass) }}'
when: myregister.stdout != ""
- fail:
msg: "error shell /opt/hello.sh"
when: myregister.stderr != ""
如您所见,您需要添加:
ignore_errors: true
no_log: true
然后使用 regex_replace 输出命令的结果,其中:
USER_VAR-登录变量
PASSWORD_VAR - 密码变量
通过这种方法,你不仅可以隐藏密码和登录名,还可以获得操作的输出
答案4
按照Ansible 文档:
日志路径
如果存在并在 中配置
ansible.cfg
,Ansible 将在指定位置记录有关执行的信息。确保运行 Ansible 的用户对日志文件具有权限:log_path=/var/log/ansible.log
默认情况下不启用此行为。请注意,如果没有此设置,ansible 会将调用的模块参数记录到受管计算机的 syslog 中。密码参数除外。
听起来log_path
你的控制节点上的设置将导致不是在目标节点上有日志。