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.