无法通过 ansible 创建 mysql 数据库

无法通过 ansible 创建 mysql 数据库

我的远程系统上安装了 mysql 5.7。我必须创建一个新数据库和一个访问该数据库的新用户。由于它是 mysql-community-server 5.7,因此我最初必须从 /var/log/mysqld.log 中 grep 密码

[root@lamp2 labadmin]# cat /var/log/mysqld.log | grep temporary
2018-01-09T10:57:17.326484Z 1 [Note] A temporary password is generated for 
root@localhost: gg%j,opuE3Sm
2018-01-09T10:57:34.471131Z 0 [Note] InnoDB: Creating shared tablespace for 
temporary tables

因此,我该如何使用 ansible 授予 root 访问权限,因为我找不到任何模块来使用此密码。我想为此创建一个脚本吗?我执行了以下剧本并收到错误

- hosts: lamp
  remote_user: root
  vars:
    dbname: wordpressdb
    dbuser: wordpressuser
    password: REDhat@123
  tasks:
  - name: installing mysql-python
    yum:
      name: MySQL-python
      state: present
  - name: Creating database
    mysql_db: name={{ dbname }} state=present

  - name: Create db User
    mysql_user: name={{ dbuser }} password={{ password }} priv=*.*:ALL
    host='localhost' state=present

错误:

 TASK [Creating database] 
 *******************************************************
 fatal: [52.172.48.12]: FAILED! => {"changed": false, "failed": true, "msg": 
 "unable to find /root/.my.cnf. Exception message: (1045, \"Access denied 
 for user 'root'@'localhost' (using password: NO)\")"}

帮我找到一个解决方案。我是 ansible 新手。我还想知道如何重置 root 密码。

注意:我已经将 .my.cnf 复制到包含 mysql 登录用户名和密码的目标。但我手动完成了。我想首先使用该临时密码登录。我怎样才能做到这一点

答案1

login_unix_socket: /var/run/mysqld/mysqld.sockMySQL 5.7 的“全新”安装允许使用套接字文件进行本地 root 登录(关键点是task/main.yml 中的行)

尽管其他答案中提到的针对这一问题和类似问题的“shell”解决方法可以完成它们的工作 - 但它们并不是幂等的并且会产生不好的“改变”状态。

以下代码片段在 Ubuntu 18.04+ 上以完全幂等的方式工作

任务/main.yml

  # ...deleted...

- name: Ensure mysql is running and starts on boot
  service:
    name: mysql
    state: started
    enabled: yes
  become: yes

- name: Ensure mysql root password is updated for all root accounts
  mysql_user:
    name: root
    host: "{{ item }}"
    login_unix_socket: /var/run/mysqld/mysqld.sock
    password: "{{ mysql.root_db_password }}"
    priv: '*.*:ALL,GRANT'
    check_implicit_admin: true
  loop: "{{ mysql.hosts }}"
  become: yes
  notify: Restart MySQL

- name: Create `/root/.my.cnf`  with root password credentials
  template:
    src:  my.cnf.j2
    dest: /root/.my.cnf
    owner: root
    mode: 0600
  become: yes
  notify: Restart MySQL

模板/my.cnf.j2

[client]
user=root
password={{ mysql.root_db_password }}

默认值/main.yml

mysql:
  root_db_password: REDACTED
  hosts:
    - "{{ ansible_hostname }}"
    - 127.0.0.1
    - ::1
    - localhost

答案2

正如mysql_db 模块说明mysql_user 说明(两段文字相同):

传递凭证时需要 login_password 和 login_user。如果不存在,模块将尝试从 ~/.my.cnf 读取凭证,并最终恢复使用没有密码的 MySQL 默认登录“root”。

因此您有多种选择:

将凭据传递给任务

- name: Creating database
  mysql_db: name={{ dbname }} state=present login_user={{ DB_USER }} login_password={{ DB_USER_PASS }} 

- name: Create db User
  mysql_user: name={{ dbuser }} password={{ password }} priv=*.*:ALL
  host='localhost' state=present login_user={{ DB_USER }} login_password={{ DB_USER_PASS }} 

将 DB_USER 和 DB_USER_PASS 替换为您的数据库用户管理员凭证。

但这远非最佳选择,因为您必须在每个 mysql 任务中输入凭据,并且您的凭据应该在您的 ansible 代码中。您可以使用ansible 保险库来缓解这种情况,但即使如此,还有更好的选择。

写入~/.my.cnf带有凭证的文件

~/.my.cnf使用 mysql 凭证在用户主目录中创建或编辑文件(可能是 root):

[client]
user=root
password="PASSWORD"

(您可能需要添加其他连接详细信息)。

第三个选项我不确定它在 CentOS 中是如何工作的,但主要意味着 root 用户无需使用凭据即可连接到 mysql。通常它依赖于 /root/-.my.cnf 文件,但在 CentOS 中可能有所不同。

答案3

经过谷歌搜索,我找到了一种重置临时密码的方法:

- name: Find temporary password
  shell: "echo `grep 'temporary.*root@localhost' /var/log/mysqld.log | sed 
's/.*root@localhost: //'`"
  register: mysql_root_password_temp
  tags: register

Set the new password using the temporary password
- name: Set new password from temporary password
  shell: 'mysql -e "SET PASSWORD = PASSWORD(''{{ mysql_root_password }}'');" 
--connect-expired-password -u root -p"{{ mysql_root_password_temp.stdout 
}}"'

答案4

您需要添加 root 套接字 https://docs.ansible.com/ansible/2.9/modules/mysql_db_module.html#parameter-login_unix_socket

mysql_user 也一样

- name: Creating database
  mysql_db:
    login_unix_socket: /var/run/mysqld/mysqld.sock
    name: {{ dbname }}
    state: present

- name: Create db User
  mysql_user: 
    login_unix_socket: /var/run/mysqld/mysqld.sock
    name: {{ dbuser }}
    password: {{ password }}
    priv: "*.*:ALL"
    host: 'localhost'
    state: present

相关内容