Select Git revision
      
    server.sls  6.00 KiB 
include:
  - .config
  - .python
{%- from tpldir ~ "/map.jinja" import mysql with context %}
{%- set os = salt['grains.get']('os', None) %}
{%- set os_family = salt['grains.get']('os_family', None) %}
{%- set mysql_root_user = salt['pillar.get']('mysql:server:root_user', 'root') %}
{%- set mysql_root_password = salt['pillar.get']('mysql:server:root_password', salt['grains.get']('server_id')) %}
{%- set mysql_host = salt['pillar.get']('mysql:server:host', 'localhost') %}
{%- set mysql_salt_user = salt['pillar.get']('mysql:salt_user:salt_user_name', mysql_root_user) %}
{%- set mysql_salt_password = salt['pillar.get']('mysql:salt_user:salt_user_password', mysql_root_password) %}
{%- set mysql_datadir = salt['pillar.get']('mysql:server:mysqld:datadir', '/var/lib/mysql') %}
{%- if mysql_root_password %}
{%- if os_family == 'Debian' %}
mysql_debconf_utils:
  pkg.installed:
    - name: {{ mysql.debconf_utils }}
mysql_debconf:
  debconf.set:
    - name: {{ mysql.serverpkg }}
    - data:
        '{{ mysql.serverpkg }}/start_on_boot': {'type': 'boolean', 'value': 'true'}
    - require_in:
      - pkg: {{ mysql.serverpkg }}
    - require:
      - pkg: mysql_debconf_utils
  {%- if 'osmajorrelease' in grains and salt['grains.get']('osmajorrelease')|int < 9 or not salt['grains.get']('os')|lower == 'debian' %}
mysql_password_debconf:
  debconf.set:
    - name: mysql-server
    - data:
        'mysql-server/root_password': {'type': 'password', 'value': '{{ mysql_root_password }}'}
        'mysql-server/root_password_again': {'type': 'password', 'value': '{{ mysql_root_password }}'}
    - require_in:
      - pkg: {{ mysql.serverpkg }}
    - require:
      - pkg: mysql_debconf_utils
  {%- endif %}
{%- elif os_family in ['RedHat', 'Suse', 'FreeBSD'] %}
mysql_root_password:
  cmd.run:
    - name: mysqladmin --host "{{ mysql_host }}" --user {{ mysql_root_user }} password '{{ mysql_root_password|replace("'", "'\"'\"'") }}'
    - unless: mysql --host "{{ mysql_host }}" --user {{ mysql_root_user }} --password='{{ mysql_root_password|replace("'", "'\"'\"'") }}' --execute="SELECT 1;"
    - require:
      - service: mysqld-service-running
{%- for host in {'localhost': '', 'localhost.localdomain': '', salt['grains.get']('fqdn'): ''}.keys() %}
mysql_delete_anonymous_user_{{ host }}:
  mysql_user:
    - absent
    - host: {{ host or "''" }}
    - name: ''
    - connection_host: '{{ mysql_host }}'
    - connection_user: '{{ mysql_salt_user }}'
    {%- if mysql_salt_password %}
    - connection_pass: '{{ mysql_salt_password }}'
    {%- endif %}
    - connection_charset: utf8
    - require:
      - service: mysqld-service-running
      - pkg: mysql_python
      {%- if (mysql_salt_user == mysql_root_user) and mysql_root_password %}      - cmd: mysql_root_password
      {%- endif %}
      {%- if (mysql_salt_user != mysql_root_user) %}
      - sls: mysql.salt-user
      {%- endif %}
{%- endfor %}
{%- endif %}
{%- endif %}
{%- if os_family == 'Arch' %}
# on arch linux: inital mysql datadirectory is not created
mysql_install_datadir:
  cmd.run:
{%- if mysql.version is defined and mysql.version >= 5.7 %}
    - name: mysqld --initialize-insecure --user=mysql --basedir=/usr --datadir={{ mysql_datadir }}
{%- else %}
    - name: mysql_install_db --user=mysql --basedir=/usr --datadir={{ mysql_datadir }}
{%- endif %}
    - runas: root
    - creates: {{ mysql_datadir }}/mysql/user.frm
    - env:
        - TMPDIR: '/tmp'
    - require:
      - pkg: {{ mysql.serverpkg }}
      - file: mysql_config
    - require_in:
      - service: mysqld-service-running
{%- endif %}
mysqld-packages:
  pkg.installed:
    - name: {{ mysql.serverpkg }}
{%- if os_family == 'Debian' and mysql_root_password %}
    - require:
      - debconf: mysql_debconf
{%- endif %}
    - require_in:
      - file: mysql_config
{%- if "config_directory" in mysql %}
      - file: mysql_config_directory
{%- endif %}
{%- if os_family in ['RedHat', 'Suse'] and mysql.version is defined and mysql.version >= 5.7 and mysql.serverpkg.lower() != 'mariadb-server' %}
# Initialize mysql database with --initialize-insecure option before starting service so we don't get locked out.
mysql_initialize:
  cmd.run:
    - name: mysqld --initialize-insecure --user=mysql --basedir=/usr --datadir={{ mysql_datadir }}
    - runas: root
    - creates: {{ mysql_datadir }}/mysql/
    - require:
      - pkg: {{ mysql.serverpkg }}
{%- endif %}
{%- if os_family in ['RedHat', 'Suse'] and mysql.serverpkg.lower() == 'mariadb-server' %}
# For MariaDB it's enough to only create the datadir
mysql_initialize:
  file.directory:
    - name: {{ mysql_datadir }}
    - user: mysql
    - group: mysql
    - makedirs: True
    - require:
      - pkg: {{ mysql.serverpkg }}
{%- endif %}
{%- if os_family in ['Gentoo'] %}
mysql_initialize:
  cmd.run:
    - name: emerge --config {{ mysql.serverpkg }}
    - runas: root    - creates: {{ mysql_datadir }}/mysql/
    - require:
      - pkg: {{ mysql.serverpkg }}
{%- endif %}
mysqld-service-running:
  service.running:
    - name: {{ mysql.service }}
    - enable: True
    - require:
      - pkg: {{ mysql.serverpkg }}
{%- if (os_family in ['RedHat', 'Suse'] and mysql.version is defined and mysql.version >= 5.7 and mysql.serverpkg.lower() != 'mariadb-server') or (os_family in ['Gentoo']) %}
      - cmd: mysql_initialize
{%- elif os_family in ['RedHat', 'Suse'] and mysql.serverpkg.lower() == 'mariadb-server' %}
      - file: {{ mysql_datadir }}
{%- endif %}
    - watch:
      - pkg: {{ mysql.serverpkg }}
      - file: mysql_config
{%- if "config_directory" in mysql and "server_config" in mysql %}
      - file: mysql_server_config
{%- endif %}
mysql_what_is_status_of_{{ mysql.service }}:
  cmd.run:
    - names:
      - service {{ mysql.service }} status
    - onfail:
      - service: mysqld-service-running
# official oracle mysql repo
# creates this file, that rewrites /etc/mysql/my.cnf setting
# so, make it empty
mysql_additional_config:
  file.managed:
    - name: /usr/my.cnf
    - source: salt://{{ tpldir }}/files/usr-my.cnf
    - create: False
    - watch_in:
      - service: mysqld-service-running