Ansible

Ansible: Ubuntu 22.04’te MySQL Server Nasıl Kurulur ve Başlatılır

Ansible, kod olarak altyapıya olanak tanıyan açık kaynaklı bir yazılım sağlama, yapılandırma yönetimi ve uygulama dağıtım aracıdır.

MySQL, açık kaynaklı bir ilişkisel veritabanı yönetim sistemidir. Mysql genellikle popüler LAMP veya LEMP (Linux, Apache/Nginx, MySQL/MariaDB, PHP/Python/Perl) yığınının bir parçası olarak kurulur.

Bu kılavuzda, Ubuntu 22.04’te Mysql’i kullanacağız, kuracağız ve kuracağız. Bu kılavuz, Debian ve diğer Ubunti sürümleri gibi diğer Debian türevleri üzerinde de çalışır 

Ansible playbook’u oluşturma

Görevlerimizi tanımlamadan önce, ansible’a birkaç şey söylemeliyiz:

1
2
3
4
5
6
7
---
- name: Install and configure mariadb server on Ubuntu 22.04
  hosts: db-srv
  gather_facts: false
  become: true
  vars:
    mysql_root_password: 'superSecretPassword'

Açıklama:

  • name Playbook’u ne yaptığına dair açıklayıcı bir isim tanımlar, buna sahip olmak zorunlu değildir.
  • hosts Yukarıda tanımlanan hosts veya hosts.yaml dosyasında tanımlandığı gibi hedeflenecek konakları tanımlar.
  • gather_facts Görevleri işlemeden önce Ansible’ın işletim sistemi gerçeklerini toplamasını isteyip istemediğimizi tanımlar. Bizim durumumuzda istemiyoruz
  • become Görevlerimizi kök olarak yürütmek istediğimizi tanımlar
  • vars Görevlerimizde yeniden kullanmak istediğimiz değişkenleri tanımlar. Bizim durumumuzda mysql_root_password tanımladık

Ansible görevleri

Yukarıdaki bölümden sonra artık görevlerimizi tanımlamamız gerekiyor. Bu görevler bir role eklenebilir veya görev olarak belirtilebilir. Bizim durumumuzda bunları görev olarak kullanacağız (tam oyun kitabı için bu gude’un sonunu kontrol edin).

Gerekli yazılımın kurulu olduğundan emin olun

Devam etmeden önce, ihtiyacımız olan tüm yazılımları yüklemek istiyoruz. Bunlar, mysql’e özgü yazılım mysql-server ve ansible tarafından mysql server örneğine bağlanmak ve kurmak için kullanılacak python ile ilgili yazılım gibi destekleyici yazılımları içerir. Bunu yapmak için ansible apt modülünü kullanıyoruz.

Sistemimizdeki en son paketleri kullandığımızdan emin olmak için devam etmeden önce bir işletim sistemi güncellemesi ve yükseltmesi de yaptığımızı lütfen unutmayın.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
- name: Update apt repositories and cache on server
  apt:
    update_cache: yes
    force_apt_get: yes
    cache_valid_time: 3600

- name: Upgrade all packages on server
  apt:
    upgrade: dist
    force_apt_get: yes

- name: Check if a reboot is needed on all servers
  register: reboot_required_file
  stat:
    path: /var/run/reboot-required
    get_checksum: false

- name: Reboot the server if kernel updated
  reboot:
    msg: "Reboot initiated by Ansible for kernel updates"
    connect_timeout: 5
    reboot_timeout: 300
    pre_reboot_delay: 0
    post_reboot_delay: 30
    test_command: uptime
  when: reboot_required_file.stat.exists

- name: Install Nginx, MySQL, PHP, and related packages
  apt:
    name:
      - mysql-server
      - unzip
      - python3-mysqldb
      - vim
      - git
    state: present

MySQL sunucusunu başlatın

Çünkü sunucuya bağlanmak ve sunucuda işlemler gerçekleştirmek istiyoruz, bu görevle başlayalım. Ubuntu 22.04, uzun süre çalışan işlemleri yönetmek için systemd kullandığından, ansible systemd modülünü kullanarak mysqld’yi başlatalım ve etkinleştirelim:

1
2
3
4
5
- name: Start and enable MySQL
  systemd:
    name: mysql
    state: started
    enabled: yes

MySQL kurulumunu başlatın

Kök uzaktan oturum açmayı devre dışı bırak

MySQL kök kullanıcısı, sunucudaki tüm kaynaklar için izinleri olan varsayılan yönetici kullanıcıdır. En iyi uygulama, yönetici görevleri yaparken yalnızca yerel sistemde bu kullanıcı kökü üzerinden erişimi etkinleştirmek olacaktır, aksi takdirde her bağlantı için özel bir kullanıcı oluşturun, yani her uygulama için, yalnızca o veritabanına erişimi olan bir kullanıcıya sahip olun.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- name: Ensure root user can only login from localhost
  mysql_user:
    login_password: "{{ mysql_root_password }}"
    check_implicit_admin: yes
    name: root
    host: "{{ item }}"
    password: "{{ mysql_root_password }}"
    state: present
  with_items:
    - localhost
    - 127.0.0.1
    - ::1

- name: Secure root account
  mysql_user:
    login_user: root
    login_password: "{{ mysql_root_password }}"
    name: root
    host: "{{ item }}"
    state: absent
  with_items:
    - "%"
    - "::1"
  when: item != 'localhost' and item != '127.0.0.1'

Yukarıdaki görev tanımında:

  • mysql_root_password değişkeni, daha önce tanımlanan VAR’lardan seçilecektir
  • Öğe, with_items bölümünde tanımlanan değerlerin bir döngüsüdür.
  • check_implicit_admin, ansible’a parola olmadan oturum açmayı denemesini söyler, bu yeni bir yükleme olduğu için çalışması gerekir. Bunun bir parçası olarak, sağlanan şifre kök kullanıcı için ayarlanacaktır

my.cnf’yi home dizinine ekleyin

Artık yukarıdaki görevde parolayı ayarladığımıza göre, kök kullanıcı olarak daha fazla görev yaparken parolayı sağlamak isteriz. Bunu, mysql komutlarını her çalıştırdığımızda kimlik bilgileri için kontrol edilen bir dosya olan ~/.my.cnf’de sağlayabiliriz. Satır içi içeriği kopyalayarak bir /root/.my.cnf dosyası oluşturun

1
2
3
4
5
6
7
8
- name: Add .my.cnf to user home
  copy:
    content: |
      [client]
      user=root
      password={{ mysql_root_password }}
    dest: /root/.my.cnf
    mode: 0600

Anonim kullanıcıları kaldırma

Anonim kullanıcıları kaldırmak iyi bir uygulamadır. Bu görevi kullanarak yapalım:

1
2
3
4
5
6
7
- name: Remove anonymous users
  mysql_user:
    login_user: root
    login_password: "{{ mysql_root_password }}"
    name: ''
    host_all: yes
    state: absent

Dissalow kökü uzaktan oturum açmaktan alıkoy

mysql.user tablosundaki girdileri kaldırmak için aşağıdakileri çalıştırın. Bu, kök kullanıcının yalnızca yerel olarak oturum açabildiğinden emin olun:

1
2
3
4
- name: Disallow root login remotely
  mysql_query:
    login_password: "{{ mysql_root_password }}"
    query: "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1')"

Test veritabanını kaldırın ve ona erişin

Test veritabanına ihtiyacımız olmadığı için bu görevle kaldırabiliriz:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
- name: Remove test database
  mysql_db:
    login_user: root
    login_password: "{{ mysql_root_password }}"
    name: test
    state: absent

- name: Remove privileges on test database
  mysql_query:
    login_user: root
    login_password: "{{ mysql_root_password }}"
    query: "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'"

Değişiklikleri uygulamak için ayrıcalıkları yeniden yükleyin

Yukarıda yaptığımız değişiklikleri uygulamak için, bu görevle ayrıcalıkları yeniden yükleyin:

1
2
3
4
5
- name: Reload privileges
  mysql_query:
    login_user: root
    login_password: "{{ mysql_root_password }}"
    query: "FLUSH PRIVILEGES"

Kopyaladığımız .my.cnf dosyasını silin

Güvenlik için, kök erişimi içerdiğinden /root/.my.cnf dosyasını kaldıralım:

1
2
3
4
- name: Delete .my.conf
  file:
    path: /root/.my.cnf
    state: absent

Playbook ‘un Tamamı

Bu, tüm görevleri içeren tüm oyun kitabıdır:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
---
- name: Install and configure mariadb server on Ubuntu 22.04
  hosts: db-srv
  gather_facts: false
  become: true
  vars:
    mysql_root_password: 'superSecretPassword'
  tasks:
    - name: Update apt repositories and cache on server
      apt:
        update_cache: yes
        force_apt_get: yes
        cache_valid_time: 3600

    - name: Upgrade all packages on server
      apt:
        upgrade: dist
        force_apt_get: yes

    - name: Check if a reboot is needed on all servers
      register: reboot_required_file
      stat:
        path: /var/run/reboot-required
        get_checksum: false

    - name: Reboot the server if kernel updated
      reboot:
        msg: "Reboot initiated by Ansible for kernel updates"
        connect_timeout: 5
        reboot_timeout: 300
        pre_reboot_delay: 0
        post_reboot_delay: 30
        test_command: uptime
      when: reboot_required_file.stat.exists

    - name: Install Nginx, MySQL, PHP, and related packages
      apt:
        name:
          - mysql-server
          - unzip
          - python3-mysqldb
          - vim
          - git
        state: present

    - name: Start and enable MySQL
      systemd:
        name: mysql
        state: started
        enabled: yes

    - name: Ensure root user can only login from localhost
      mysql_user:
        login_password: "{{ mysql_root_password }}"
        check_implicit_admin: yes
        name: root
        host: "{{ item }}"
        password: "{{ mysql_root_password }}"
        state: present
      with_items:
        - localhost
        - 127.0.0.1
        - ::1

    - name: Add .my.cnf to user home
      copy:
        content: |
          [client]
          user=root
          password={{ mysql_root_password }}
        dest: /root/.my.cnf
        mode: 0600

    - name: Remove anonymous users
      mysql_user:
        login_user: root
        login_password: "{{ mysql_root_password }}"
        name: ''
        host_all: yes
        state: absent

    - name: Disallow root login remotely
      mysql_query:
        login_password: "{{ mysql_root_password }}"
        query: "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1')"

    - name: Remove test database
      mysql_db:
        login_user: root
        login_password: "{{ mysql_root_password }}"
        name: test
        state: absent

    - name: Remove privileges on test database
      mysql_query:
        login_user: root
        login_password: "{{ mysql_root_password }}"
        query: "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'"

    - name: Reload privileges
      mysql_query:
        login_user: root
        login_password: "{{ mysql_root_password }}"
        query: "FLUSH PRIVILEGES"

    - name: Secure root account
      mysql_user:
        login_user: root
        login_password: "{{ mysql_root_password }}"
        name: root
        host: "{{ item }}"
        state: absent
      with_items:
        - "%"
        - "::1"
      when: item != 'localhost' and item != '127.0.0.1'

    - name: Delete .my.conf
      file:
        path: /root/.my.cnf
        state: absent

Playbook’u çalıştırmak için yukarıdaki içerikle setup-mysql.yaml dosyasını ve hosts dosya içeriğiyle hosts.yaml oluşturmanız ve ardından yürütmek için aşağıdaki komutu kullanmanız gerekir:

1
ansible-playbook -i hosts.yaml setup-mysql.yaml -vv

 

Yazının orijinalini buradna okuyabilirsiniz.