web-dev-qa-db-ja.com

ansibleを介してmysqlデータベースを作成できません

Mysql 5.7をリモートシステムにインストールしています。新しいデータベースを作成し、そのデータベースへの新しいユーザーアクセスを作成する必要があります。 mysql-community-server 5.7なので、最初に/var/log/mysqld.logからパスワードをgrepする必要があります

[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を使用してrootアクセスを付与する方法を教えてください。そのためのスクリプトを作成しますか?次のプレイブックを実行してエラーが発生しました

- 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

エラー:

 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)\")"}

解決策を見つけるために私を助けてください。ansibleの初心者です。rootパスワードをリセットする方法も知りたいです。

注:私はすでに.my.cnfをmysqlログインのターゲットcontainsgのユーザー名とパスワードにコピーしましたが、手動でそれを実行しました。最初にその一時的なパスワードを使用してログインしたいと思います。

4
arun mohan

MySQL 5.7の「フレッシュ」インストールでは、ソケットファイルを使用したローカルrootログインが許可されます(重要なポイントはlogin_unix_socket: /var/run/mysqld/mysqld.sock in tasks/main.yml)

これと同様の質問に対する他の回答で言及されている「シェル」回避策にもかかわらず、それらは仕事をします-それらはべき等ではなく、良くない「変更された」状態を生成します。

次のスニペットは、Ubuntu 18.04以降では完全にべき等な方法で機能します

tasks/main.yml

  # ...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

[client]
user=root
password={{ mysql.root_db_password }}

defaults/main.yml

mysql:
  root_db_password: REDACTED
  hosts:
    - "{{ ansible_hostname }}"
    - 127.0.0.1
    - ::1
    - localhost
7
maoizm

mysql_db module notes および mysql_user notes (両方に同じテキスト)で述べたように:

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

したがって、いくつかのオプションがあります。

資格情報をタスクに渡す

- 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_USERとDB_USER_PASSを、dbユーザーの管理者資格情報に置き換えます。

ただし、すべてのmysqlタスクに認証情報を配置する必要があり、認証情報はansibleコードに含める必要があるため、これは最適とはほど遠いものです。 ansible vault を使用してこれを軽減できますが、より良いオプションがあります。

~/.my.cnf資格情報付きファイル

作成または編集~/.my.cnfユーザーのホーム(おそらくroot)にmysql資格情報を含むファイル:

[client]
user=root
password="PASSWORD"

(他の接続の詳細を追加する必要がある場合があります)。

3番目のオプションは、CentOSでどのように機能するかわかりませんが、主にrootユーザーが認証情報を使用せずにmysqlに接続できることを意味します。通常は/root/-.my.cnfファイルに依存しますが、CentOSでは異なる場合があります。

1
sanzante

グーグルした後、一時的なパスワードをリセットする方法を見つけました:

- 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 
}}"'
0
arun mohan