Невозможно создать базу данных mysql через ansible

. У меня установлен mysql 5.7 на моей удаленной системе. Мне нужно создать новую базу данных и новый пользовательский доступ к этой базе данных. . Так как это mysql-community-server 5.7, изначально мне нужно ввести пароль grep из /var/log/mysqld.log

[root@lamp2 labadmin]# cat /var/log/mysqld.log | grep temporary
2018-01-09T10:57:17.326484Z 1 [Note] A temporary password is generated for 
root@localhost: gg%j,opuE3Sm
2018-01-09T10:57:34.471131Z 0 [Note] InnoDB: Creating shared tablespace for 
temporary tables

Итак, используя ansible, как мне предоставить root-доступ, поскольку я не могу найти какой-либо модуль для использования этого пароля. хочу создать для этого сценарий. Я выполнил следующую книгу и получил ошибку

- hosts: lamp
  remote_user: root
  vars:
    dbname: wordpressdb
    dbuser: wordpressuser
    password: REDhat@123
  tasks:
  - name: installing mysql-python
    yum:
      name: MySQL-python
      state: present
  - name: Creating database
    mysql_db: name={{ dbname }} state=present

  - name: Create db User
    mysql_user: name={{ dbuser }} password={{ password }} priv=*.*:ALL
    host='localhost' state=present

error:

 TASK [Creating database] 
 *******************************************************
 fatal: [52.172.48.12]: FAILED! => {"changed": false, "failed": true, "msg": 
 "unable to find /root/.my.cnf. Exception message: (1045, \"Access denied 
 for user 'root'@'localhost' (using password: NO)\")"}

Помогите мне найти решение. Я новичок в доступе. Также я хочу знать, как сбросить пароль root.

Примечание: я уже скопировал. my.cnf, чтобы указать имя пользователя и пароль для входа в mysql. но я сделал это вручную. Я хочу сначала войти в систему, используя этот временный пароль. Как я могу сделать это возможным

3
задан 30 January 2018 в 07:38
3 ответа

Как указано в примечаниях к модулю mysql_db и примечаниях mysql_user (одинаковый текст в обоих):

Когда вы используете логин_пароль и логин_пользователь, требуются проходят учетные данные. Если их нет, модуль попытается прочитать учетные данные из ~ / .my.cnf и, наконец, вернуться к использованию MySQL вход в систему по умолчанию «root» без пароля.

Таким образом, у вас есть несколько вариантов:

Передать учетные данные задаче

- name: Creating database
  mysql_db: name={{ dbname }} state=present login_user={{ DB_USER }} login_password={{ DB_USER_PASS }} 

- name: Create db User
  mysql_user: name={{ dbuser }} password={{ password }} priv=*.*:ALL
  host='localhost' state=present login_user={{ DB_USER }} login_password={{ DB_USER_PASS }} 

Заменить DB_USER и DB_USER_PASS учетными данными администратора пользователя базы данных.

Но это далеко не оптимально , потому что вам нужно вводить учетные данные в каждую задачу mysql, и ваши учетные данные должны быть в вашем доступном коде. Вы можете использовать доступное хранилище , чтобы смягчить это, но даже там есть лучшие варианты.

Запишите файл ~ / .my.cnf с учетными данными

Создайте или отредактируйте ] ~ / .my.cnf файл в доме пользователя (вероятно, root) с учетными данными mysql:

[client]
user=root
password="PASSWORD"

(вам может потребоваться добавить другие детали подключения).

Третий вариант Я не уверен, как он работает в CentOS, но в основном подразумевает, что пользователь root может подключаться к mysql без использования учетных данных. Обычно для этого используется файл /root/-.my.cnf, но в CentOS он может отличаться.

1
ответ дан 3 December 2019 в 05:11

После поиска в Google я нашел способ сбросить временный пароль:

- name: Find temporary password
  shell: "echo `grep 'temporary.*root@localhost' /var/log/mysqld.log | sed 
's/.*root@localhost: //'`"
  register: mysql_root_password_temp
  tags: register

Set the new password using the temporary password
- name: Set new password from temporary password
  shell: 'mysql -e "SET PASSWORD = PASSWORD(''{{ mysql_root_password }}'');" 
--connect-expired-password -u root -p"{{ mysql_root_password_temp.stdout 
}}"'
0
ответ дан 3 December 2019 в 05:11

«Свежая» установка MySQL 5.7 разрешает локальный вход в систему root с использованием файла сокета (критическим моментом является строка login_unix_socket: /var/run/mysqld/mysqld.sock в задачах /main.yml)

Несмотря на то, что обходные пути «оболочки», упомянутые в других ответах на этот и аналогичные вопросы, выполняют свою работу - они не являются идемпотентными и создают состояние «изменено», что нехорошо.

Следующие ниже фрагменты работают в полностью идемпотентный способ в Ubuntu 18.04+

tasks / main.yml

  # ...deleted...

- name: Ensure mysql is running and starts on boot
  service:
    name: mysql
    state: started
    enabled: yes
  become: yes

- name: Ensure mysql root password is updated for all root accounts
  mysql_user:
    name: root
    host: "{{ item }}"
    login_unix_socket: /var/run/mysqld/mysqld.sock
    password: "{{ mysql.root_db_password }}"
    priv: '*.*:ALL,GRANT'
    check_implicit_admin: true
  loop: "{{ mysql.hosts }}"
  become: yes
  notify: Restart MySQL

- name: Create `/root/.my.cnf`  with root password credentials
  template:
    src:  my.cnf.j2
    dest: /root/.my.cnf
    owner: root
    mode: 0600
  become: yes
  notify: Restart MySQL

templates / my.cnf.j2

[client]
user=root
password={{ mysql.root_db_password }}

defaults / main.yml

mysql:
  root_db_password: REDACTED
  hosts:
    - "{{ ansible_hostname }}"
    - 127.0.0.1
    - ::1
    - localhost
6
ответ дан 3 December 2019 в 05:11

Теги

Похожие вопросы