如何在Ansible中向执行的mysql任务传递密码,避免交互阻塞?
解决方案
你可以通过以下几种方式传入密码解决阻塞问题:
方案1:直接在mysql命令中携带密码
mysql命令支持-p参数后直接拼接密码(注意-p和密码之间不能有空格),你可以将密码存为Ansible变量(推荐用Ansible Vault加密敏感变量避免明文泄露),修改任务如下:
- name: 导入zabbix数据库 shell: chdir: /usr/share/doc/zabbix-server-mysql-4.0.33/ cmd: zcat create.sql.gz | mysql -u muhannad -p{{ zabbix_db_password }} zabbix_db
其中zabbix_db_password为存储数据库密码的Ansible变量。
方案2:使用mysql配置文件自动读取密码
你可以在目标主机的执行用户家目录下生成临时的.my.cnf配置文件,mysql会自动读取该文件中的认证信息,无需在命令中携带密码,任务示例如下:
- name: 生成mysql临时认证配置 copy: content: | [client] user = muhannad password = {{ zabbix_db_password }} dest: ~/.my.cnf mode: '0600' - name: 导入zabbix数据库 shell: chdir: /usr/share/doc/zabbix-server-mysql-4.0.33/ cmd: zcat create.sql.gz | mysql zabbix_db - name: 清理临时认证配置 file: path: ~/.my.cnf state: absent
该方案的优势是全程不会在命令行历史、日志中泄露密码,安全性更高。
方案3:使用expect模块交互输入密码
如果你不想修改原有命令结构,可以用Ansible的expect模块自动响应密码输入提示:
- name: 导入zabbix数据库 expect: chdir: /usr/share/doc/zabbix-server-mysql-4.0.33/ command: zcat create.sql.gz | mysql -u muhannad -p zabbix_db responses: '(?i)Enter password:': '{{ zabbix_db_password }}'
注意:使用该方案需要先确保目标主机已经安装了expect依赖包。
内容的提问来源于stack exchange,提问作者Tesla
相关产品推荐
相关产品推荐

