Я пытаюсь прочитать пароль базы данных на удаленном хосте из файла /etc/mysql/debian.cnf
. Формат файла ниже. Есть ли способ разобрать password
поле, чтобы я мог удалить пользователя mysql через Ansible?
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host = localhost
user = root
password = 5unnyv4l3
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = root
password = 5unnyv4l3
socket = /var/run/mysqld/mysqld.sock
basedir = /usr
Похоже, модуль slurp подойдет для ваших требований: https://docs.ansible.com/ansible/latest/modules/slurp_module.html
- name: extract password from file
slurp:
src: /etc/mysql/debian.cnf
register: mypasswordfile
- name: Set User Password
user: name=newUser
password="{{ passwordfile['content'] | b64decode | regex_findall('password = \"(.+)\"') | first }}"
Отредактировал после тестирования и исправления.
Если файл является локальным для доступной системы, вы можете использовать поиск ini который будет читать значения из файла стиля ini. Если ваш файл удален, вы можете использовать fetch / slurp для загрузки копии в локальную систему.
Я бы предположил, что поиск будет примерно таким
- debug: msg="Password is {{ lookup('ini', 'password section=client file=my.cnf') }}"
Вы можете использовать команду или модуль оболочки и сделать это с помощью awk / sed, например:
- name: get the value in the block on the file
command: >
awk -F ' *= *' '{ if ($1 ~ /^\[/) section=$1;
else if ($1 ~ /^password/ && section ~ /^\[client\]$/ ) print $2 }'
"{{ file_path }}"
register: password_value
В этом случае для обработки комментария в той же строке вы можете сделать
- name: setting the password without comments
set_fact:
password: "{{ password_value.stdout.split('#')[0] }}"