HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-19
1 Ansible идеально подходит для деплоймента MySQL на сервере без лишних усилий с нашей стороны. Давайте вместе посмотрим, как это происходит. Даже если у вас пока нет опыта с Ansible, вы легко во всем разберетесь. Мы используем образ Docker с Ansible, как описано в <a>этой статье</a>.<p>Чтобы создать базу данных MySQL, мы выполним несколько действий:</p>
1 Ansible идеально подходит для деплоймента MySQL на сервере без лишних усилий с нашей стороны. Давайте вместе посмотрим, как это происходит. Даже если у вас пока нет опыта с Ansible, вы легко во всем разберетесь. Мы используем образ Docker с Ansible, как описано в <a>этой статье</a>.<p>Чтобы создать базу данных MySQL, мы выполним несколько действий:</p>
2 <ol><li>Создадим файл hosts (не так уж и нужен в таком простом примере, но всегда используется в реальных проектах).</li>
2 <ol><li>Создадим файл hosts (не так уж и нужен в таком простом примере, но всегда используется в реальных проектах).</li>
3 <li>Создадим плейбук. Обычно это самая главная часть, так что мы изучим его построчно.</li>
3 <li>Создадим плейбук. Обычно это самая главная часть, так что мы изучим его построчно.</li>
4 <li>Создадим файл SQL. Это необязательно, но с его помощью можно создать данные для базы данных, чтобы потом протестировать ее.</li>
4 <li>Создадим файл SQL. Это необязательно, но с его помощью можно создать данные для базы данных, чтобы потом протестировать ее.</li>
5 <li>Протестируем внесенные изменения.</li>
5 <li>Протестируем внесенные изменения.</li>
6 </ol>Перейдем к делу.<h2>1. Создаем файл hosts</h2>
6 </ol>Перейдем к делу.<h2>1. Создаем файл hosts</h2>
7 Это не обязательный файл, но мы предпочитаем запускать плейбук с его помощью для тестов на localhost. Потом можно изменить IP-адрес, чтобы перенестись в другую среду. Здесь в файле hosts всего одна запись (можете скопировать ее): <strong>touch hosts</strong><blockquote><em>[mysql]</em></blockquote><blockquote><strong><em>127.0.0.1</em></strong></blockquote><h2>2. Создаем плейбук MySQL</h2>
7 Это не обязательный файл, но мы предпочитаем запускать плейбук с его помощью для тестов на localhost. Потом можно изменить IP-адрес, чтобы перенестись в другую среду. Здесь в файле hosts всего одна запись (можете скопировать ее): <strong>touch hosts</strong><blockquote><em>[mysql]</em></blockquote><blockquote><strong><em>127.0.0.1</em></strong></blockquote><h2>2. Создаем плейбук MySQL</h2>
8 Здесь происходит самое интересное: устанавливаются приложения, настраиваются так, как нам нужно, создается тестовая база данных и в нее добавляются данные. Все эти настройки нужно где-то хранить, так что начнем с создания файла <strong>db-server-playbook.yml</strong>:<blockquote><em>touch db-server-playbook.yml</em></blockquote>Открываем созданный файл в текстовом редакторе и для начала указываем хосты, куда будем деплоить ресурсы (в строке 2 нам как раз пригодится созданный файл hosts). Затем задаем переменную для <strong>mysql_root_password</strong> в строках 4 и 5. Здесь мы указываем пароль открытым текстом только для демонстрации. В реальном мире мы использовали бы, например, <strong>ansible-vault</strong> или переменную командной строки:<p><strong>Примечание:</strong> <em>Не добавляйте номера в начале каждой строки - мы пронумеровали их просто для ясности.</em></p>
8 Здесь происходит самое интересное: устанавливаются приложения, настраиваются так, как нам нужно, создается тестовая база данных и в нее добавляются данные. Все эти настройки нужно где-то хранить, так что начнем с создания файла <strong>db-server-playbook.yml</strong>:<blockquote><em>touch db-server-playbook.yml</em></blockquote>Открываем созданный файл в текстовом редакторе и для начала указываем хосты, куда будем деплоить ресурсы (в строке 2 нам как раз пригодится созданный файл hosts). Затем задаем переменную для <strong>mysql_root_password</strong> в строках 4 и 5. Здесь мы указываем пароль открытым текстом только для демонстрации. В реальном мире мы использовали бы, например, <strong>ansible-vault</strong> или переменную командной строки:<p><strong>Примечание:</strong> <em>Не добавляйте номера в начале каждой строки - мы пронумеровали их просто для ясности.</em></p>
9 <blockquote><strong><em>1</em></strong><em>---</em></blockquote><blockquote><strong><em>2</em></strong><em>- hosts: mysql</em></blockquote><blockquote><strong><em>3</em></strong><em></em></blockquote><blockquote><strong><em>4 </em></strong><em>vars:</em></blockquote><blockquote><strong><em>5 </em></strong><em>mysql_root_password: password</em></blockquote><blockquote><strong><em>6</em></strong></blockquote>Настроив переменные, начинаем определять задачи. Для начала мы устанавливаем mysql с помощью <strong>apt</strong> для установки в образе Ubuntu Docker. Еще можно было бы использовать модуль <strong>package</strong> или <strong>yum</strong>, если бы у нас был образ Centos:<blockquote><strong><em>7</em></strong><em> tasks:</em></blockquote><blockquote><strong><em>8 </em></strong><em> - name: install mysql </em></blockquote><blockquote><strong><em>9 </em></strong><em> apt: </em></blockquote><blockquote><strong><em>10 </em></strong><em> name: mysql</em></blockquote><blockquote><strong><em>11 </em></strong><em>update_cache: yes</em></blockquote><blockquote><strong><em>12 </em></strong><em>cache_valid_time: 3600</em></blockquote><blockquote><strong><em>13</em></strong><em> state: present</em></blockquote>Настроим задачи, чтобы убедиться, что сервис mysql работает и будет запущен при старте:<blockquote><strong><em>14</em></strong><em> - name: start up the mysql service</em></blockquote><blockquote><strong><em>15</em></strong><em> shell: "service mysql start"</em></blockquote><blockquote><strong><em>16</em></strong><em> - name: ensure mysql is enabled to run on startup</em></blockquote><blockquote><strong><em>17</em></strong><em> service:</em></blockquote><blockquote><strong><em>18</em></strong><em> name:mysql</em></blockquote><blockquote><strong><em>19</em></strong><em> state:started</em></blockquote><blockquote><strong><em>20</em></strong><em> enabled:true</em></blockquote>Теперь можно настроить пароль для всех корневых аккаунтов в установке mysql. Хотя mysql устанавливается только на одном хосте (образ Docker), на него ссылаются другие имена, включая localhost и 127.0.0.1. Для всех нужно указать модуль <strong>mysql_user</strong> и набор привилегий, как в примере ниже, где используется директива <strong>with_item</strong>:<blockquote><strong><em>21</em></strong><em> - name: update mysql root password for all root accounts</em></blockquote><blockquote><strong><em>22 </em></strong><em>mysql_user:</em></blockquote><blockquote><em></em><strong>23</strong> name: root</blockquote><blockquote><strong>24. </strong> host: "{{ item }}"</blockquote><blockquote><strong><em>25</em></strong><em> password: "{{ mysql_root_password }}"</em></blockquote><blockquote><strong><em>26</em></strong><em> login_user: root</em></blockquote><blockquote><strong><em>27</em></strong><em> login_password: "{{ mysql_root_password }}"</em></blockquote><blockquote><strong><em>28 </em></strong><em>check_implicit_admin: yes</em></blockquote><blockquote><strong><em>29</em></strong><em> priv: "*.*:ALL,GRANT"</em></blockquote><blockquote><strong><em>30</em></strong><em> with_items:</em></blockquote><blockquote><strong><em>31</em></strong><em> - "{{ ansible_hostname }}"</em></blockquote><blockquote><strong><em>32</em></strong><em> - 127.0.0.1</em></blockquote><blockquote><strong><em>33</em></strong><em> - ::1</em></blockquote><blockquote><strong><em>34</em></strong><em> - localhost</em></blockquote>После настройки MySQL можем использовать модуль <strong>mysql_db</strong>, чтобы создать тестовую базу данных в строках 37-40, а затем в строках 46-51 импортируем в нее данные из файла SQL, который мы скоро создадим:<blockquote><strong><em>35 </em></strong><em>- name: create a new database</em></blockquote><blockquote><strong><em>36</em></strong><em> mysql_db:</em></blockquote><blockquote><strong><em>37</em></strong><em> name: testdb</em></blockquote><blockquote><strong><em>38</em></strong><em> state: present</em></blockquote><blockquote><strong><em>39</em></strong><em> login_user: root</em></blockquote><blockquote><strong><em>40</em></strong><em> login_password: "{{ mysql_root_password }}"</em></blockquote><blockquote><strong><em>41</em></strong><em> - name: add sample data to database</em></blockquote><blockquote><strong><em>42 </em></strong><em>copy:</em></blockquote><blockquote><strong><em>43</em></strong><em> src:dump.sql</em></blockquote><blockquote><strong><em>44</em></strong><em> dest:/tmp/dump.sql</em></blockquote><blockquote><strong><em>45</em></strong><em> - name: insert sample data into database</em></blockquote><blockquote><strong><em>46</em></strong><em> mysql_db:</em></blockquote><blockquote><strong><em>47</em></strong><em> name: testdb</em></blockquote><blockquote><strong><em>48</em></strong><em> state: import</em></blockquote><blockquote><strong><em>49</em></strong><em> target: /tmp/dump.sql</em></blockquote><blockquote><strong><em>50</em></strong><em> login_user: root</em></blockquote><blockquote><strong><em>51</em></strong><em> login_password: "{{ mysql_root_password }}"</em></blockquote>Сохраним плейбук и создадим файл SQL с тестовыми данными, которые можно импортировать в БД.<h2>3. Создаем файл SQL</h2>
9 <blockquote><strong><em>1</em></strong><em>---</em></blockquote><blockquote><strong><em>2</em></strong><em>- hosts: mysql</em></blockquote><blockquote><strong><em>3</em></strong><em></em></blockquote><blockquote><strong><em>4 </em></strong><em>vars:</em></blockquote><blockquote><strong><em>5 </em></strong><em>mysql_root_password: password</em></blockquote><blockquote><strong><em>6</em></strong></blockquote>Настроив переменные, начинаем определять задачи. Для начала мы устанавливаем mysql с помощью <strong>apt</strong> для установки в образе Ubuntu Docker. Еще можно было бы использовать модуль <strong>package</strong> или <strong>yum</strong>, если бы у нас был образ Centos:<blockquote><strong><em>7</em></strong><em> tasks:</em></blockquote><blockquote><strong><em>8 </em></strong><em> - name: install mysql </em></blockquote><blockquote><strong><em>9 </em></strong><em> apt: </em></blockquote><blockquote><strong><em>10 </em></strong><em> name: mysql</em></blockquote><blockquote><strong><em>11 </em></strong><em>update_cache: yes</em></blockquote><blockquote><strong><em>12 </em></strong><em>cache_valid_time: 3600</em></blockquote><blockquote><strong><em>13</em></strong><em> state: present</em></blockquote>Настроим задачи, чтобы убедиться, что сервис mysql работает и будет запущен при старте:<blockquote><strong><em>14</em></strong><em> - name: start up the mysql service</em></blockquote><blockquote><strong><em>15</em></strong><em> shell: "service mysql start"</em></blockquote><blockquote><strong><em>16</em></strong><em> - name: ensure mysql is enabled to run on startup</em></blockquote><blockquote><strong><em>17</em></strong><em> service:</em></blockquote><blockquote><strong><em>18</em></strong><em> name:mysql</em></blockquote><blockquote><strong><em>19</em></strong><em> state:started</em></blockquote><blockquote><strong><em>20</em></strong><em> enabled:true</em></blockquote>Теперь можно настроить пароль для всех корневых аккаунтов в установке mysql. Хотя mysql устанавливается только на одном хосте (образ Docker), на него ссылаются другие имена, включая localhost и 127.0.0.1. Для всех нужно указать модуль <strong>mysql_user</strong> и набор привилегий, как в примере ниже, где используется директива <strong>with_item</strong>:<blockquote><strong><em>21</em></strong><em> - name: update mysql root password for all root accounts</em></blockquote><blockquote><strong><em>22 </em></strong><em>mysql_user:</em></blockquote><blockquote><em></em><strong>23</strong> name: root</blockquote><blockquote><strong>24. </strong> host: "{{ item }}"</blockquote><blockquote><strong><em>25</em></strong><em> password: "{{ mysql_root_password }}"</em></blockquote><blockquote><strong><em>26</em></strong><em> login_user: root</em></blockquote><blockquote><strong><em>27</em></strong><em> login_password: "{{ mysql_root_password }}"</em></blockquote><blockquote><strong><em>28 </em></strong><em>check_implicit_admin: yes</em></blockquote><blockquote><strong><em>29</em></strong><em> priv: "*.*:ALL,GRANT"</em></blockquote><blockquote><strong><em>30</em></strong><em> with_items:</em></blockquote><blockquote><strong><em>31</em></strong><em> - "{{ ansible_hostname }}"</em></blockquote><blockquote><strong><em>32</em></strong><em> - 127.0.0.1</em></blockquote><blockquote><strong><em>33</em></strong><em> - ::1</em></blockquote><blockquote><strong><em>34</em></strong><em> - localhost</em></blockquote>После настройки MySQL можем использовать модуль <strong>mysql_db</strong>, чтобы создать тестовую базу данных в строках 37-40, а затем в строках 46-51 импортируем в нее данные из файла SQL, который мы скоро создадим:<blockquote><strong><em>35 </em></strong><em>- name: create a new database</em></blockquote><blockquote><strong><em>36</em></strong><em> mysql_db:</em></blockquote><blockquote><strong><em>37</em></strong><em> name: testdb</em></blockquote><blockquote><strong><em>38</em></strong><em> state: present</em></blockquote><blockquote><strong><em>39</em></strong><em> login_user: root</em></blockquote><blockquote><strong><em>40</em></strong><em> login_password: "{{ mysql_root_password }}"</em></blockquote><blockquote><strong><em>41</em></strong><em> - name: add sample data to database</em></blockquote><blockquote><strong><em>42 </em></strong><em>copy:</em></blockquote><blockquote><strong><em>43</em></strong><em> src:dump.sql</em></blockquote><blockquote><strong><em>44</em></strong><em> dest:/tmp/dump.sql</em></blockquote><blockquote><strong><em>45</em></strong><em> - name: insert sample data into database</em></blockquote><blockquote><strong><em>46</em></strong><em> mysql_db:</em></blockquote><blockquote><strong><em>47</em></strong><em> name: testdb</em></blockquote><blockquote><strong><em>48</em></strong><em> state: import</em></blockquote><blockquote><strong><em>49</em></strong><em> target: /tmp/dump.sql</em></blockquote><blockquote><strong><em>50</em></strong><em> login_user: root</em></blockquote><blockquote><strong><em>51</em></strong><em> login_password: "{{ mysql_root_password }}"</em></blockquote>Сохраним плейбук и создадим файл SQL с тестовыми данными, которые можно импортировать в БД.<h2>3. Создаем файл SQL</h2>
10 В нем содержатся данные для БД. Таблица очень простая, но можно получить представление о том, как это работает. Те же принципы вы сможете применять, чтобы создавать таблицы, схемы и данные.<p>Для начала создадим файл <strong>dump.sql</strong>:</p>
10 В нем содержатся данные для БД. Таблица очень простая, но можно получить представление о том, как это работает. Те же принципы вы сможете применять, чтобы создавать таблицы, схемы и данные.<p>Для начала создадим файл <strong>dump.sql</strong>:</p>
11 <blockquote><em>touch dump.sql</em></blockquote>Откроем файл в текстовом редакторе и добавим код, как показано ниже, чтобы создать новую таблицу <strong>test</strong> и добавить три строки INSERT:<blockquote><em>CREATE TABLE IF NOT EXISTS test (</em></blockquote><blockquote><em>message varchar(</em><strong><em>255</em></strong><em>) NOT NULL</em></blockquote><blockquote><em>) ENGINE=MyISAM DEFAULT CHARSET=utf8;</em></blockquote><blockquote><em>INSERT INTO test(message) VALUES('Ansible To Do List');</em></blockquote><blockquote><em>INSERT INTO test(message) VALUES('Get ready');</em></blockquote><blockquote><em>INSERT INTO test(message) VALUES('Ansible is fun')</em></blockquote><h2>4. Запуск плейбука Ansible</h2>
11 <blockquote><em>touch dump.sql</em></blockquote>Откроем файл в текстовом редакторе и добавим код, как показано ниже, чтобы создать новую таблицу <strong>test</strong> и добавить три строки INSERT:<blockquote><em>CREATE TABLE IF NOT EXISTS test (</em></blockquote><blockquote><em>message varchar(</em><strong><em>255</em></strong><em>) NOT NULL</em></blockquote><blockquote><em>) ENGINE=MyISAM DEFAULT CHARSET=utf8;</em></blockquote><blockquote><em>INSERT INTO test(message) VALUES('Ansible To Do List');</em></blockquote><blockquote><em>INSERT INTO test(message) VALUES('Get ready');</em></blockquote><blockquote><em>INSERT INTO test(message) VALUES('Ansible is fun')</em></blockquote><h2>4. Запуск плейбука Ansible</h2>
12 Если мы все сделали правильно, можно запустить плейбук из командной строки командой ansible-playbook. Выполним следующую команду, чтобы запустить плейбук из каталога, где мы его создали:<blockquote><em>ansible-playbook -i hosts db-server-playbook.yml</em></blockquote>Это маленький плейбук всего с одним пакетом, а в базе данных мало данных, так что результаты работы плейбука очень скоро будут готовы для тестирования.<h2>5. Тестируем внесенные изменения</h2>
12 Если мы все сделали правильно, можно запустить плейбук из командной строки командой ansible-playbook. Выполним следующую команду, чтобы запустить плейбук из каталога, где мы его создали:<blockquote><em>ansible-playbook -i hosts db-server-playbook.yml</em></blockquote>Это маленький плейбук всего с одним пакетом, а в базе данных мало данных, так что результаты работы плейбука очень скоро будут готовы для тестирования.<h2>5. Тестируем внесенные изменения</h2>
13 Если все в порядке, тест с хоста пройдет успешно. Мы войдем в MySQL, перейдем в базу данных <strong>testdb</strong>, отобразим все таблицы в базе данных и, наконец, выведем все данные в таблице <strong>test</strong>, которую мы создали с Ansible: <a>https://xpaste.pro/p/uaQmQHNV</a><p>Вот и все. Ничего особенного, правда? Всего несколько минут и несколько строк в Ansible - и у нас есть рабочая база данных.</p>
13 Если все в порядке, тест с хоста пройдет успешно. Мы войдем в MySQL, перейдем в базу данных <strong>testdb</strong>, отобразим все таблицы в базе данных и, наконец, выведем все данные в таблице <strong>test</strong>, которую мы создали с Ansible: <a>https://xpaste.pro/p/uaQmQHNV</a><p>Вот и все. Ничего особенного, правда? Всего несколько минут и несколько строк в Ansible - и у нас есть рабочая база данных.</p>
14 <p><em>В книге </em><a><em>Practical Ansible: Configuration Management from Start to Finish</em></a><em> подробно описывается, как оптимизировать управление конфигурацией с помощью Ansible.</em></p>
14 <p><em>В книге </em><a><em>Practical Ansible: Configuration Management from Start to Finish</em></a><em> подробно описывается, как оптимизировать управление конфигурацией с помощью Ansible.</em></p>