Ansible:如何通过重新配置服务器来更改MySQL服务器根密码


14

我已为服务器配置了Ansible剧本。我使用过root / bedrock-Ansible剧本

任务之一是与mysql root用户密码一起设置mysql服务器。

现在,我急需更改此密码。我采取的步骤:

  1. 我更新了Ansible角色的变量
  2. 我执行了命令ansible-playbook -i hosts/staging server.yml以重新配置服务器

所有任务均按预期执行(无更改),但是脚本失败, [mariadb | Set root user password]并显示以下消息:

msg: unable to connect to database, check login_user and login_password are correct or ~/.my.cnf has the credentials

我的猜测是,一旦设置了MySQL根密码,重新配置服务器就无法更改该密码。

是否可以通过用Ansible重新配置服务器来更改MySQL根密码?我有什么选择?

Answers:


15

您遇到的问题是Ansible尝试使用与您想更改为相同的root密码登录:

- name: Set root user password
  mysql_user: name=root
              host="{{ item }}"
              password="{{ mysql_root_password }}"
              check_implicit_admin=yes
              login_user="{{ mysql_user }}"
              login_password="{{ mysql_root_password }}"
              state=present

显然,如果您想使用此播放方式进行更改,则此操作将永远无法进行。

相反,您应该将上述播放方式更改为:

- name: Set root user password
  mysql_user: name=root
              host="{{ item }}"
              password="{{ mysql_root_password }}"
              check_implicit_admin=yes
              login_user="{{ mysql_user }}"
              login_password="{{ mysql_old_root_password }}"
              state=present

然后更新相关的清单文件以添加此新变量。

因此,您group_vars/production现在应该包含:

mysql_old_root_password: productionpw
mysql_root_password: newproductionpw

看来此剧本在roles/mariadb/tasks/main.yml剧本中同时使用了root密码,roles/wordpress-setup/tasks/database.yml因此您可能要运行整个server.yml剧本以确保正确设置。


非常感谢您的出色回答。这绝对是要走的路。我最终使用以下命令在控制台中重置了root密码mysqladmin-但这是在我看到您的答案之前
luqo33 2015年

7

您可以滥用〜/ .my.cnf来更改mysql-root-password。

诀窍是有一个任务“设置根密码”(nr.1),它将设置密码。之后,您将执行一个任务,该任务将使用正确的凭据(nr.2)创建一个〜/ .my.cnf

在新系统上,不存在〜/ .my.cnf。任务nr.1将使用给定的凭据创建mysql-root-user。在当前系统上,〜/ .my.cnf中的凭据用于登录并将密码设置为mysql_root_password。任务nr.2将创建〜/ .my.cnf用新的覆盖旧的凭据〜/ .my.cnf

这种方法的最大优点是只有一个变量“ mysql_root_password”,从剧本的角度来看,它始终是正确的变量。在当前系统上,〜/ .my.cnf用于当前本地mysql凭证的存储。

- name: Set root user password
  # If .my.cnf already exists, this will cause an mysql-root-password update.
  mysql_user:
    name: root
    password: "{{ mysql_root_password}}"
    check_implicit_admin: true

- name: Create .my.cnf
  template:
   src: "client.my.cnf.j2"
   dest: "/root/.my.cnf"
   owner: root
   group: root
   mode: 0600

使用client.my.cnf.j2:

[client]
user=root
password={{ mysql_root_password }}

进一步阅读

来自ansible-mysql_user_module-documentation的相关说明:

  • 注意1:

    为了确保该用户作为幂等性手册的一部分,您必须创建至少两个任务:第一个必须更改root用户的密码,而无需提供任何login_user / login_password详细信息。第二个必须删除包含新的根凭据的〜/ .my.cnf文件。然后,通过从文件中读取新凭据,将成功运行剧本。ansible-mysql_user_module,说明

  • 笔记2:

    传递凭据时,login_password和login_user都是必需的。如果不存在,该模块将尝试从〜/ .my.cnf中读取凭据,最后退回到使用MySQL默认登录名“ root”而不输入密码。ansible-mysql_user_module,说明


我非常喜欢这种方法,它比我的答案中的版本要好得多。它可能应该是公认的答案。
ydaetskcoR

2
这很方便,但是在许多系统上,实际上创建了4个“ root”用户,它们具有主机127.0.0.1,localhost,:: 1和任何本地主机名。上面仅修改了root @ localhost,其他三个root帐户则保留了空白密码。
robo

列出所有root用户:mysql --database mysql --execute "select host from user where user = 'root';"这篇文章的答案与此答案相同,但是具有用于设置所有密码的代码。
hlovdal

2

对于下一个在这里寻找答案的人。尽管接受的答案是正确的,但是如果您使用的是MySQL 5.7,则必须格外勤奋,因为在mysqld中,在守护模式(服务)下不允许匿名登录。相反,您必须刮擦/var/log/mysqld.log以获取某人决定创建的TEMPORARY密码,并在login_password = ydaetskcoR上使用该密码。他们决定在dev存储库的5.7版上实现此功能,因此,如果要避免使用较旧的版本(5.6),则可以使用该功能。

此处的文档:https : //dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_initialize-insecure

http://mysqlserverteam.com/initialize-your-mysql-5-7-instances-with-ease/


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.