检查数据库是否在远程主机上

use*_*688 5 mysql ansible ansible-playbook

为了确保主机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
Run Code Online (Sandbox Code Playgroud)

即使登录/密码正确,我也会收到该错误消息

msg: unable to connect, check login_user and login_password are correct, 
or alternatively check ~/.my.cnf contains credentials
Run Code Online (Sandbox Code Playgroud)

我想念什么吗?可以使用特定的ansible主机设置login_host吗?

Tim*_*oot 7

在我的情况下,我只想在创建数据库时导入一次 SQL 文件。以下是如何通过 Ansible 方式实现这一目标:

---
- name: Test playbook
  hosts: localhost
  connection: local
  tasks:
    - name: Database exists
      mysql_db:
        name: some_db
        state: present
      register: database_exists
    - name: Import database schema
      mysql_db:
        name: some_db
        state: import
        target: database.sql.gz
      when: database_exists.changed
Run Code Online (Sandbox Code Playgroud)


Arb*_*zar 6

    Did you configure the mysql to accept the connection from Host A because 
by default mysql only accept connection from localhost.
Run Code Online (Sandbox Code Playgroud)

如果已配置mysql接受来自主机A的连接,则可以验证数据库是否存在

- name: check if DB exists
   shell: mysql -e 'SHOW DATABASES;' | grep {{ B_database }}
   register: dbstatus
   failed_when: dbstatus.rc == 2
Run Code Online (Sandbox Code Playgroud)

然后,如果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
Run Code Online (Sandbox Code Playgroud)

如果您确定上述情况是正确的,但仍然出现错误,请执行以下操作:

将此任务添加到您的task / main.yml中

- name: Copy the root credentials as .my.cnf file
   template:
     src: root.cnf.j2
     dest: "~/.my.cnf"
     mode: 0600
Run Code Online (Sandbox Code Playgroud)

这将是您的root.cnf.j2

[client]
user=root
password={{ password }}
Run Code Online (Sandbox Code Playgroud)

它将要做的是,从没有密码的root用户连接mysql并执行这些任务。您可以在运行所有任务后将其删除,也可以像这样保留它,因为它在根目录下并且具有严格的权限。

  • 当数据库不存在时,`grep`将返回退出代码1,这将导致任务失败。您仅需要在`grep`报告实际错误(退出代码2)而不是未找到结果(退出代码1)的情况下添加`failed_when:dbstatus.rc == 2`即可使任务失败。参见[此答案](http://stackoverflow.com/a/34345705/857390)。 (2认同)