I managed to install Apache Mysql/Mariadb and PHP using playbook. How can I do mysql_secure_installation
using ansible?
I am a beginner in Ansible. I want to set a new password to MySQL server and complete all security questions via playbook.
Server Fault is a question and answer site for system and network administrators. It only takes a minute to sign up.
Sign up to join this communityI implemented this myself for my MariaDB installations some time back, and before I trusted anyone else to do it correctly. These are the steps I performed:
# mysql_secure_installation
- name: Update MariaDB root password
mysql_user: name=root host={{item}} password={{mysql_root_password}}
with_items:
- 127.0.0.1
- ::1
- localhost
- name: Set ~/.my.cnf file
template: src=dotmy.cnf.j2 dest=/root/.my.cnf mode=0600
# mysql_secure_installation
- name: Delete anonymous MySQL user
mysql_user: name="" host={{item}} state=absent
with_items:
- localhost
- "{{ansible_nodename}}"
# mysql_secure_installation
- name: Delete Hostname based MySQL user
mysql_user: name=root host="{{ansible_nodename}}" state=absent
# mysql_secure_installation
- name: Remove MySQL test database
mysql_db: name=test state=absent
You'll have to decide how to create mysql_root_password
yourself.
login_password="{{ mysql_old_root_password }}"
is needed to change root's password.
Jul 24, 2020 at 12:43
I wrote a custom ansible module to do this: https://github.com/eslam-gomaa/mysql_secure_installation_Ansible .
Example
- name: test mysql_secure_installation
mysql_secure_installation:
login_password: ''
new_password: password22
user: root
login_host: localhost
hosts: ['localhost', '127.0.0.1', '::1']
change_root_password: true
remove_anonymous_user: true
disallow_root_login_remotely: true
remove_test_db: true
register: mysql_secure
# To see detailed output
- debug:
var: mysql_secure
You can do this with Ansible's Expect Module. Here is an example:
- name: secure mariadb
become: yes
expect:
command: mysql_secure_installation
responses:
'Enter current password for root': ''
'Set root password': 'n'
'Remove anonymous users': 'y'
'Disallow root login remotely': 'y'
'Remove test database': 'y'
'Reload privilege tables now': 'y'
timeout: 1
register: secure_mariadb
failed_when: "'... Failed!' in secure_mariadb.stdout_lines"
Be aware: This configuration works for me but you may have to adjust the values according to your needs!
For idempotency reasons it is a good practice to implement the hardening steps done by mysql_secure_installation
with dedicated Ansible tasks rather than executing mysql_secure_installation
via Ansible directly.
mysql_secure_installation
does the following:
Theses hardening tasks can be implemented with Ansible like this:
- name: test database is absent
mysql_db: name=test state=absent
when: mysql_remove_test_database
Check out dev-sec's MySQL hardening repository for an complete example how to implement the mysql_secure_installation
steps with Ansible tasks.