Resolvido: Como alterar a senha root do servidor MySQL reprovisionando o servidor

14

Eu provisionei meu servidor com o Ansible playbook. Eu usei o manual raiz / base-Ansible .

Uma das tarefas era configurar o servidor mysql junto com a senha do usuário root do mysql.

Agora, preciso urgentemente alterar essa senha. Os passos que tomei:

  1. Atualizei variáveis ​​para funções Ansible
  2. Eu executei o comando ansible-playbook -i hosts/staging server.ymlpara reprovisionar o servidor

Todas as tarefas foram executadas conforme o esperado (sem alterações), mas o script falhou [mariadb | Set root user password]com esta mensagem:

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

Meu palpite é que, uma vez definida a senha root do MySQL, o reprovisionamento do servidor não poderá alterar essa senha.

É possível alterar a senha de root do MySQL reprovisionando o servidor com Ansible? Quais são as minhas opções?

luqo33
fonte

Respostas:

15

O problema que você tem é que o Ansible está tentando usar a mesma senha root para fazer login, conforme você deseja alterá-la para:

- 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

Obviamente, isso nunca vai funcionar se você quiser usar essa peça para alterá-la.

Em vez disso, você deve alterar a jogada acima para algo como:

- 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

E atualize os arquivos de inventário relevantes para adicionar essa nova variável.

Portanto, seu group_vars/productionagora deve conter:

mysql_old_root_password: productionpw
mysql_root_password: newproductionpw

Parece que este manual usa a senha de root no roles/mariadb/tasks/main.ymlmanual e também, roles/wordpress-setup/tasks/database.ymlportanto, convém executar o server.ymlmanual inteiro para garantir que esteja configurado corretamente.

ydaetskcoR
fonte
Muito obrigado por uma ótima resposta. Este é definitivamente o caminho a seguir. Acabei redefinindo a senha root no console com mysqladmin- mas isso foi antes de eu ver sua resposta
luqo33 21/15/15
7

Você pode usar mal o ~ / .my.cnf por poder alterar a senha do mysql-root.

O truque é ter a tarefa "Definir senha root" (nº 1), que definirá a senha. Depois, você tem uma tarefa que cria um ~ / .my.cnf com as credenciais corretas (n.2).

Em um novo sistema, ~ / .my.cnf não está presente. A tarefa nº 1 criará o usuário root do mysql com as credenciais fornecidas. Em um sistema atual, as credenciais de ~ / .my.cnf são usadas para efetuar login e definir a senha como mysql_root_password . A tarefa nº 2 criará ~ / .my.cnf , ou sobrescreverá as credenciais antigas existentes ~ / .my.cnf por novas.

A grande vantagem dessa abordagem é ter apenas uma variável "mysql_root_password", que é sempre a correta do ponto de vista de um manual. No (s) sistema (s) presente (s), ~ / .my.cnf é um tipo de armazenamento para credenciais mysql locais atuais.

- 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

com client.my.cnf.j2:

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

Leitura adicional

Notas relevantes da ansible-mysql_user_module-documentation :

  • Nota 1:

    Para proteger esse usuário como parte de um manual independente, você deve criar pelo menos duas tarefas: a primeira deve alterar a senha do usuário root, sem fornecer detalhes de login_user / login_password. O segundo deve eliminar um arquivo ~ / .my.cnf que contém as novas credenciais raiz. As execuções subsequentes do manual serão bem-sucedidas lendo as novas credenciais do arquivo. ansible-mysql_user_module, notas

  • Nota 2:

    A senha de login e o usuário de login são necessários quando você passa credenciais. Se não houver nenhuma, o módulo tentará ler as credenciais em ~ / .my.cnf e, finalmente, voltará a usar o login padrão do MySQL de 'root' sem senha. ansible-mysql_user_module, notas

Markus Schulte
fonte
Eu gosto bastante dessa abordagem e é muito melhor que a versão na minha resposta. Provavelmente deve ser a resposta aceita.
precisa saber é o seguinte
2
Isso é útil, mas em muitos sistemas existem realmente 4 usuários 'raiz' criados, com os Hosts 127.0.0.1, localhost, :: 1 e qualquer que seja o nome do host local. O acima modifica apenas root @ localhost, deixando três outras contas raiz com senhas em branco.
robo
Listar todos os usuários raiz: mysql --database mysql --execute "select host from user where user = 'root';". Esta postagem faz o mesmo que esta resposta, mas possui um código para definir todas as senhas.
precisa saber é o seguinte
2

Para a próxima pessoa que vem procurando respostas por aqui. Enquanto a resposta aceita for verdadeira, você deve ser extremamente diligente se estiver usando o MySQL 5.7, porque não há login anônimo permitido no mysqld no modo daemonizado (serviço). Em vez disso, você DEVE raspar o /var/log/mysqld.log para obter uma senha TEMPORÁRIA que alguém decidiu criar e usar na senha de login_password = ydaetskcoR. Esse foi um recurso que eles decidiram implementar na versão 5.7 do repositório dev. Se você quiser evitá-lo, use uma versão mais antiga (5.6).

Documentação aqui: 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/

einarc
fonte
1

Existe um manual do Ansible usado para proteger o MySQL.

https://github.com/dev-sec/ansible-mysql-hardening

Isso não apenas alterou a senha de root, mas também executou algumas etapas adicionais para proteger o servidor.

Dê uma olhada no arquivo leia-me.

ww12z
fonte
Não parece que ele lida com a alteração da senha root quando está em branco.
Flickerfly