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

luq*_*o33 16 mysql

我已经使用 Ansible playbook 配置了我的服务器。我使用了root/bedrock-Ansible playbook

其中一项任务是设置 mysql 服务器以及 mysql root 用户密码。

现在我迫切需要更改此密码。我采取的步骤:

  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
Run Code Online (Sandbox Code Playgroud)

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

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

yda*_*coR 16

您遇到的问题是 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
Run Code Online (Sandbox Code Playgroud)

显然,如果你想用这个剧本来改变它,这永远不会奏效。

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

- 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
Run Code Online (Sandbox Code Playgroud)

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

所以你group_vars/production现在应该包含:

mysql_old_root_password: productionpw
mysql_root_password: newproductionpw
Run Code Online (Sandbox Code Playgroud)

它看起来像这样的剧本中都使用了root密码roles/mariadb/tasks/main.yml剧本,也roles/wordpress-setup/tasks/database.yml因此你可能需要运行整个server.yml剧本,以确保该设置正确。


小智 11

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

诀窍是有一个任务“设置root密码”(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-credentials 的一种存储。

- 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
Run Code Online (Sandbox Code Playgroud)

使用 client.my.cnf.j2:

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

进一步阅读

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,注释

  • 这很方便,但在许多系统上,实际上创建了 4 个“root”用户,包括主机 127.0.0.1、localhost、::1 以及任何本地主机名。上面只修改了 root@localhost,剩下三个 root 帐户的密码为空。 (2认同)
  • 我知道了。在 Ubuntu 20.04 和 MariaDb 上,您需要在每次调用 mysql_* 模块时添加:“login_unix_socket: '/var/run/mysqld/mysqld.sock'”。 (2认同)