WIP: Add maxscale role #106

Draft
mtrossevin wants to merge 9 commits from mtrossevin/ansible-roles:add-maxscale into unstable
12 changed files with 190 additions and 0 deletions
Showing only changes of commit 94f088e1bf - Show all commits

3
maxscale/README.md Normal file
View file

@ -0,0 +1,3 @@
# maxscale
Install MariaDB maxscale on a server.

View file

@ -0,0 +1,29 @@
---
maxscale_version: 2.4
# The passwords needs to be either unencrypted or encrypted with maxpasswd on
# the MaxScale server.
maxscale_mysql_user: maxscale
maxscale_mysql_password: Null
encrypted_maxscale_mysql_password: Null
maxscale_monitor_user: monitor_user
maxscale_monitor_password: Null
encrypted_maxscale_monitor_password: Null
# Define this variable if you want ansible to create the two users on the MySQL server
# through delegation
maxscale_mysql_master: Null
maxscale_mysql_servers: []
# Example (port is optional and default to 3306):
# maxscale_mysql_servers:
# - name: db1
# address: 192.0.2.102
# port: 3306
maxscale_services:
- name: "Splitter"
router: "readwritesplit"
port: 3306

View file

@ -0,0 +1,5 @@
---
- name: 'restart maxscale'
service:
name: maxscale
state: restarted

20
maxscale/meta/main.yml Normal file
View file

@ -0,0 +1,20 @@
galaxy_info:
author: Evolix
description: Install MariaDB Maxscale
issue_tracker_url: https://gitea.evolix.org/evolix/ansible-roles/issues
license: GPLv2
min_ansible_version: 2.4
platforms:
- name: Debian
version:
- stretch
- buster
dependencies: []
# List your role dependencies here, one per line.
# Be sure to remove the '[]' above, if you add dependencies
# to this list.

View file

@ -0,0 +1,26 @@
- name: "Create key for password encryption"
command:
cmd: "/usr/bin/maxkeys"
creates: "/var/lib/maxscale/.secrets"
- name: "Encrypt mysql password for saving in configuration"
command:
cmd: "/usr/bin/maxpasswd {{ maxscale_mysql_password|quote }}"
register: encrypt_maxscale_mysql_password_result
when: encrypted_maxscale_mysql_password is none
- name: "Encrypt monitor password for saving in configuration"
command:
cmd: "/usr/bin/maxpasswd {{ maxscale_monitor_password|quote }}"
register: encrypt_maxscale_monitor_password_result
when: encrypted_maxscale_monitor_password is none
- name: "Copy the configuration"
template:
src: "maxscale.cnf.j2"
dest: "/etc/maxscale.cnf"
owner: 'root'
group: 'root'
mode: '0644'
notify: 'restart maxscale'

9
maxscale/tasks/main.yml Normal file
View file

@ -0,0 +1,9 @@
---
- include: packages_stretch.yml
- include: mysql_add_user.yml
when: maxscale_mysql_master is string
- include: config_stretch.yml

View file

@ -0,0 +1,20 @@
- name: "Create maxscale user on MySQL master"
mysql_user:
name: "{{ maxscale_mysql_user }}"
password: "{{ maxscale_mysql_password }}"
host: "{{ item }}"
priv: 'mysql.user:SELECT/mysql.db:SELECT/mysql.tables_priv:SELECT/mysql.roles_mapping:SELECT/*.*:SHOW DATABASES'
state: present
delegate_to: "{{ maxscale_mysql_master }}"
loop: "{{ ansible_facts['all_ipv4_addresses'] }}"
- name: "Create monitor user on MySQL master"
mysql_user:
name: "{{ maxscale_monitor_user }}"
password: "{{ maxscale_monitor_password }}"
host: "{{ item }}"
priv: '*.*:REPLICATION CLIENT'
state: present
delegate_to: "{{ maxscale_mysql_master }}"
loop: "{{ ansible_facts['all_ipv4_addresses'] }}"

View file

@ -0,0 +1,22 @@
- name: "Install MariaDB keys"
apt_key:
keyserver: keyserver.ubuntu.com
id: "{{ item }}"
loop:
- "0x13cfde6dd9ee9784f41af0f670e4618a8167ee24"
- "0x4c470fffefc4d3dc59778655ce1a3dd5e3c94f49"
- "0x199369e5404bd5fc7d2fe43bcbcb082a1bb943db"
- "0x177f4010fe56ca3336300305f1656f24c74cd1d8"
- "0x7b963f525ad3ae6259058d30135659e928c12247"
- name: "Add MariaDB MaxScale repository"
apt_repository:
repo: "deb https://downloads.mariadb.com/MaxScale/{{ maxscale_version }}/debian {{ ansible_distribution_release }} main"
state: present
filename: mariadb-maxscale
- name: "Install MariaDB MaxScale"
apt:
name: maxscale
state: present

View file

@ -0,0 +1,43 @@
[maxscale]
threads=auto
{% for server in maxscale_mysql_servers %}
[{{ server['name'] }}]
type=server
address={{ server['address'] }}
port={{ server['port']|default(3306) }}
protocol=MariaDBBackend
{% endfor %}
[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers={% for server in maxscale_mysql_servers %}{{ server['name'] }}{% if not loop.last %}, {% endif %}{% endfor %}
user={{ maxscale_monitor_user }}
{% if encrypted_maxscale_monitor_password is none %}
password={{ encrypt_maxscale_monitor_password_result['stdout'] }}
{% else %}
password={{ encrypted_maxscale_monitor_password }}
{% endif %}
monitor_interval=2000
{% for service in maxscale_services %}
[{{ service['name'] }}-Service]
type=service
router={{ service['router'] }}
cluster=MariaDB-Monitor
user={{ maxscale_mysql_user }}
{% if encrypted_maxscale_mysql_password is none %}
password={{ encrypt_maxscale_mysql_password_result['stdout'] }}
{% else %}
password={{ encrypted_maxscale_mysql_password }}
{% endif %}
[{{ service['name'] }}-Listener]
type=listener
service={{ service['name'] }}-Service
protocol=MariaDBClient
port={{ service['port'] }}
{% endfor %}

2
maxscale/tests/inventory Normal file
View file

@ -0,0 +1,2 @@
localhost

9
maxscale/tests/test.yml Normal file
View file

@ -0,0 +1,9 @@
---
- hosts: test-kitchen
vars:
maxscale_mysql_password: maxscale-pwd
maxscale_monitor_password: mypwd
maxscale_mysql_servers:
- 127.0.0.1 # Need at least one server
roles:
- maxscale

2
maxscale/vars/main.yml Normal file
View file

@ -0,0 +1,2 @@
---
# vars file for maxscale