자습서: Ansible을 사용하여 Azure Database for MySQL에서 데이터베이스 구성

중요합니다

이 문서의 샘플 플레이북을 실행하려면 Ansible 2.7 이상이 필요합니다.

Azure Database for MySQL 은 MySQL Community Edition을 기반으로 하는 관계형 데이터베이스 서비스입니다. Azure Database for MySQL을 사용하면 웹앱에서 MySQL 데이터베이스를 관리할 수 있습니다.

이 문서에서는 다음 방법을 알아봅니다.

  • MySql 서버 만들기
  • MySql 데이터베이스 만들기
  • 외부 앱이 서버에 연결할 수 있도록 방화벽 규칙 구성
  • Azure Cloud Shell에서 MySql 서버에 연결
  • 사용 가능한 MySQL 서버 쿼리
  • 연결된 서버의 모든 데이터베이스 나열

필수 조건

  • Azure 구독: Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

리소스 그룹 만들기

이 섹션의 플레이북 코드는 Azure 리소스 그룹을 만듭니다. 리소스 그룹은 Azure 리소스가 배포 및 관리되는 논리적 컨테이너입니다.

다음 플레이북을 다음과 같이 rg.yml저장합니다.

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

플레이북을 실행하기 전에 다음 참고 사항을 참조하세요.

  • 이름이 지정된 myResourceGroup 리소스 그룹이 만들어집니다.
  • 리소스 그룹은 다음 위치에 만들어집니다.eastus

ansible-playbook을 사용하여 플레이북 실행

ansible-playbook rg.yml

MySQL 서버 및 데이터베이스 만들기

이 섹션의 플레이북 코드는 MySQL 서버와 Azure Database for MySQL 인스턴스를 만듭니다. 새 MySQL 서버는 하나의 vCore가 있는 Gen 5 기본 목적 서버이며 이름은 mysqlserveransible입니다. 데이터베이스 인스턴스의 이름이 지정 mysqldbansible됩니다.

가격 책정 계층에 대한 자세한 내용은 Azure Database for MySQL 가격 책정 계층을 참조하세요.

다음 플레이북을 다음과 같이 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 }}"

플레이북을 실행하기 전에 다음 참고 사항을 참조하세요.

  • vars 섹션에서 값 mysqlserver_name 은 고유해야 합니다.
  • vars 섹션에서 암호로 바꿉다<server_admin_password>.

ansible-playbook을 사용하여 플레이북 실행

ansible-playbook mysql_create.yml

방화벽 규칙 구성

서버 수준 방화벽 규칙을 사용하면 외부 앱이 Azure MySQL 서비스 방화벽을 통해 서버에 연결할 수 있습니다. 외부 앱의 예로는 mysql 명령줄 도구와 MySQL Workbench가 있습니다.

이 섹션의 플레이북 코드는 모든 외부 IP 주소에서의 연결을 허용하는 방화벽 규칙 extenalaccess을 만듭니다.

다음 플레이북을 다음과 같이 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"

플레이북을 실행하기 전에 다음 참고 사항을 참조하세요.

  • vars 섹션에서 startIpAddress 및 endIpAddress를 교체하십시오. 연결할 범위에 해당하는 IP 주소 범위를 사용합니다.
  • Azure Database for MySQL에 대한 연결은 포트 3306을 통해 통신합니다. 회사 네트워크 내에서 연결하려고 하면 포트 3306을 통해 아웃바운드 트래픽이 허용되지 않을 수 있습니다. 이 경우 IT 부서에서 포트 3306을 열지 않는 한 서버에 연결할 수 없습니다.
  • 플레이북은 REST API를 azure_rm_resource 직접 사용할 수 있는 모듈을 사용합니다.

ansible-playbook을 사용하여 플레이북 실행

ansible-playbook mysql_firewall.yml

서버에 연결

이 섹션에서는 Azure Cloud Shell을 사용하여 이전에 만든 서버에 연결합니다.

  1. 아래를 선택하여 shell.azure.com 엽니다.

    임베드 실행

  2. 다음 코드를 입력합니다.

    mysql -h mysqlserveransible.mysql.database.azure.com -u mysqladmin@mysqlserveransible -p
    
  3. 프롬프트에서 다음 명령을 입력하여 서버 상태를 쿼리합니다.

    mysql> status
    

    모든 것이 제대로 수행되면 다음 결과와 유사한 출력이 표시됩니다.

    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
    --------------
    

MySQL 서버 쿼리

이 섹션의 플레이북 코드는 MySQL 서버를 myResourceGroup 쿼리하고 찾은 서버의 데이터베이스를 나열합니다.

다음 플레이북을 다음과 같이 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

ansible-playbook을 사용하여 플레이북 실행

ansible-playbook mysql_query.yml

플레이북을 실행한 후 다음 결과와 유사한 출력이 표시됩니다.

"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"
    }
]

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"
    }
]

자원을 정리하세요

  1. 다음 코드를 .로 delete_rg.yml저장합니다.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. ansible-playbook 명령을 사용하여 플레이북을 실행합니다. 자리 표시자를 삭제할 리소스 그룹의 이름으로 바꿉니다. 리소스 그룹 내의 모든 리소스가 삭제됩니다.

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

    핵심 사항:

    • 플레이북의 register 변수와 debug 섹션 때문에 명령이 완료되면 결과가 표시됩니다.

다음 단계