2017-04-14 104 views
2

你們中的任何一個人都有一個想法,建立一個MySQL的MySQL更新根密碼和授予特權?我已經創建了我的劇本,並在全新的安裝上按預期工作,沒有任何問題。但是當我再次進行流浪漢配置時,現在無法設置root密碼,並且出現錯誤。下面是我的代碼Ansible設置mysql root密碼

mysql.yml

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

- name: drop database {{ dbname }} 
    mysql_db: 
    name: "{{ dbname }}" 
    login_user: "{{ dbuser }}" 
    login_password: "{{ dbpass }}" 
    state: absent 
    delegate_to: "{{ dbhost }}" 
    run_once: true 

- name: create database {{ dbname }} 
    mysql_db: 
    name: "{{ dbname }}" 
    login_user: "{{ dbuser }}" 
    login_password: "{{ dbpass }}" 
    state: present 
    delegate_to: "{{ dbhost }}" 
    run_once: true 

- name: ensure mysql is running and starts on boot 
    service: name=mysql state=started enabled=true 

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

- name: update mysql root password for all root accounts "{{ dbpass }}" 
    mysql_user: name={{ dbuser }} host={{ item }} password="{{ dbpass }}" priv="{{ dbname }}.*:ALL,GRANT" 
    with_items: 
    - localhost 
    - 127.0.0.1 

- name: grant privilege on "{{ dbname }}" to "{{ dbuser }}" 
    mysql_user: 
    name: "{{ item.user }}" 
    host: "{{ item.host }}" 
    password: "{{ dbpass }}" 
    login_user: "{{ dbuser }}" 
    login_password: "{{ dbpass }}" 
    priv: "{{ dbname }}.*:ALL" 
    state: present 
    with_items: 
    - { user: "{{ dbuser }}" , host: localhost } 
    - { user: "{{ dbuser }}" , host: 127.0.0.1 } 
    delegate_to: "{{ dbhost }}" 
    run_once: true 

- name: ensure anonymous users are not in the database 
    mysql_user: name='' host={{ item }} state=absent 
    with_items: 
    - 127.0.0.1 
    - localhost 

- name: remove the test database 
    mysql_db: name=test state=absent 

my.cnf.j2

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

默認/ main.yml

--- 
dbhost: localhost 
dbname: mydb 
dbuser: root 
dbpass: root 

我能夠只是做一切如果它全新安裝但第二次運行它會給我錯誤

enter image description here

回答

3

好像你更新.my.cnf密碼,您嘗試與下一個任務去改變它之前。

並且您可能想要在更新密碼時使用host_all選項,因爲with_items運行模塊多次,並且可能存在相同的錯誤:更改第一項上的密碼並且無法連接第二項。

+0

在更新實際的root帳戶之前,您可能需要先更新.my.cnf。 –

2

已經找出了正確的答案。所以我會加我的答案只是對於那些和我一樣麻煩的人的參考

========================== =================================================

--- 
# Install the needed package of mysql 
- name: Install MySQL packages 
    apt: pkg={{ item }} state=installed 
    with_items: 
    - bundler 
    - mysql-server 
    - mysql-client 
    - libmysqlclient-dev 
    - python-mysqldb 
    - build-essential 

# Update the root password immediately. This should come first as ordering 
# is very important 
- name: Update mysql root password for all root accounts "{{ dbpass }}" 
    mysql_user: name=root password="{{ dbpass }}" priv="*.*:ALL,GRANT" 

# After we update the root password we are going to use this everytime 
# we do an update or create something on mysql 
# we will create a copy in /root/.my.cnf as this will be use to check 
# the login or root credential. Meaning this should contain the latest 
# password of the root (right after we update the root password) 
- name: copy .my.cnf file with root password credentials 
    template: src=my.cnf.j2 dest=/root/.my.cnf owner=root mode=0600 
    notify: Restart the MySQL service 

# Remove the unnecessary db for now 
- name: Remove the test database 
    mysql_db: name=test state=absent 

# Make sure no anonymous user in the db 
- name: ensure anonymous users are not in the database 
    mysql_user: name='' host={{ item }} state=absent 
    with_items: 
    - 127.0.0.1 
    - localhost 

# Delete the user if its existing so that we can create the user again 
- name: Delete deploy DB user 
    mysql_user: name={{ dbuser }} password={{ dbpass }} state=absent 
    notify: Restart the MySQL service 

# Create our own user aside from the root password 
# here our root password and new user created will have the same password 
- name: Add deploy DB user 
    mysql_user: name={{ dbuser }} password={{ dbpass }} priv=*.*:ALL,GRANT state=present 
    notify: Restart the MySQL service 

# Delete databases. This should not be included in production. 
# this is only on local so its fine. 
- name: Drop databases 
    mysql_db: 
    name: "{{ item }}" 
    login_user: "{{ dbuser }}" 
    login_password: "{{ dbpass }}" 
    state: absent 
    with_items: 
    - db1 
    - db2 
    - "{{ dbname }}" 
    run_once: true 

# Recreate the databases 
- name: Create databases 
    mysql_db: 
    name: "{{ item }}" 
    login_user: "{{ dbuser }}" 
    login_password: "{{ dbpass }}" 
    state: present 
    with_items: 
    - db1 
    - db2 
    - "{{ dbname }}" 
    run_once: true 

# Grant the privilege for the newly created user 
- name: grant privilege on "{{ dbname }}" to "{{ dbuser }}" 
    mysql_user: 
    name: "{{ item.user }}" 
    host: "{{ item.host }}" 
    password: "{{ dbpass }}" 
    priv: "*.*:ALL" 
    state: present 
    with_items: 
    - { user: "{{ dbuser }}" , host: localhost } 
    - { user: "{{ dbuser }}" , host: 127.0.0.1 } 
+0

這與我的回答有何不同,這個順序很重要? –

+1

@KonstantinSuvorov實際上沒有區別。我剛剛爲此添加了完整的yml文件。只要有人對文件的實際結構可能看起來很感興趣即可 –