首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法通过ansible创建mysql数据库

问无法通过ansible创建mysql数据库
EN

Server Fault用户
提问于 2018-01-09 13:11:30
回答 4查看 20K关注 0票数 11

我在我的远程系统上安装了MySQL5.7,我必须创建一个新的数据库和对该数据库的新用户访问。因为它是mysql-community 5.7,所以我首先必须从/var/log/mysqld.log获得grep密码。

代码语言:javascript
复制
[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,我如何给予根访问,因为我找不到任何模块来使用这个password.Do,我想为此创建一个脚本。我已经执行了下面的剧本并得到了错误

代码语言:javascript
复制
- 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

错误:

代码语言:javascript
复制
 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)\")"}

帮助我找到一个新的solution.Iam到ansible.Also,我想知道如何重置根密码。

注意:我已经复制了.my.cnf以针对mysql login.but的用户名和密码,我做了很多次,我想通过在first.How上使用临时密码登录,我能让它成为可能吗?

EN

回答 4

Server Fault用户

发布于 2018-12-02 09:07:33

安装MySQL 5.7允许使用套接字文件进行本地根登录(关键是任务/main.yml中的行login_unix_socket: /var/run/mysqld/mysqld.sock )

尽管在其他答案中提到了“shell”的解决办法,但类似的问题也会发挥作用--它们不是幂等的,它们会产生“变化的”状态,这是不好的。

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

tasks/main.yml

代码语言:javascript
复制
  # ...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

templates/my.cnf.j2

代码语言:javascript
复制
[client]
user=root
password={{ mysql.root_db_password }}

defaults/main.yml

代码语言:javascript
复制
mysql:
  root_db_password: REDACTED
  hosts:
    - "{{ ansible_hostname }}"
    - 127.0.0.1
    - ::1
    - localhost
票数 12
EN

Server Fault用户

发布于 2018-01-09 14:13:33

如mysql_db模块说明和mysql_用户笔记所述(两者的案文相同):

在传递凭据时,login_password和login_user都是必需的。如果没有,则模块将尝试从~/.my.cnf读取凭据,并最终返回到使用MySQL默认登录名‘root’而没有密码。

所以你有几个选择:

将凭据传递给任务

代码语言:javascript
复制
- 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用户管理员凭据替换DB_USER和DB_USER_PASS。

但是这并不是最优的,因为您必须在每个mysql任务中放置凭证,并且您的凭据应该在您的ansible代码中。您可以使用可承受保险库来缓解这种情况,但即使有更好的选择。

编写具有凭据

的~/.my.cnf文件

使用mysql凭据在用户家中(可能是根用户)创建或编辑~/.my.cnf文件:

代码语言:javascript
复制
[client]
user=root
password="PASSWORD"

(您可能需要添加其他连接细节)。

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

票数 1
EN

Server Fault用户

发布于 2018-01-30 05:41:00

在googling搜索之后,我找到了一种重置临时密码的方法:

代码语言:javascript
复制
- 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 
}}"'
票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/891373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档