为了确保主机A可以连接到主机B的数据库,我尝试在远程主机上使用mysql_db
- name: Make sure A can connect to B database
mysql_db:
login_user=root
login_password=password
login_host=B_address
login_port=B_port
name=B_database
state=present
即使登录/传递正确,我也会收到该错误消息
msg: unable to connect, check login_user and login_password are correct,
or alternatively check ~/.my.cnf contains credentials
我错过了什么吗?我可以使用特定的ansible主机设置login_host吗?
Did you configure the mysql to accept the connection from Host A because
by default mysql only accept connection from localhost.
如果已配置mysql接受来自主机A的连接,则可以验证数据库是否存在
- name: check if DB exists
shell: mysql -e 'SHOW DATABASES;' | grep {{ B_database }}
register: dbstatus
failed_when: dbstatus.rc == 2
然后,如果B_database存在,则可以运行任务
- name: Make sure A can connect to B database
mysql_db:
login_user=root
login_password=password
login_host=B_address
login_port=B_port
name=B_database
state=present
when: dbstatus.rc == 0
no_log: yes # You can disable this, if you want to print the stdout
如果您确定上述情况属实并且仍然出现错误,请执行以下操作:
在task / main.yml中添加此任务
- name: Copy the root credentials as .my.cnf file
template:
src: root.cnf.j2
dest: "~/.my.cnf"
mode: 0600
这将是你的root.cnf.j2
[client]
user=root
password={{ password }}
它将做的是,从没有密码的root用户连接mysql并执行这些任务。您可以在运行所有任务后将其删除,或者将其保留,因为它位于root下且具有严格的权限。
因为ansible在找不到grep退出代码时失败了,所以我找到了一种不同的方法来过滤数据库:
> mysql -e "SHOW DATABASES LIKE '<database>'" -sN
然后你可以做以下事情:
when: dbstatus.stdout_lines
因为python会将空数组视为false
使用上述答案的组合
- name: check if DB exists
shell: mysql --host={{ db_host }} --user={{ db_username }} --password={{ db_password }} -e 'SHOW DATABASES;' | grep -c {{ db_name }}
register: dbstatus
failed_when: dbstatus.rc == 2
- name: Create database
mysql_db: name={{db_name}} collation=utf8mb4_unicode_ci state=present login_host={{ db_host }} login_user={{ db_root_username }} login_password={{ db_root_password }}
when: dbstatus.stdout == "0"
- name: Create application user in the database
mysql_user: name={{ db_username }} password={{ db_password }} host={{ db_connection_host }} append_privs=true priv={{ db_name }}.*:ALL state=present login_host={{ db_host }} login_user={{ db_root_username }} login_password={{ db_root_password }}
when: dbstatus.stdout == "0"
有用的注意事项,您可以通过在运行playbook时添加-vvv来获取dbstatus的输出
请记住,这里涉及3个主机:
在这种情况下,目标主机需要能够使用login_password作为login_user连接到mysql主机。
检查: