Назад | Перейти на главную страницу

Как прочитать строку из файла в доступную переменную

Я пытаюсь прочитать пароль базы данных на удаленном хосте из файла /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] }}"