Ansible:サーバーを再プロビジョニングしてMySQLサーバーのルートパスワードを変更する方法


14

サーバーにAnsible Playbookをプロビジョニングしました。root / bedrock-Ansibleプレイブックを使用しました。

タスクの1つは、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

私の推測では、MySQLルートパスワードが設定されると、サーバーの再プロビジョニングはこのパスワードを変更できません。

Ansibleでサーバーを再プロビジョニングすることで、MySQLルートパスワードを変更することはまったく可能ですか?私のオプションは何ですか?

回答:


15

あなたが持っている問題は、Ansibleがあなたがそれを変更したいのと同じルートパスワードを使用してログインしようとしていることです:

- 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プレイブックroles/wordpress-setup/tasks/database.yml全体を実行して、server.ymlこれが適切に設定されていることを確認することもできます。


すばらしい回答をありがとう。これは間違いなく行く方法です。コンソールでrootパスワードをリセットしましたmysqladmin-しかし、これはあなたの答えを見る前
でした-luqo33

7

〜/ .my.cnfを誤用してmysql-root-passwordを変更できる可能性があります。

秘Theは、パスワードを設定するタスク「Set 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」が1つしかないことです。これは、プレイブックの観点からは常に正しい変数です。現在のシステムでは、〜/ .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

client.my.cnf.j2の場合:

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

参考文献

ansible-mysql_user_module-documentationからの関連メモ:

  • 注1:

    このユーザーをべき等のプレイブックの一部として保護するには、少なくとも2つのタスクを作成する必要があります。最初のタスクは、login_user / login_passwordの詳細を提供せずに、rootユーザーのパスワードを変更する必要があります。2番目は、新しいルート資格情報を含む〜/ .my.cnfファイルをドロップする必要があります。その後、プレイブックの後続の実行は、ファイルから新しい資格情報を読み取ることにより成功します。ansible-mysql_user_module、ノート

  • 注2:

    資格情報を渡すときは、login_passwordとlogin_userの両方が必要です。何も存在しない場合、モジュールは〜/ .my.cnfから資格情報を読み取ろうとし、最後にパスワードなしで「root」のMySQLデフォルトログインを使用するようにフォールバックします。ansible-mysql_user_module、ノート


私はこのアプローチが非常に好きで、私の答えのバージョンよりもはるかに優れています。おそらく受け入れられた答えであるべきです。
ydaetskcoR

2
これは便利ですが、多くのシステムでは実際に4つの「root」ユーザーが作成されており、ホスト127.0.0.1、localhost、:: 1、およびローカルホスト名は何でもあります。上記はroot @ localhostのみを変更し、他の3つのルートアカウントに空白のパスワードを残します。
ロボ

すべてのrootユーザーをリストしますmysql --database mysql --execute "select host from user where user = 'root';"この投稿はこの回答と同じですが、すべてのパスワードを設定するためのコードが含まれています。
hlovdal

2

この辺りで答えを探しに来る次の人のために。MySQL 5.7を使用している場合、デーモン化モード(サービス)のmysqldでは許可されていない匿名ログインがないため、受け入れられた答えは真実ですが、さらに熱心でなければなりません。代わりに、誰かがlogin_password = ydaetskcoRで作成して使用することを決めたTEMPORARYパスワードの/var/log/mysqld.logをスクレイプする必要があります。これは、開発者がバージョン5.7のdevリポジトリに実装することを決定した機能でした。したがって、それを避けたい場合は、古いバージョン(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/


1

MySQLを強化するために使用されるAnsibleプレイブックがあります。

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

これにより、ルートパスワードが変更されるだけでなく、サーバーを強化するための追加手順も実行されます。

READMEファイルをご覧ください。


ルートパスワードが空白の場合、ルートパスワードの変更を処理するようには見えません。
フリッカーフライ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.