我有一个带有 jenkins 的 docker 容器,它使用 ansible 执行一些自动化命令。一个特定的命令连接到另一个 docker 容器上的数据库并执行一些检查(如清理数据库)。这些命令长期以来运行良好,但现在我在尝试连接到 MySQL 时遇到问题。该问题是一个非常著名的错误:
"msg": "unable to connect to database, check login_user and login_password are correct or /var/jenkins_home/.my.cnf has the credentials. Exception message: __init__() got an unexpected keyword argument 'password'"
显然,这似乎是与凭据相关的连接错误。我解决这个问题的第一个方法是检查密码以确保它是正确的。我已经检查过了,我可以使用 mysql 客户端从 jenkins docker 容器连接,并且使用提供给 ansible 脚本的相同凭据。此外,“var/jenkins_home/.my.cnf”现在具有正确的凭据(我仍然更喜欢将这些凭据放在脚本上,因为不同脚本之间存在差异,但无论如何,我已经更新了它)。但它们都没有解决问题。
我搜索了所有修复它的建议,也检查了login_unix_socket
是否有更新按照某些地方的建议更改了套接字的路径,但没有成功。同样的问题。
Docker 容器内的当前版本:
Jenkins: 2.291
Ansible: 2.10.9
Python: 2.7
ansible 上执行的命令很简单:
- name: delete existing usmo database
delegate_to: localhost
mysql_db:
login_user={{ jenkins_database_login_user }}
login_password={{ jenkins_database_login_password }}
login_host={{ jenkins_database_host }}
name={{ jenkins_database }}
state=absent
所有变量{{ jenkins_database_login_user }}
、{{ jenkins_database_login_password }}
和{{ jenkins_database_host }}
都{{ jenkins_database }}
经过检查,具有正确的值。此外,这个脚本已经运行多年。唯一可能发生的事情是,我更新了 jenkins docker 容器(新的 jenkins 版本,也许还有一些新的 SO 包版本),但之前发布的使用版本似乎不是问题。
请注意,我所有访问数据库(具有不同凭据的不同数据库)的 ansible 脚本都失败了。然后我假设这可能是某些东西的更新,但我没有任何线索。我还查看了 Ansible 官方文档musql_db但我没有看到任何影响我的脚本的变化。
这是来自 ansible 的完整详细答案:
fatal: [XXX]: FAILED! => {
"changed": false,
"invocation": {
"module_args": {
"ca_cert": null,
"check_hostname": null,
"check_implicit_admin": false,
"client_cert": null,
"client_key": null,
"collation": "",
"config_file": "/var/jenkins_home/.my.cnf",
"config_overrides_defaults": false,
"connect_timeout": 30,
"dump_extra_args": null,
"encoding": "",
"force": false,
"hex_blob": false,
"ignore_tables": [],
"login_host": "myhost",
"login_password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
"login_port": 3306,
"login_unix_socket": "/var/lib/mysqld/mysqld.sock",
"login_user": "myuser",
"master_data": 0,
"name": [
"database_name"
],
"quick": true,
"restrict_config_file": false,
"single_transaction": false,
"skip_lock_tables": false,
"state": "absent",
"target": null,
"unsafe_login_password": false,
"use_shell": false
}
},
其中database_name
、myuser
和myhost
不是真正的变量,因为我为了安全起见隐藏了它们。
任何能够指出错误之处的线索或建议都将不胜感激。
答案1
好的。今天我在 Jenkins 上看到有一个更新 (2.293),并且我已经用新版本更新了 docker 容器。现在似乎一切都恢复正常,mysql 连接器的问题也消失了。我不知道以前的版本对我的 ansible 脚本有何影响(可能是一些 python 包版本),但在新版本上似乎一切都得到了纠正。