在伺服器運維活動中,我們經常需要做一項工具就是將好多年的用戶資料庫日誌文件截斷並收縮為最小,以節省大量的磁碟空間。當資料庫只有一兩個時可以手動操作,但資料庫數量眾多時,就需要採用sql腳本,批量化執行這個過程。 本人寫了一段這樣的腳本。並且經過驗證執行無誤。現在分享出來,您也可以執行以下sql腳本來 ...
1. mysql_user 模塊
mysql_user模塊用來添加,刪除用戶以及設置用戶許可權
創建MySQL資料庫的用戶與口令(非root@localhost用戶),直接通過playbooks中的案例來說明吧。
- name: 創建MySQL資料庫用戶--user_test mysql_user: # ----- 登陸資料庫 login_host: "localhost" login_port: 3306 login_user: root login_password: "{{ root_password }}" ## 添加login_unix_socket,否則報錯:FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (2002, \"Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)\ login_unix_socket: "/你sock文件的路徑/mysql.sock" # ----- 創建的用戶的信息 name: "user_test" host: "%" password: "{{ user_test_password }}" priv: "{{ item }}" # ----- state: present with_items: - "*.*:REPLICATION SLAVE,REPLICATION CLIENT" - "*.*:PROCESS" - "performance_schema.*:select" ### 許可權之間不要有空格,否則報錯--例如:(item=*.*:REPLICATION SLAVE, REPLICATION CLIENT) => {"ansible_loop_var": "item", "changed": false, "item": "*.*:REPLICATION SLAVE, REPLICATION CLIENT", "msg": "invalid privileges string: Invalid privileges specified: frozenset([' REPLICATION CLIENT'])"}
說明,這個案例中,有提到常見的錯誤,例如有關login_unix_socket參數不設置,可能導致的錯誤。
2.mysql_query
執行查看或DML語句。
查詢的案例
- hosts: db_servers tasks: - name: Query MySQL table mysql_query: login_host: localhost login_user: db_user login_password: db_pass db: db_name query: SELECT * FROM table_name WHERE column_name = 'value'; register: result - name: Print query result debug: var: result.stdout_lines
使用 mysql_query 模塊執行一個查詢,並將結果存儲在變數 result 中,並且使用 debug 模塊列印出結果。
insert的案例,請移步至:https://www.yzktw.com.cn/post/729455.html
3.mysql_db
mysql_db模塊用於建立、刪除、導入和導出資料庫.
建立資料庫 state="present"
刪除資料庫 state="absent"
導出資料庫 state="dump"
導入資料庫 state="import"
具體案例 建議參閱:
https://www.kancloud.cn/hiyang/ansiblebook/306176
4.mysql_replication
功能:搭建主從。
直接看代碼,高效+容易上手。
# 從庫,執行Change Master # -- 只有是從庫的時候,才需要執行這一步 - name: "從庫:Change Master" mysql_replication: mode: changemaster # ------------ # 登陸MySQL login_user: root login_password: "{{ mysql_database_user_root_password }}" # ------------ # Change Master master_host: "{{ mysql_replication_master_host }}" master_port: "{{ mysql_replication_master_port }}" master_user: "{{ mysql_replication_user_name }}" master_password: "{{ mysql_replication_user_password }}" master_log_file: "{{ mysql_replication_master_status['File'] }}" master_log_pos: "{{ mysql_replication_master_status['Position'] }}" when: db_role == "slave" # 從庫:Start Slave # -- 只有是從庫的時候,才需要執行這一步 - name: 從庫:Start Slave mysql_replication: mode: startslave # ------------ # 登陸MySQL login_user: root login_password: "{{ mysql_database_user_root_password }}" # ------------ when: db_role == "slave" # 從庫:獲取從庫信息 - name: 從庫:獲取從庫信息 mysql_replication: mode: getslave # ------------ # 登陸MySQL login_user: root login_password: "{{ mysql_database_user_root_password }}" # ------------ register: mysql_replication_slave_status when: db_role == "slave" # 輸出從庫信息 - name: "從庫:Slave Status" debug: msg: "Slave_IO_Running【{{ mysql_replication_slave_status['Slave_IO_Running'] }}】 / Slave_SQL_Running【{{ mysql_replication_slave_status['Slave_SQL_Running'] }}】 / Slave_SQL_Running_State【{{ mysql_replication_slave_status['Slave_SQL_Running_State'] }}】 / Seconds_Behind_Master【{{ mysql_replication_slave_status['Seconds_Behind_Master'] }}】" when: db_role == "slave"
5. service模塊
這個是通用的服務管理模塊。
# 啟動MySQL服務 - name: 啟動MySQL服務 service: name: mysqld state: started enabled: yes
6. MySQL初始化後後,修改密碼
初始化後,一般修改root的密碼的命令如下
mysqladmin -h localhost -u root -p'在path_mysql_error_log中查找的 A temporary password' password '新密碼'
這種情況,通過ansibe 操作的命令, 可以參閱:https://gitee.com/leviathan-litan/ansible-mysql-mha/blob/master/playbooks/roles/mysql/tasks/mysql_database_user_password.yml
但是:有些人在初始化的時候,添加了--initialize-insecure參數,此時,初始化不會生出臨時密碼,或者說生成的臨時密碼為空。此時再用上面的代碼就不可以了。
回到原點:想想這種情況在MySQL控制台是怎麼操作的???
嘿嘿..... 是通過以下命令,將root賬戶的密碼更改為“newpassword”的。
mysqladmin -u root password "newpassword"
那麼在ansible中,編寫的劇本可以如下:
# 通過得到的臨時口令,修改資料庫的口令為變數文件中設置的口令 - name: 修改MySQL的臨時口令 shell: "mysqladmin -h localhost -u root password '{{ new_root_password }}'" ignore_errors: yes
7.其他註意項
還有一點需要補充的是: 運行的的時候,很可能報錯,說 mysqladmin不是shell 或 bash 命令之類的錯誤, 因此建議在寫劇本時,mysqladmin 寫出完整路徑,例如: /usr/local/mysql/bin/mysqladmin。
mysql命令,建議同樣操作。
補充學習
(1)https://docs.ansible.com/ansible/devel/modules/mysql_query_module.html
(2)ansible自動化部署mysql主從部署劇本
https://blog.csdn.net/u010282639/article/details/131337036