Esercitazione: Configurare i database in Azure Database per MySQL utilizzando Ansible

Importante

Ansible 2.7 (o versione successiva) è necessario per eseguire i playbook di esempio in questo articolo.

Database di Azure per MySQL è un servizio di database relazionale basato su MySQL Community Edition. Database di Azure per MySQL consente di gestire i database MySQL nelle app Web.

In questo articolo vengono illustrate le operazioni seguenti:

  • Creare un server MySql
  • Creare un database MySQL
  • Configurare una regola del firewall in modo che un'app esterna possa connettersi al server
  • Connettersi al server MySql da Azure Cloud Shell
  • Interroga i server MySQL disponibili
  • Elencare tutti i database nei server connessi

Prerequisiti

  • Sottoscrizione di Azure: se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.

Creare un gruppo di risorse

Il codice del playbook in questa sezione crea un gruppo di risorse di Azure. Un gruppo di risorse è un contenitore logico in cui le risorse di Azure vengono distribuite e gestite.

Salva il playbook seguente come rg.yml:

- hosts: localhost
  vars:
    resource_group: myResourceGroup
    location: eastus 
  tasks:
    - name: Create a resource group
      azure_rm_resourcegroup:
        name: "{{ resource_group }}"
        location: "{{ location }}"

Prima di eseguire il playbook, vedere le note seguenti:

  • Viene creato un gruppo di risorse denominato myResourceGroup .
  • Il gruppo di risorse viene creato nella località eastus.

Eseguire il playbook usando ansible-playbook

ansible-playbook rg.yml

Creare un server e un database MySQL

Il codice del playbook in questa sezione crea un server MySQL e un'istanza di Database di Azure per MySQL. Il nuovo server MySQL è un server per utilizzo di base di generazione 5 con un vCore ed è denominato mysqlserveransible. L'istanza del database è denominata mysqldbansible.

Per altre informazioni sui piani tariffari, vedere Piani tariffari di Database di Azure per MySQL.

Salva il playbook seguente come mysql_create.yml:

- hosts: localhost
  vars:
    resource_group: myResourceGroup
    location: eastus
    mysqlserver_name: mysqlserveransible
    mysqldb_name: mysqldbansible
    admin_username: mysqladmin
    admin_password: <server_admin_password> 
  tasks:
    - name: Create MySQL Server
      azure_rm_mysqlserver:
        resource_group: "{{ resource_group }}"
        name: "{{ mysqlserver_name }}"
        sku:
          name: B_Gen5_1
          tier: Basic
        location: "{{ location }}"
        version: 5.6
        enforce_ssl: True
        admin_username: "{{ admin_username }}"
        admin_password: "{{ admin_password }}"
        storage_mb: 51200
    - name: Create instance of MySQL Database
      azure_rm_mysqldatabase:
        resource_group: "{{ resource_group }}"
        server_name: "{{ mysqlserver_name }}"
        name: "{{ mysqldb_name }}"

Prima di eseguire il playbook, vedere le note seguenti:

  • vars Nella sezione il valore di mysqlserver_name deve essere univoco.
  • vars Nella sezione sostituire <server_admin_password> con una password.

Eseguire il playbook usando ansible-playbook

ansible-playbook mysql_create.yml

Configurare una regola del firewall

Una regola del firewall a livello di server consente a un'app esterna di connettersi al server tramite il firewall del servizio MySQL di Azure. Esempi di app esterne sono lo strumento a mysql riga di comando e MySQL Workbench.

Il codice del playbook in questa sezione crea una regola del firewall denominata extenalaccess che consente le connessioni da qualsiasi indirizzo IP esterno.

Salva il playbook seguente come mysql_firewall.yml:

- hosts: localhost
  vars:
    resource_group: myResourceGroup
    mysqlserver_name: mysqlserveransible
  tasks:
  - name: Open firewall to access MySQL Server from outside
    azure_rm_resource:
      api_version: '2017-12-01'
      resource_group: "{{ resource_group }}"
      provider: dbformysql
      resource_type: servers
      resource_name: "{{ mysqlserver_name }}"
      subresource:
        - type: firewallrules
          name: externalaccess
      body:
        properties:
          startIpAddress: "0.0.0.0"
          endIpAddress: "255.255.255.255"

Prima di eseguire il playbook, vedere le note seguenti:

  • Nella sezione vars sostituire startIpAddress e endIpAddress. Usare l'intervallo di indirizzi IP che corrisponde all'intervallo da cui ci si connetterà.
  • Le connessioni a Database di Azure per MySQL comunicano sulla porta 3306. Se si tenta di connettersi da una rete aziendale, il traffico in uscita sulla porta 3306 potrebbe non essere consentito. In tal caso, non è possibile connettersi al server a meno che il reparto IT non apra la porta 3306.
  • Il playbook usa il azure_rm_resource modulo , che consente l'uso diretto dell'API REST.

Eseguire il playbook usando ansible-playbook

ansible-playbook mysql_firewall.yml

Connettersi al server

In questa sezione si usa Azure Cloud Shell per connettersi al server creato in precedenza.

  1. Aprire shell.azure.com selezionando di seguito.

    Incorpora l'avvio

  2. Immetti il codice seguente:

    mysql -h mysqlserveransible.mysql.database.azure.com -u mysqladmin@mysqlserveransible -p
    
  3. Al prompt immettere il comando seguente per eseguire una query sullo stato del server:

    mysql> status
    

    Se tutto va bene, viene visualizzato un output simile ai risultati seguenti:

    demo@Azure:~$ mysql -h mysqlserveransible.mysql.database.azure.com -u mysqladmin@mysqlserveransible -p
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 65233
    Server version: 5.6.39.0 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> status
    --------------
    mysql  Ver 14.14 Distrib 5.7.23, for Linux (x86_64) using  EditLine wrapper
    
    Connection id:          65233
    Current database:
    Current user:           mysqladmin@13.76.42.93
    SSL:                    Cipher in use is AES256-SHA
    Current pager:          stdout
    Using outfile:          ''
    Using delimiter:        ;
    Server version:         5.6.39.0 MySQL Community Server (GPL)
    Protocol version:       10
    Connection:             mysqlserveransible.mysql.database.azure.com via TCP/IP
    Server characterset:    latin1
    Db     characterset:    latin1
    Client characterset:    utf8
    Conn.  characterset:    utf8
    TCP port:               3306
    Uptime:                 36 min 21 sec
    
    Threads: 5  Questions: 559  Slow queries: 0  Opens: 96  Flush tables: 3  Open tables: 10  Queries per second avg: 0.256
    --------------
    

Eseguire query sui server MySQL

Il codice del playbook in questa sezione interroga i server MySQL in myResourceGroup ed elenca i database sui server trovati.

Salva il playbook seguente come mysql_query.yml:

- hosts: localhost
  vars:
    resource_group: myResourceGroup
    mysqlserver_name: mysqlserveransible
  tasks:
    - name: Query MySQL Servers in current resource group
      azure_rm_mysqlserver_facts:
        resource_group: "{{ resource_group }}"
      register: mysqlserverfacts

    - name: Dump MySQL Server facts
      debug:
        var: mysqlserverfacts

    - name: Query MySQL Databases
      azure_rm_mysqldatabase_facts:
        resource_group: "{{ resource_group }}"
        server_name: "{{ mysqlserver_name }}"
      register: mysqldatabasefacts

    - name: Dump MySQL Database Facts
      debug:
        var: mysqldatabasefacts

Eseguire il playbook usando ansible-playbook

ansible-playbook mysql_query.yml

Dopo aver eseguito il playbook, viene visualizzato un output simile ai risultati seguenti:

"servers": [
    {
        "admin_username": "mysqladmin",
        "enforce_ssl": false,
        "fully_qualified_domain_name": "mysqlserveransible.mysql.database.azure.com",
        "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroup/providers/Microsoft.DBforMySQL/servers/mysqlserveransible",
        "location": "eastus",
        "name": "mysqlserveransible",
        "resource_group": "myResourceGroup",
        "sku": {
            "capacity": 1,
            "family": "Gen5",
            "name": "B_Gen5_1",
            "tier": "Basic"
        },
        "storage_mb": 5120,
        "user_visible_state": "Ready",
        "version": "5.6"
    }
]

Viene visualizzato anche l'output seguente per il database MySQL:

"databases": [
    {
        "charset": "utf8",
        "collation": "utf8_general_ci",
        "name": "information_schema",
        "resource_group": "myResourceGroup",
        "server_name": "mysqlserveransible"
    },
    {
        "charset": "latin1",
        "collation": "latin1_swedish_ci",
        "name": "mysql",
        "resource_group": "myResourceGroup",
        "server_name": "mysqlserveransibler"
    },
    {
        "charset": "latin1",
        "collation": "latin1_swedish_ci",
        "name": "mysqldbansible",
        "resource_group": "myResourceGroup",
        "server_name": "mysqlserveransible"
    },
    {
        "charset": "utf8",
        "collation": "utf8_general_ci",
        "name": "performance_schema",
        "resource_group": "myResourceGroup",
        "server_name": "mysqlserveransible"
    }
]

Pulire le risorse

  1. Salvare il codice seguente come delete_rg.yml.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. Esegui il playbook usando il comando ansible-playbook. Sostituire il segnaposto con il nome del gruppo di risorse da eliminare. Tutte le risorse all'interno del gruppo di risorse verranno eliminate.

    ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
    

    Punti chiave:

    • A causa della variabile register e della sezione debug del playbook, i risultati vengono visualizzati al termine del comando.

Passaggi successivi