sql >> Database >  >> RDS >> MariaDB

Een inleiding tot MySQL-implementatie met behulp van een Ansible-rol

Ansible automatiseert en vereenvoudigt repetitieve, complexe en vervelende bewerkingen. Het is een IT-automatiseringsengine die cloudprovisioning, configuratiebeheer, applicatie-implementatie, intra-service orkestratie en vele andere IT-behoeften automatiseert. Er zijn geen agenten nodig en alleen SSH wordt gebruikt om wijzigingen van een enkele bron naar meerdere externe bronnen te pushen zonder extra aangepaste configuratie van de beveiligingsinfrastructuur en het gebruik van een eenvoudige taalindeling (YAML) om de automatiseringstaken te beschrijven.

Het installeren van een standalone MySQL-server is een eenvoudige en eenvoudige taak, maar dit kan problematisch zijn als u meerdere databaseservers, versies, platforms en omgevingen moet ondersteunen. Het hebben van een configuratiebeheertool is dus de beste manier om de efficiëntie te verbeteren, herhaling te voorkomen en menselijke fouten te verminderen.

In deze blogpost gaan we je door de basisprincipes van Ansible's automatisering voor MySQL leiden, evenals configuratiebeheer met voorbeelden en uitleg. We beginnen met een eenvoudige zelfstandige MySQL-implementatie, zoals geïllustreerd in het volgende diagram op hoog niveau:

Ansible installeren

Voor deze walkthrough hebben we ten minste twee hosts nodig - één host is voor Ansible (u kunt een werkstation gebruiken in plaats van een server) en een andere is de doelhost die we willen implementeren MySQL-server.

Als u Ansible op CentOS 7 wilt installeren, voert u gewoon de volgende opdrachten uit:

(ansible-host)$ yum install -y epel-release

(ansible-host)$ yum install -y ansible

Bekijk voor andere OS-distributies de installatiehandleiding van Ansible.

Wachtwoordloze SSH instellen

Het gebruik van een wachtwoord tijdens SSH wordt ondersteund, maar SSH-sleutels zonder wachtwoord met ssh-agent zijn een van de beste manieren om Ansible te gebruiken. De eerste stap is het configureren van SSH zonder wachtwoord, aangezien Ansible de implementatie uitsluitend via dit kanaal zal uitvoeren. Genereer eerst een SSH-sleutel op de Ansible-host:

(ansible-host)$ whoami

root

(ansible-host)$ ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa

U moet ten minste de volgende bestanden genereren:

(ansible-host)$ ls -al ~/.ssh/

-rw-------. 1 root root 1679 Jan 14 03:40 id_rsa

-rw-r--r--. 1 root root  392 Jan 14 03:40 id_rsa.pub

Om SSH zonder wachtwoord toe te staan, moeten we de openbare SSH-sleutel (id_rsa.pub) kopiëren naar de externe host waartoe we toegang willen. We kunnen een tool genaamd ssh-copy-id gebruiken om deze taak voor ons uit te voeren. U moet echter het gebruikerswachtwoord van de doelhost weten en de wachtwoordverificatie is toegestaan ​​op de doelhost:

(ansible-host)$ whoami

root

(ansible-host)$ ssh-copy-id [email protected]

De bovenstaande opdracht vraagt ​​om het root-wachtwoord 192.168.0.221, voer het wachtwoord in en de SSH-sleutel voor de huidige gebruiker van de Ansible-host wordt gekopieerd naar de doelhost, 192.168.0.221 in ~/.ssh/authorized_keys, wat betekent dat we die specifieke sleutel autoriseren om op afstand toegang te krijgen tot deze server. Om uit te testen, zou u de volgende opdracht op afstand moeten kunnen uitvoeren zonder wachtwoord van de Ansible-host:

(ansible-host)$ ssh [email protected] "hostname -I"

192.168.0.221

In het geval dat je geen root-gebruiker mag gebruiken voor SSH (bijvoorbeeld "PermitRootLogin no" in de SSH-configuratie), kun je in plaats daarvan een sudo-gebruiker gebruiken. In het volgende voorbeeld hebben we SSH zonder wachtwoord ingesteld voor een sudo-gebruiker met de naam "vagrant":

(ansible-host)$ whoami

vagrant

(ansible-host)$ ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa

(ansible-host)$ ls -al ~/.ssh/

-rw-------. 1 vagrant vagrant 1679 Jan 14 03:45 id_rsa

-rw-r--r--. 1 vagrant vagrant  392 Jan 14 03:45 id_rsa.pub

(ansible-host)$ ssh-copy-id [email protected]

Als de doelserver geen wachtwoordverificatie via SSH toestaat, kopieert u gewoon de inhoud van de openbare SSH-sleutel op ~/.ssh/id_rsa.pub handmatig naar de ~/.ssh/authorized_keys van de doelhosts het dossier. Op de Ansible-host haalt u bijvoorbeeld de inhoud van de openbare sleutel op:

(ansible-host)$ cat ~/.ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5MZjufN0OiKyKa2OG0EPBEF/w23FnOG2x8qpAaYYuqHlVc+ZyRugtGm+TdTJDfLA1Sr/rtZpXmPDuLUdlAvPmmwqIhgiatKiDw5t2adNUwME0sVgAlBv/KvbusTTdtpFQ1o+Z9CltGiENDCFytr2nVeBFxImoZu2H0ilZed/1OY2SZejUviXTQ0Dh0QYdIeiQHkMf1CiV2sNYs8j8+ULV26OOKCd8c1h1O9M5Dr4P6kt8E1lVSl9hbd4EOHQmeZ3R3va5zMesLk1A+iadIGJCJNCVOA2RpxDHmmaX28zQCwrpCliH00g9iCRixlK+cB39d1coUWVGy7SeaI8bzfv3 [email protected]

Maak verbinding met de doelhost en plak de openbare sleutel van de Ansible-host in ~/.ssh/authorized_keys:

(target-host)$ whoami

root

(target-host)$ vi ~/.ssh/authorized_keys

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5MZjufN0OiKyKa2OG0EPBEF/w23FnOG2x8qpAaYYuqHlVc+ZyRugtGm+TdTJDfLA1Sr/rtZpXmPDuLUdlAvPmmwqIhgiatKiDw5t2adNUwME0sVgAlBv/KvbusTTdtpFQ1o+Z9CltGiENDCFytr2nVeBFxImoZu2H0ilZed/1OY2SZejUviXTQ0Dh0QYdIeiQHkMf1CiV2sNYs8j8+ULV26OOKCd8c1h1O9M5Dr4P6kt8E1lVSl9hbd4EOHQmeZ3R3va5zMesLk1A+iadIGJCJNCVOA2RpxDHmmaX28zQCwrpCliH00g9iCRixlK+cB39d1coUWVGy7SeaI8bzfv3 [email protected]

Je kunt nu proberen om een ​​externe opdracht uit te voeren vanaf de Ansible-host om te verifiëren en je zou niet om een ​​wachtwoord moeten worden gevraagd. Op dit moment is onze wachtwoordloze SSH geconfigureerd.

De doelhost definiëren

Vervolgens moeten we de doelhost definiëren, de host die we willen beheren met Ansible. Op basis van onze architectuur gaan we slechts één MySQL-server implementeren, namelijk 192.168.0.221. Voeg de volgende regels toe aan /etc/ansible/hosts:

[db-mysql]

192.168.0.221

Het bovenstaande betekent eenvoudigweg dat we een groep hebben gedefinieerd met de naam "db-mysql", die de identifier zal zijn wanneer we verwijzen naar de doelhost in Ansible Playbook. We kunnen ook alle IP-adressen of hostnamen van de doelhosts onder deze groep weergeven. Op dit moment hebben we maar één MySQL-server om te implementeren, dus er is maar één item. U kunt ook een willekeurige overeenkomstregel specificeren om de hosts onder één groep te matchen, bijvoorbeeld:

[db-mysql]

192.168.0.[221:223]

De bovenstaande definitie betekent dat we 3 hosts hebben onder deze groep met de volgende IP-adressen:

  • 192.168.0.221
  • 192.168.0.222
  • 192.168.0.223

Er zijn veel manieren en regels om de doelhosts te matchen en te groeperen, zoals weergegeven in de Ansible-inventarisgids.

Een Ansible-rol kiezen

Om Ansible te vertellen wat te implementeren, moeten we de implementatiestappen definiëren in een YML-geformatteerd bestand genaamd playbook. Zoals u wellicht weet, vereist het installeren van een complete MySQL-server meerdere stappen om te voldoen aan alle MySQL-afhankelijkheden, configuratie na installatie, gebruikers- en schemacreatie enzovoort. Ansible heeft een aantal MySQL-modules geleverd die ons kunnen helpen, maar we moeten nog steeds een draaiboek schrijven voor de implementatiestappen.

Om de implementatiestappen te vereenvoudigen, kunnen we bestaande Ansible-rollen gebruiken. Ansible-rol is een onafhankelijke component die hergebruik van algemene configuratiestappen mogelijk maakt. Een Ansible-rol moet worden gebruikt in het playbook. Er zijn een aantal MySQL Ansible-rollen beschikbaar in de Ansible Galaxy, een opslagplaats voor Ansible-rollen die direct in je playbooks kunnen worden geplaatst.

Als u "mysql" opzoekt, krijgt u tal van Ansible-rollen voor MySQL:

We zullen de meest populaire gebruiken met de naam "mysql" door geerlingguy. Je kunt ervoor kiezen om andere rollen te gebruiken, maar de meest gedownloade is meestal voor algemene doeleinden, wat in de meeste gevallen prima werkt.

Voer op de Ansible-host de volgende opdracht uit om de Ansible-rol te downloaden:

(ansible-host)$ ansible-galaxy install geerlingguy.mysql

De rol wordt gedownload in ~/.ansible/roles/geerlingguy.mysql/ van de huidige gebruiker.

Het Ansible Playbook schrijven

Door naar de Readme van de Ansible-rol te kijken, kunnen we het voorbeeld-playbook volgen dat wordt verstrekt. Maak eerst een playbook-bestand met de naam deploy-mysql.yml en voeg de volgende regels toe:

(ansible-host)$ vim ~/deploy-mysql.yml

- hosts: db-mysql

  become: yes

  vars_files:

    - vars/main.yml

  roles:

    - { role: geerlingguy.mysql }

In de bovenstaande regels definiëren we de doelhost die alle hosts zijn onder db-mysql-items in /etc/ansible/hosts. De volgende regel (wordt) vertelt Ansible om het playbook als root-gebruiker uit te voeren, wat nodig is voor de rol (het staat daar in het Readme-bestand). Vervolgens definiëren we de locatie van het variabelenbestand (var_files) op vars/main.yml, relatief aan het playbook-pad.

Laten we de variabele directory en het bestand maken en de volgende regel specificeren:

(ansible-host)$ mkdir vars

(ansible-host)$ vim vars/main.yml

mysql_root_password: "theR00tP455w0rd"

Bekijk voor meer informatie de sectie Rolvariabelen in het Leesmij-bestand van deze rol.

Start de implementatie

Nu zijn we klaar om de MySQL-implementatie te starten. Gebruik de opdracht ansible-playbook om onze playbook-definities uit te voeren:

(ansible-host)$ ansible-playbook deploy-mysql.yml

Je zou een aantal regels in de uitvoer moeten zien verschijnen. Focus op de laatste regel waar het de implementatie samenvat:

PLAY RECAP ***************************************************************************************************************************************

192.168.0.221              : ok=36 changed=8 unreachable=0    failed=0 skipped=16 rescued=0 ignored=0

Als alles groen en in orde is, kunt u op de databasehost controleren of onze MySQL-server al is geïnstalleerd en actief is:

(mysql-host)$ rpm -qa | grep -i maria

mariadb-server-5.5.64-1.el7.x86_64

mariadb-libs-5.5.64-1.el7.x86_64

mariadb-5.5.64-1.el7.x86_64



(mysql-host)$ mysqladmin -uroot -p ping

Enter password:

mysqld is alive

Zoals je hierboven kunt zien, is voor CentOS 7 de standaard MySQL-installatie MariaDB 5.5 als onderdeel van de standaard pakketrepository. Op dit moment wordt onze implementatie als voltooid beschouwd, maar we willen onze implementatie graag verder aanpassen zoals weergegeven in de volgende secties.

De implementatie aanpassen

De eenvoudigste definitie in Playbook geeft ons een zeer eenvoudige installatie en gebruikt alle standaard configuratie-opties. We kunnen de MySQL-installatie verder aanpassen door het playbook uit te breiden/aan te passen/toe te voegen om het volgende te doen:

  • MySQL-configuratie-opties wijzigen
  • databasegebruiker toevoegen
  • databaseschema toevoegen
  • gebruikersrechten configureren
  • MySQL-replicatie configureren
  • MySQL van andere leveranciers installeren
  • importeer een aangepast MySQL-configuratiebestand

MySQL installeren vanuit Oracle-repository

Standaard installeert de rol het standaard MySQL-pakket dat bij de OS-distributie wordt geleverd. Wat CentOS 7 betreft, zou u MariaDB 5.5 standaard laten installeren. Stel dat we MySQL van een andere leverancier willen installeren, dan kunnen we het playbook uitbreiden met pre_tasks, een taak die Ansible uitvoert voordat taken worden uitgevoerd die in een .yml-bestand worden genoemd, zoals weergegeven in het volgende voorbeeld:

(ansible-host)$ vim deploy-mysql.yml

- hosts: db-mysql

  become: yes

  vars_files:

    - vars/main.yml

  roles:

    - { role: geerlingguy.mysql }

  pre_tasks:

    - name: Install the MySQL repo.

      yum:

        name: http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

        state: present

      when: ansible_os_family == "RedHat"

    - name: Override variables for MySQL (RedHat).

      set_fact:

        mysql_daemon: mysqld

        mysql_packages: ['mysql-server']

        mysql_log_error: /var/lib/mysql/error.log

        mysql_syslog_tag: mysqld

        mysql_pid_file: /var/run/mysqld/mysqld.pid

        mysql_socket: /var/lib/mysql/mysql.sock

      when: ansible_os_family == "RedHat"

Voer het draaiboek uit:

(ansible-host)$ ansible-playbook deploy-mysql.yml

Het bovenstaande zal in plaats daarvan MySQL installeren vanuit de Oracle-repository. De standaardversie die u zou krijgen is MySQL 5.6. Het uitvoeren van het bovenstaande playbook op een doelhost die al een oudere versie van MySQL/MariaDB heeft, zou waarschijnlijk mislukken vanwege de incompatibiliteit.

MySQL-databases en -gebruikers maken

Binnen vars/main.yml kunnen we de MySQL-database en gebruikers definiëren die we willen dat Ansible op onze MySQL-server configureert met behulp van de modules mysql_database en mysql_users, direct na onze vorige definitie op mysql_root_password:

(ansible-host)$ vim vars/main.yml

mysql_root_password: "theR00tP455w0rd"

mysql_databases:

  - name: myshop

    encoding: latin1

    collation: latin1_general_ci

  - name: sysbench

    encoding: latin1

    collation: latin1_general_ci

mysql_users:

  - name: myshop_user

    host: "%"

    password: mySh0pPassw0rd

    priv: "myshop.*:ALL"

  - name: sysbench_user

    host: "192.168.0.%"

    password: sysBenchPassw0rd

    priv: "sysbench.*:ALL"

De definitie geeft Ansible de opdracht om twee databases te maken, "myshop" en "sysbench", gevolgd door de respectievelijke MySQL-gebruiker met de juiste rechten, toegestane host en wachtwoord.

Voer het playbook opnieuw uit om de wijziging toe te passen op onze MySQL-server:

(ansible-host)$ ansible-playbook deploy-mysql.yml

Deze keer pakt Ansible alle wijzigingen op die we in vars/main.yml hebben aangebracht om op onze MySQL-server toe te passen. We kunnen verifiëren in de MySQL-server met de volgende commando's:

(mysql-host)$ mysql -uroot -p -e 'SHOW DATABASES'

Enter password:

+--------------------+

| Database           |

+--------------------+

| information_schema |

| myshop             |

| mysql              |

| performance_schema |

| sysbench           |

+--------------------+

(mysql-host)$ mysql -uroot -p -e 'SHOW GRANTS FOR [email protected]"192.168.0.%"'

Enter password:

+------------------------------------------------------------------------------------------------------------------------+

| Grants for [email protected]%                                                                                   |

+------------------------------------------------------------------------------------------------------------------------+

| GRANT USAGE ON *.* TO 'sysbench_user'@'192.168.0.%' IDENTIFIED BY PASSWORD '*4AC2E8AD02562E8FAAF5A958DC2AEA4C47451B5C' |

| GRANT ALL PRIVILEGES ON `sysbench`.* TO 'sysbench_user'@'192.168.0.%'                                                  |

+------------------------------------------------------------------------------------------------------------------------+

Traag zoeklogboek inschakelen

Deze rol ondersteunt het inschakelen van MySQL slow query log, we kunnen zowel de locatie van het logbestand als de langzame querytijd definiëren. Voeg de nodige variabelen toe in het vars/main.yml-bestand:

mysql_root_password: "theR00tP455w0rd"

mysql_databases:

  - name: example_db

    encoding: latin1

    collation: latin1_general_ci

  - name: sysbench

    encoding: latin1

    collation: latin1_general_ci

mysql_users:

  - name: example_user

    host: "%"

    password: similarly-secure-password

    priv: "example_db.*:ALL"

  - name: sysbench_user

    host: "192.168.0.%"

    password: sysBenchPassw0rd

    priv: "sysbench.*:ALL"

mysql_slow_query_log_enabled: true

mysql_slow_query_log_file: 'slow_query.log'

mysql_slow_query_time: '5.000000'

Voer het draaiboek opnieuw uit om de wijzigingen toe te passen:

(ansible-host)$ ansible-playbook deploy-mysql.yml

Het playbook zal de nodige wijzigingen aanbrengen in MySQL-opties voor langzame query's en de MySQL-server automatisch opnieuw opstarten om de nieuwe configuraties te laden. We kunnen dan controleren of de nieuwe configuratie-opties correct zijn geladen op de MySQL-server:

(mysql-host)$ mysql -uroot -p -e 'SELECT @@slow_query_log, @@slow_query_log_file, @@long_query_time'

+------------------+-----------------------+-------------------+

| @@slow_query_log | @@slow_query_log_file | @@long_query_time |

+------------------+-----------------------+-------------------+

|                1 | slow_query.log        | 5.000000 |

+------------------+-----------------------+-------------------+

Inclusief aangepast MySQL-configuratiebestand

Ansible-rolvariabelen en MySQL-variabelen zijn twee verschillende dingen. De auteur van deze rol heeft een aantal MySQL-gerelateerde variabelen gemaakt die kunnen worden weergegeven met Ansible-rolvariabelen. Genomen uit het Leesmij-bestand, hier zijn er enkele:

mysql_port: "3306"

mysql_bind_address: '0.0.0.0'

mysql_datadir: /var/lib/mysql

mysql_socket: *default value depends on OS*

mysql_pid_file: *default value depends on OS*

mysql_log_file_group: mysql *adm on Debian*

mysql_log: ""

mysql_log_error: *default value depends on OS*

mysql_syslog_tag: *default value depends on OS*

Als de gegenereerde configuratie niet voldoet aan onze MySQL-vereiste, kunnen we aangepaste MySQL-configuratiebestanden in de implementatie opnemen door de variabele mysql_config_include_files te gebruiken. Het accepteert een reeks waarden gescheiden door een komma, met een "src" als prefix voor het daadwerkelijke pad op de Ansible-host.

Allereerst moeten we de aangepaste configuratiebestanden voorbereiden op de Ansible-host. Maak een directory en een eenvoudig MySQL-configuratiebestand aan:

(ansible-host)$ mkdir /root/custom-config/

(ansible-host)$ vim /root/custom-config/my-severalnines.cnf

[mysqld]

max_connections=250

log_bin=binlog

expire_logs_days=7

Stel dat we een ander configuratiebestand hebben specifiek voor mysqldump-configuratie:

(ansible-host)$ vim /root/custom-config/mysqldump.cnf

[mysqldump]

max_allowed_packet=128M

Om deze configuratiebestanden in onze implementatie te importeren, definieert u ze in de mysql_config_include_files array in het bestand vars/main.yml:

mysql_root_password: "theR00tP455w0rd"

mysql_databases:

  - name: example_db

    encoding: latin1

    collation: latin1_general_ci

  - name: sysbench

    encoding: latin1

    collation: latin1_general_ci

mysql_users:

  - name: example_user

    host: "%"

    password: similarly-secure-password

    priv: "example_db.*:ALL"

  - name: sysbench_user

    host: "192.168.0.%"

    password: sysBenchPassw0rd

    priv: "sysbench.*:ALL"

mysql_slow_query_log_enabled: true

mysql_slow_query_log_file: slow_query.log

mysql_slow_query_time: 5

mysql_config_include_files: [

  src: '/root/custom-config/my-severalnines.cnf',

  src: '/root/custom-config/mysqldump.cnf'

]

Merk op dat /root/custom-config/mysqld-severalnines.cnf en /root/custom-config/mysqldump.cnf bestaan ​​in de Ansible-host.

Herhaal het draaiboek:

(ansible-host)$ ansible-playbook deploy-mysql.yml

Het playbook importeert die configuratiebestanden en plaatst ze in de include-directory (afhankelijk van het besturingssysteem) die /etc/my.cnf.d/ voor CentOS 7 is. Het playbook zal de MySQL-server om de nieuwe configuratie-opties te laden. We kunnen dan controleren of de nieuwe configuratie-opties correct zijn geladen:

(mysql-host)$ mysql -uroot -p -e 'select @@max_connections'

250

(mysql-host)$ mysqldump --help | grep ^max-allowed-packet

max-allowed-packet                134217728

Conclusie

Ansible kan worden gebruikt om de database-implementatie en configuratiebeheer te automatiseren met een beetje kennis van scripting. Ondertussen gebruikt ClusterControl een vergelijkbare SSH-aanpak zonder wachtwoord om uw databasecluster van A tot Z te implementeren, bewaken, beheren en schalen, met een gebruikersinterface en heeft geen extra vaardigheid nodig om hetzelfde resultaat te bereiken.


  1. Windows Azure VM-prestaties vergelijken, deel 2

  2. Werk rijen in de ene tabel bij met gegevens uit een andere tabel op basis van een kolom in elke tabel die gelijk is

  3. COSH() Functie in Oracle

  4. lijstweergave toont de gegevens uit de database in Android