Ansible: सर्वर को रीप्रोविजन करके MySQL सर्वर रूट पासवर्ड को कैसे बदलें


14

मैंने अपने सर्वर को Ansible playbook के साथ प्रोविज़न किया है। मैंने रूट / बेडरॉक-एन्सिबल प्लेबुक का उपयोग किया है

कार्यों में से एक mysql रूट उपयोगकर्ता पासवर्ड के साथ mysql सर्वर स्थापित करना था।

अब मुझे तत्काल इस पासवर्ड को बदलने की आवश्यकता है। मैंने जो कदम उठाए:

  1. मैंने अस्थिर भूमिकाओं के लिए चर को अद्यतन किया
  2. मैंने ansible-playbook -i hosts/staging server.ymlसर्वर को रीप्रोविजन करने के लिए कमांड निष्पादित की

सभी कार्यों को उम्मीद के अनुसार निष्पादित किया गया (कोई परिवर्तन नहीं), लेकिन [mariadb | Set root user password]इस संदेश के साथ स्क्रिप्ट विफल रही :

msg: unable to connect to database, check login_user and login_password are correct or ~/.my.cnf has the credentials

मेरा अनुमान है कि एक बार MySQL रूट पासवर्ड सेट हो जाने के बाद, सर्वर को रीप्रोविजन करने से यह पासवर्ड नहीं बदल सकता है।

क्या यह संभव है कि MySQL रूट पासवर्ड को सर्वर के साथ एंसिबल के साथ रिप्रोड्यूस किया जाए? मेरे विकल्प क्या हैं?

जवाबों:


15

आपके पास समस्या यह है कि Ansible लॉगिन करने के लिए उसी रूट पासवर्ड का उपयोग करने की कोशिश कर रहा है जैसा कि आप इसे बदलना चाहते हैं:

- name: Set root user password
  mysql_user: name=root
              host="{{ item }}"
              password="{{ mysql_root_password }}"
              check_implicit_admin=yes
              login_user="{{ mysql_user }}"
              login_password="{{ mysql_root_password }}"
              state=present

यदि आप इसे बदलने के लिए इस नाटक का उपयोग करना चाहते हैं तो जाहिर है कि यह कभी भी काम नहीं करेगा।

इसके बजाय आपको उपरोक्त नाटक को कुछ इस तरह बदलना चाहिए:

- name: Set root user password
  mysql_user: name=root
              host="{{ item }}"
              password="{{ mysql_root_password }}"
              check_implicit_admin=yes
              login_user="{{ mysql_user }}"
              login_password="{{ mysql_old_root_password }}"
              state=present

और फिर इस नए चर को जोड़ने के लिए संबंधित इन्वेंट्री फ़ाइलों को अपडेट करें।

तो अब आपके पास group_vars/productionहोना चाहिए:

mysql_old_root_password: productionpw
mysql_root_password: newproductionpw

ऐसा लगता है कि यह प्लेबुक दोनों roles/mariadb/tasks/main.ymlप्लेबुक में रूट पासवर्ड का उपयोग करता है और यह भी roles/wordpress-setup/tasks/database.ymlकि आप server.ymlयह सुनिश्चित करने के लिए पूरी प्लेबुक चलाना चाहते हैं कि यह ठीक से सेट है।


एक महान जवाब के लिए बहुत बहुत धन्यवाद। यह निश्चित रूप से जाने का रास्ता है। मैंने कंसोल में रूट पासवर्ड को रीसेट करना समाप्त कर दिया mysqladmin- लेकिन इससे पहले कि मैं आपका जवाब देख
पाता

7

आप mysql-root-password को बदलने में सक्षम होने के लिए ~ / .my.cnf का दुरुपयोग कर सकते हैं।

ट्रिक में एक टास्क है "रूट पासवर्ड सेट करें" (nr.1), जो पासवर्ड सेट करेगा। बाद में, आपके पास एक कार्य है, जो सही क्रेडेंशियल (nr.2) के साथ ~ / .my.cnf बनाता है ।

एक नई प्रणाली पर, ~ / .my.cnf मौजूद नहीं है। टास्क nr.1 दिए गए क्रेडेंशियल्स के साथ mysql-root-user बनाएगा। एक वर्तमान व्यवस्था पर, साख से ~ / .my.cnf करने के लिए प्रवेश और सेट पासवर्ड के लिए उपयोग किया जाता है mysql_root_password । टास्क nr.2 नए लोगों के लिए ~ / .my.cnf , मौजूदा पुराने क्रेडेंशियल ~ / .my.cnf बनाएगा

इस दृष्टिकोण का बड़ा लाभ केवल एक चर "mysql_root_password" है, जो हमेशा प्लेबुक के दृष्टिकोण से सही होता है। वर्तमान प्रणाली पर, मौजूदा स्थानीय mysql- क्रेडेंशियल्स के लिए ~ / .my.cnf एक तरह का भंडारण है।

- name: Set root user password
  # If .my.cnf already exists, this will cause an mysql-root-password update.
  mysql_user:
    name: root
    password: "{{ mysql_root_password}}"
    check_implicit_admin: true

- name: Create .my.cnf
  template:
   src: "client.my.cnf.j2"
   dest: "/root/.my.cnf"
   owner: root
   group: root
   mode: 0600

client.my.cnf.j2 के साथ:

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

आगे की पढाई

Ansible-mysql_user_module- प्रलेखन से प्रासंगिक नोट :

  • नोट 1:

    इस उपयोगकर्ता को एक बेमिसाल प्लेबुक के हिस्से के रूप में सुरक्षित करने के लिए, आपको कम से कम दो कार्य बनाने होंगे: सबसे पहले रूट उपयोगकर्ता का पासवर्ड बदलना होगा, बिना कोई लॉगिन_सार / लॉगिन_पासवर्ड विवरण प्रदान किए। दूसरे को नई रूट क्रेडेंशियल्स वाली ~ / .my.cnf फाइल को छोड़ना होगा। बाद में प्लेबुक के रन रन फ़ाइल से नए क्रेडेंशियल्स को पढ़कर सफल होंगे। ansible-mysql_user_module, नोट्स

  • नोट 2:

    जब आप क्रेडेंशियल पास कर रहे हों तो login_password और login_user दोनों की आवश्यकता होती है। यदि कोई भी मौजूद नहीं है, तो मॉड्यूल ~ / .my.cnf से क्रेडेंशियल्स को पढ़ने का प्रयास करेगा, और अंत में बिना पासवर्ड के 'रूट' के MySQL डिफ़ॉल्ट लॉगिन का उपयोग करने के लिए वापस गिर जाएगा। ansible-mysql_user_module, नोट्स


मुझे यह दृष्टिकोण पसंद है और यह मेरे उत्तर में संस्करण से बहुत बेहतर है। यह संभवतः स्वीकृत उत्तर होना चाहिए।
ydaetskcoR

2
यह आसान है, लेकिन कई प्रणालियों पर वास्तव में 4 'रूट' उपयोगकर्ता बनाए गए हैं, जिसमें होस्ट 127.0.0.1, लोकलहोस्ट, :: 1 और स्थानीय होस्टनाम जो भी हो। ऊपर केवल रूट @ लोकलहोस्ट को संशोधित करता है, जिसमें खाली पासवर्ड के साथ तीन अन्य रूट खाते हैं।
रोबो

सभी रूट उपयोगकर्ताओं को सूचीबद्ध करें mysql --database mysql --execute "select host from user where user = 'root';":। यह पोस्ट इस उत्तर के समान है लेकिन सभी पासवर्ड सेट करने के लिए कोड है।
हवलदार

2

अगले व्यक्ति के लिए जो इधर-उधर उत्तर खोज रहा है। यदि स्वीकृत उत्तर सही है, तो आपको MySQL 5.7 का उपयोग करने पर अतिरिक्त परिश्रम करना होगा क्योंकि डेमोंनाइज्ड मोड (सेवा) में mysqld में कोई अनाम लॉगिन अनुमति नहीं है। इसके बजाय आप TEMPORARY पासवर्ड के लिए /var/log/mysqld.log को खुरच कर देखें, जिसे किसी व्यक्ति ने login_password = ydaetskcoR पर बनाने और उपयोग करने का निर्णय लिया है। यह एक विशेषता थी जो उन्होंने देव भंडार के संस्करण 5.7 पर लागू करने का निर्णय लिया था, इसलिए यदि आप इसे पुराने संस्करण (5.6) के उपयोग से बचना चाहते हैं।

यहाँ दस्तावेज़: https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_initialize-insecure

http://mysqlserverteam.com/initialize-your-mysql-5-7-instances-with-ease/


1

MySQL को सख्त करने के लिए एक Ansible playbook का उपयोग किया जाता है।

https://github.com/dev-sec/ansible-mysql-hardening

इससे न केवल रूट पासवर्ड बदला गया, बल्कि सर्वर को सख्त करने के लिए कुछ अतिरिक्त कदम भी उठाए।

रीडमी फ़ाइल पर एक नज़र डालें।


यह खाली होने पर रूट पासवर्ड बदलने का काम नहीं करता है।
flickerfly
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.