Ansible: /root/.my.cnfを使用すると、2.7.1でmysql_userが壊れました

作成日 2018年10月29日  ·  29コメント  ·  ソース: ansible/ansible



概要

2.7.0から2.7.1にアップグレードすると、 mysql_userモジュールからこのエラーが発生し始めました。

unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, \"Access denied for user 'root'@'localhost'\")

タスクは次のとおりです。

# Write password to root home as readable only by root so future mysql
# operations can function.
- name: Write root login credentials
  copy:
      dest: /root/.my.cnf
      owner: root
      group: root
      mode: 0600
      content: |
          # {{ ansible_note }}
          [client]
          user=root
          password={{ db_root_password }}

# By default the root user has no password. Set one.
- name: Set root user password
  mysql_user:
      host: "{{ item }}"
      name: root
      password: "{{ db_root_password }}"
      # Login without credentials
      check_implicit_admin: yes
      state: present
  with_items:
      - localhost
      - "{{ ansible_hostname }}"
      - 127.0.0.1
      - ::1

後者は失敗します。

Ansible2.7.0は正常に動作します。

問題の種類
  • バグレポート
コンポーネント名

mysql_user

ANSIBLEバージョン


`` `下に貼り付けます
ansible 2.7.1
設定ファイル=なし
構成されたモジュール検索パス= ['/ Users / esamatti / .ansible / plugins / modules'、 '/ usr / share / ansible / plugins / modules']
ansiblepythonモジュールの場所= / usr / local / lib / python3.7 / site-packages / ansible
実行可能場所= / usr / local / bin / ansible
pythonバージョン= 3.7.0(デフォルト、2018年10月2日、09:18:58)[Clang 10.0.0(clang-1000.11.45.2)]


##### CONFIGURATION
<!--- Paste verbatim output from "ansible-config dump --only-changed" between quotes -->
```paste below
ANSIBLE_PIPELINING(/Users/epeli/code/playbooks/ansible.cfg) = True
ANSIBLE_SSH_ARGS(/Users/epeli/code/playbooks/ansible.cfg) = -o ForwardAgent=yes
DEFAULT_FORKS(/Users/epeli/code/playbooks/ansible.cfg) = 100
DEFAULT_HOST_LIST(/Users/epeli/code/playbooks/ansible.cfg) = ['/Users/epeli/code/playbooks/tools/dynamic-inventory']
DEFAULT_REMOTE_USER(/Users/epeli/code/playbooks/ansible.cfg) = root
DEFAULT_SUDO_FLAGS(/Users/epeli/code/playbooks/ansible.cfg) = -HE
DEFAULT_VAULT_PASSWORD_FILE(env: ANSIBLE_VAULT_PASSWORD_FILE) = /Users/epeli/.ansible-vault-password
OS /環境

macOS Mojaveバージョン10.14(18A391)

そしてUbuntu18.04サーバー

再現する手順

概要を参照してください

期待される結果

実績


paste below TASK [mariadb : Set root user password] ******************************************************************************************************************************************************************************** failed: [1.2.3.4] (item=localhost) => {"changed": false, "item": "localhost", "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, \"Access denied for user 'root'@'localhost'\")"} failed: [1.2.3.4] (item=customer) => {"changed": false, "item": "customer", "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, \"Access denied for user 'root'@'localhost'\")"} failed: [1.2.3.4] (item=127.0.0.1) => {"changed": false, "item": "127.0.0.1", "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, \"Access denied for user 'root'@'localhost'\")"} failed: [1.2.3.4] (item=::1) => {"changed": false, "item": "::1", "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, \"Access denied for user 'root'@'localhost'\")"}

affects_2.7 bug collection community.general database has_pr module mysql needs_collection_redirect python3 community test

最も参考になるコメント

わかりました、見つけました。 10月2日の#ansible-develでのディスカッションで、接続に問題があったユーザー(空の文字列パスワードの処理が問題であると最初に疑った)は、最終的にlogin_unix_socketを使用する必要があることに気付きました。 (私が上で述べた異なる振る舞いのために)、それでそれは彼のために働きました。 残念ながら、彼はその問題を作成しませんでした。

とにかく、 @ epeli @anniemelen @ bchanan03login_unix_socketオプションを試して、問題が解決するかどうかを確認できますか?

全てのコメント29件

こんにちは@epeli 、この問題を提出していただきありがとうございます!

ボットのヘルプについては、ここをクリックしてください

説明で識別されるファイル:

これらのファイルが不正確な場合は、説明のcomponent nameセクションを更新するか、 !componentボットコマンドを使用してください。

ボットのヘルプについては、ここをクリックしてください

@epeliこんにちは、 https://github.com/ansible/ansible/pull/47809でこれを修正しますか?PRにコメントを追加してください

@timorungeご覧のとおり、このパッチがなくても、さまざまなmysqlユーザーを追加できました...
はい、私の問題はこのPRとは関係ありませんが、#47736と関係があるので、そこで話し続けます。 申し訳ありませんが、Dockerfileを提供できません。

同じことを別の順序で試しましたか? 基本的な意味:最初にパスワードなしでログインし、rootパスワードを設定し、その後.my.cnfを生成しますか?

最近使用しているPythonDBコネクタはどれですか? MySQLdbまたはPyMySQL?

こんにちは、みんな、
Ansible 2.7.5で同じ問題が発生する可能性はありますか? mysql_dbを使用

ansible 2.7.5
  config file = None
  configured module search path = [u'/home/vagrant/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python2.7/dist-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 2.7.12 (default, Nov 12 2018, 14:36:49) [GCC 5.4.0 20160609]

ランニング:
`` `-名前:install_gerrit | MySQL DBの作成(使用する場合)
mysql_db:
名前: "{{item.db}}"
エンコーディング:latin1
状態:存在
with_items: '{{gerrit_db_info}}'
いつ:item.typeが定義され、item.type == "mysql"

Error:

失敗しました:[192.168.202.15] {
「変更された」:false、
「呼び出し」:{
"module_args":{
"照合": ""、
"config_file": "/root/.my.cnf"、
"connect_timeout":30、
"エンコーディング": "latin1"、
"ignore_tables":[]、
"login_host": "localhost"、
"login_password":null、
"login_port":3306、
"login_unix_socket":null、
"login_user":null、
"名前": "reviewdb"、
「クイック」:本当、
"single_transaction":false、
"ssl_ca":null、
"ssl_cert":null、
"ssl_key":null、
「状態」:「現在」、
「ターゲット」:null
}
}、
"アイテム":{
"db": "reviewdb"、
"host": "localhost"、
"合格": "xxxxxx"、
"タイプ": "mysql"、
"user": "gerrit"
}、
"msg": "データベースに接続できません。login_userとlogin_passwordが正しいか、/ root / .my.cnfに資格情報があります。例外メッセージ:(1698、u \"ユーザー 'root' @ 'localhost' \のアクセスが拒否されました")"
}
`` `

mysql_dbと同じ問題のようです-ansiblev2.7.0に戻ると問題が解決しました。

それがどこにあったかはわかりませんが、しばらく前(数週間?数ヶ月?)に同様の問題を調べました。その理由は、MySQLdb(libmysqlに基づく)がデフォルトでUnixソケットを使用して接続していたのに対し、PyMySQLはデフォルトでは、TCP経由でlocalhostに接続していました。 MySQLサーバーへのルートアクセスがどのように構成されているかに応じて、これはこの問題を回避するのに役立つ場合があります。

私が言ったように、私は以前にこれをどこに書いたかを本当に覚えていません、そして私はもう詳細について本当によくわかりません、しかし多分これはこの問題を抱えているあなたの一人にそれを解決する方法のヒントを与えるでしょう:)

わかりました、見つけました。 10月2日の#ansible-develでのディスカッションで、接続に問題があったユーザー(空の文字列パスワードの処理が問題であると最初に疑った)は、最終的にlogin_unix_socketを使用する必要があることに気付きました。 (私が上で述べた異なる振る舞いのために)、それでそれは彼のために働きました。 残念ながら、彼はその問題を作成しませんでした。

とにかく、 @ epeli @anniemelen @ bchanan03login_unix_socketオプションを試して、問題が解決するかどうかを確認できますか?

こんにちは、
Centos7、ansible2.7.6でも同じ問題が発生しました。
specifing socket=/var/lib/mysql/mysql.sock~/.my.cnf
またはmysql_dbタスクのlogin_unix_socket: /var/lib/mysql/mysql.sockオプション
接続エラーを修正しています。

CC @Xyon @bmalynovytch @dagwieers @michaelcoburn @oneiroi @tolland
ボットのヘルプについては、ここをクリックしてください

今まで申し訳ありませんが、このバグはまだ解決されていないと思います。

@nizarakbarmは私が提案したことを試し

こんにちは@ felixfontein 、Ubuntu 18.04では、 @ efflamlemailletによる
私は、次のように思います:
https://stackoverflow.com/questions/41846000/mariadb-password-and-unix-socket-authentication-for-root
も関連しています。

こんにちは、
@pouyanaが言った

@felixfontein動作しますが、〜/ .my.cnfは使いたくありません

@nizarakbarm login_unix_socket: /var/lib/mysql/mysql.sockはAnsibleで指定するものです。 あなたはそれを試しましたか?

@efflamlemailletは、より正確には、Ansibleモジュール自体ではなく、PythonMySQL接続ライブラリです。 古いライブラリであるMySQLdb(libmysqlに基づく)はUnixソケットを優先し、新しいライブラリであるPyMySQLはTCP接続を優先します。 プレイブック/ロールで明示的であり、接続方法を指定している場合、それは問題ではありません。 ただし、そうでない場合は、モジュールが使用しているライブラリによって異なります。 モジュールは最初にPyMySQLを試行し、PyMySQLが使用できない場合はMySQLdbにフォールバックします。

桶、お返事ありがとうございます。 @felixfonteinあなたの答えから、問題の理由を理解するのに役立ちます。

全体として、バグと見なすべきかどうかを知る必要がありますか?
その場合、インストールされているドライバーがMySQLdbまたはPyMySQLの場合、AnsibleモジュールがPyMySQLのデフォルトの動作をオーバーライドして、モジュールが同じ方法で接続するようにすることができます(接続オプションが指定されていない場合)。

私の場合、この回避策も役立ちました
login_unix_socket: /var/run/mysqld/mysqld.sock

ansible 2.8.4
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/home/eldar/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.15+ (default, Nov 27 2018, 23:36:35) [GCC 7.3.0]
- name: Create database
  mysql_db:
    name: dbname
    state: present
    login_unix_socket: /var/run/mysqld/mysqld.sock  

これを指摘してくれてありがとう@felixfontein
パラメータlogin_unix_socket: /var/run/mysqld/mysqld.sock指定すると、問題が解決しました。

ただし、ファイルtasks/databases.ymltasks/secure-installation.yml 、およびtasks/users.ymlすべてのmysql_{user,db}モジュールタスクを更新する必要がありました。

私はこれをドキュメントhttps://github.com/ansible/ansible/pull/66848で説明しました
2.10が付属しています

close_me

このページは役に立ちましたか?
0 / 5 - 0 評価