web-dev-qa-db-ja.com

Ubuntuでansibleを使用してMySQLをインストールする

迷惑なUbuntuにMySQLをインストールする際に問題があります。

これはMySQLの一部です

---
- name: Install MySQL
  apt:
    name: "{{ item }}"
  with_items:
    - python-mysqldb
    - mysql-server

- name: copy .my.cnf file with root password credentials
  template: 
    src: templates/root/.my.cnf
    dest: ~/.my.cnf
    owner: root
    mode: 0600

- name: Start the MySQL service
  service: 
    name: mysql 
    state: started
    enabled: true

  # 'localhost' needs to be the last item for idempotency, see
  # http://ansible.cc/docs/modules.html#mysql-user
- name: update mysql root password for all root accounts
  mysql_user: 
    name: root 
    Host: "{{ item }}" 
    password: "{{ mysql_root_password }}" 
    priv: "*.*:ALL,GRANT"
  with_items:
    - "{{ ansible_hostname }}"
    - 127.0.0.1
    - ::1
    - localhost 

そして、私はこのエラーがあります

failed: [default] => (item=vagrant-ubuntu-trusty-64) => {"failed": true, "item": "vagrant-ubuntu-trusty-64"}
msg: unable to connect to database, check login_user and login_password are correct or ~/.my.cnf has the credentials
failed: [default] => (item=127.0.0.1) => {"failed": true, "item": "127.0.0.1"}
msg: unable to connect to database, check login_user and login_password are correct or ~/.my.cnf has the credentials
failed: [default] => (item=::1) => {"failed": true, "item": "::1"}
msg: unable to connect to database, check login_user and login_password are correct or ~/.my.cnf has the credentials
failed: [default] => (item=localhost) => {"failed": true, "item": "localhost"}
msg: unable to connect to database, check login_user and login_password are correct or ~/.my.cnf has the credentials

私の.my.cnfは

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

そして、サーバーにコピーされたとき

[client]
user=root
password=root

〜/ .my.cnfが作成される理由がわかりません

プロジェクト Github

ありがとう

29
Ajouve

mysql-serverがヘッドレスでインストールされている場合、パスワードはありません。したがって、.my.cnfを機能させるには、空のパスワード行が必要です。 .my.cnfでテストしたものは次のとおりです。

[client]
user=root
password=

.my.cnfvagrantユーザーディレクトリに、rootが所有し、rootとしてのみ読み取り可能な状態で置くことも少し奇妙です。

.my.cnfでパスワードが空白であることを確認した後、これら4つのコンテキストでルートのパスワードを適切に設定できました。 .my.cnfを更新する必要があるため、その後実行に失敗し、Note等性テストに失敗することに注意してください。

Ansible mysql_userモジュールページには、パスワードの書き込みとthen.my.cnfファイルの書き込みを提案するメモがあります。それを行う場合、mysql_userアクションに対するwhere句が必要です(おそらくその前にfile statを使用)。

さらにエレガントなのは、check_implicit_adminlogin_userおよびlogin_passwordを一緒に使用することです。それは美しくべき等です。

3番目の方法として、おそらくcheck_implicit_adminでさらに簡単になります。

いくつかの新しいサーバーでテストされた、上記を示す私の成功したプレイブックは次のとおりです。これを誇りに思います。注.my.cnfはこれらすべてに不要です。

---
- hosts: mysql
  vars:
    mysql_root_password: fart
  tasks:
  - name: Install MySQL
    apt: name={{ item }} update_cache=yes cache_valid_time=3600 state=present
    Sudo: yes
    with_items:
    - python-mysqldb
    - mysql-server
  #- name: copy cnf
  #  copy: src=.my.cnf dest=~/.my.cnf owner=ubuntu mode=0644
  #  Sudo: yes
  - name: Start the MySQL service
    Sudo: yes
    service: 
      name: mysql 
      state: started
      enabled: true
  - name: update mysql root password for all root accounts
    Sudo: yes
    mysql_user: 
      name: root 
      Host: "{{ item }}" 
      password: "{{ mysql_root_password }}"
      login_user: root
      login_password: "{{ mysql_root_password }}"
      check_implicit_admin: yes
      priv: "*.*:ALL,GRANT"
    with_items:
      - "{{ ansible_hostname }}"
      - 127.0.0.1
      - ::1
      - localhost 

(編集-my.cnfを削除)

37
tedder42

これが私の役目を果たすMySQLの完全な役割です。

vars/main.yml

mysql_root_pass: mypassword #MySQL Root Password

asks/main.yml

---
 - name: Install the MySQL packages
   apt: name={{ item }} state=installed update_cache=yes
   with_items:
     - mysql-server-5.6
     - mysql-client-5.6
     - python-mysqldb
     - libmysqlclient-dev

 - name: Update MySQL root password for all root accounts
   mysql_user: name=root Host={{ item }} password={{ mysql_root_pass }} state=present
   with_items:
     - "{{ ansible_hostname }}"
     - 127.0.0.1
     - ::1
     - localhost

 - name: Copy the root credentials as .my.cnf file
   template: src=root.cnf.j2 dest=~/.my.cnf mode=0600

 - name: Ensure Anonymous user(s) are not in the database
   mysql_user: name='' Host={{ item }} state=absent
   with_items:
     - localhost
     - "{{ ansible_hostname }}"

 - name: Remove the test database
   mysql_db: name=test state=absent
   notify:
     - Restart MySQL

templates/root.cnf.j2

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

handlers/main.yml

---
 - name: Restart MySQL
   service: name=mysql state=restarted

site.yml

---
- hosts: all
  become: yes
  gather_facts: yes
  roles:
    - mysql

ヘルプが必要な場合は、このgithub link を確認してください。ありがとう

12
Arbab Nazar