0 added
0 removed
Original
2026-01-01
Modified
2026-02-19
1
<blockquote>Обсудим, как установить LEMP-стек с помощью Ansible. Разберемся с тем, как автоматизировать рутинные задачи, что такое Ansible и как он работает.</blockquote><h2>Чем Ansible полезен в работе</h2>
1
<blockquote>Обсудим, как установить LEMP-стек с помощью Ansible. Разберемся с тем, как автоматизировать рутинные задачи, что такое Ansible и как он работает.</blockquote><h2>Чем Ansible полезен в работе</h2>
2
<ul><li>Автоматизация задач по установке и конфигурации софта, которые раньше выполнялись вручную. Сейчас в подчинении сисадминов находятся десятки, сотни, а то и тысячи машин, которым необходимо осуществлять поддержку и конфигурируемость софта, а также его одинаковость. В этом лежит причина появления и процветания таких тулзов, как Ansible.</li>
2
<ul><li>Автоматизация задач по установке и конфигурации софта, которые раньше выполнялись вручную. Сейчас в подчинении сисадминов находятся десятки, сотни, а то и тысячи машин, которым необходимо осуществлять поддержку и конфигурируемость софта, а также его одинаковость. В этом лежит причина появления и процветания таких тулзов, как Ansible.</li>
3
</ul><ul><li>Обеспечение повторяемости решений задач в удобной форме. Например, вы решили задачу, потратили время, разобрались в софте и хотите сохранить решение, чтобы затем его повторить, а не вспоминать каждый раз заново. Для этого есть Ansible, который в этом как раз и поможет.</li>
3
</ul><ul><li>Обеспечение повторяемости решений задач в удобной форме. Например, вы решили задачу, потратили время, разобрались в софте и хотите сохранить решение, чтобы затем его повторить, а не вспоминать каждый раз заново. Для этого есть Ansible, который в этом как раз и поможет.</li>
4
</ul><ul><li>Установка и конфигурирование софта на сколь угодно много удаленных машин с одной главной машины. Вы решили задачу, обеспечили повторяемость ее решения и хотите раскатать его на сто серверов, но не делать каждый раз перезапись скрипта. За вас это сделает Ansible. Нужно только запустить решение задачи на те сервера, которые вам нужны, и все, вы великолепны :)</li>
4
</ul><ul><li>Установка и конфигурирование софта на сколь угодно много удаленных машин с одной главной машины. Вы решили задачу, обеспечили повторяемость ее решения и хотите раскатать его на сто серверов, но не делать каждый раз перезапись скрипта. За вас это сделает Ansible. Нужно только запустить решение задачи на те сервера, которые вам нужны, и все, вы великолепны :)</li>
5
</ul><h2><strong>Почему Ansible?</strong></h2>
5
</ul><h2><strong>Почему Ansible?</strong></h2>
6
В процессе гуглинга систем автоматизации вы увидите, что таких систем довольно много. Так почему же я считаю Ansible лучшей системой автоматизации? <p>Во-первых, простота. Она стоит во главе угла, что доказывает их слоган “Simple IT automation”, что переводится как "Простая IT-автоматизация". Вы прикладываете минимум усилий для получения хорошего результата. </p>
6
В процессе гуглинга систем автоматизации вы увидите, что таких систем довольно много. Так почему же я считаю Ansible лучшей системой автоматизации? <p>Во-первых, простота. Она стоит во главе угла, что доказывает их слоган “Simple IT automation”, что переводится как "Простая IT-автоматизация". Вы прикладываете минимум усилий для получения хорошего результата. </p>
7
<p>Во-вторых, отсутствие необходимости устанавливать софт на удаленные серверы. Нужна только контрольная машина, на которую установлен Ansible. </p>
7
<p>Во-вторых, отсутствие необходимости устанавливать софт на удаленные серверы. Нужна только контрольная машина, на которую установлен Ansible. </p>
8
<p>В-третьих, легкость расширения. В Ansible нет модулей, которые вам могут быть не нужны или которых бы вам не хватало. Его архитектура проста и понятна.</p>
8
<p>В-третьих, легкость расширения. В Ansible нет модулей, которые вам могут быть не нужны или которых бы вам не хватало. Его архитектура проста и понятна.</p>
9
<p>В-четвертых, поддержка огромным числом вендоров. Ansible - это продукт Red Hat, уважаемой на рынке компании. Ansible поддерживает производителей сетевого оборудования, поэтому у вас почти не будет проблем, связанных с несовместимостью.</p>
9
<p>В-четвертых, поддержка огромным числом вендоров. Ansible - это продукт Red Hat, уважаемой на рынке компании. Ansible поддерживает производителей сетевого оборудования, поэтому у вас почти не будет проблем, связанных с несовместимостью.</p>
10
<h2><strong>Как работает Ansible?</strong></h2>
10
<h2><strong>Как работает Ansible?</strong></h2>
11
В экосистеме Ansible существует всего два понятия: control node, машина, с которой производятся изменения и на которой установлен сам Ansible, и host, ноды, на которые мы устанавливаем софт и которые нам нужно сконфигурировать. <p>Ansible подключается по SSH как стандарт сетевого администрирования к удаленным нодам, загружает туда модули, написанные на Python, и выполняет их на удаленных машинах. Проще говоря, контрольная нода управляет, а хосты подчиняются.</p>
11
В экосистеме Ansible существует всего два понятия: control node, машина, с которой производятся изменения и на которой установлен сам Ansible, и host, ноды, на которые мы устанавливаем софт и которые нам нужно сконфигурировать. <p>Ansible подключается по SSH как стандарт сетевого администрирования к удаленным нодам, загружает туда модули, написанные на Python, и выполняет их на удаленных машинах. Проще говоря, контрольная нода управляет, а хосты подчиняются.</p>
12
<h2><strong>Как устроен Ansible?</strong></h2>
12
<h2><strong>Как устроен Ansible?</strong></h2>
13
Концепция Ansible заключается в том, что его кто-то должен вызвать: либо пользователь, либо public/private cloud. Затем Ansible обрабатывает запрос при помощи inventory, модулей, API и плагинов. Модули обеспечивают установку или настройку софта внутри хостов, а плагины расширяют функциональность самого Ansible. И то, и другое может быть написано на Python. Все это предназначено для того, чтобы конфигурировать удаленные хосты или сетевые устройства.<h2><strong>Установка Ansible</strong></h2>
13
Концепция Ansible заключается в том, что его кто-то должен вызвать: либо пользователь, либо public/private cloud. Затем Ansible обрабатывает запрос при помощи inventory, модулей, API и плагинов. Модули обеспечивают установку или настройку софта внутри хостов, а плагины расширяют функциональность самого Ansible. И то, и другое может быть написано на Python. Все это предназначено для того, чтобы конфигурировать удаленные хосты или сетевые устройства.<h2><strong>Установка Ansible</strong></h2>
14
На контрольной машине должен быть установлен Python, т. к. Ansible написан на нем. Необходимо будет немного поработать в консоли, и все.<p>Нам нужно создать несколько виртуальных машин для vagrant: контрольную ноду и какой-нибудь хост. Я пользуюсь классной фичей vagrant - объявление нескольких машин. </p>
14
На контрольной машине должен быть установлен Python, т. к. Ansible написан на нем. Необходимо будет немного поработать в консоли, и все.<p>Нам нужно создать несколько виртуальных машин для vagrant: контрольную ноду и какой-нибудь хост. Я пользуюсь классной фичей vagrant - объявление нескольких машин. </p>
15
<blockquote>Vagrant.configure("2") do | config |</blockquote><blockquote>config.vm.define "controlnode" do |controlnode|</blockquote><blockquote>controlnode.vm.box = "ubuntu/focal64"</blockquote><blockquote>controlnode.vm.hostname = "controlnode"</blockquote><blockquote>controlnode.vm.network "private_network", ip: "192.168.50.4"</blockquote><blockquote>controlnode.vm.provision "shell", inline: <<-SHELL</blockquote><blockquote>sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/#g' /etc/ssh/sshd_config</blockquote><blockquote>service ssh restart</blockquote><blockquote>SHELL</blockquote><blockquote>end</blockquote>Вторая машина, управляемая vagrant, - это наша нода. Здесь нет никакой смонтированной папки, поскольку это удаленная машина. У нее тот же самый SHELL, чтобы мы могли зайти в нее по SSH.<blockquote>config.vm.define "server" do |server|</blockquote><blockquote>server.vm.box = "ubuntu/focal64"</blockquote><blockquote>server.vm.hostname = "server"</blockquote><blockquote>controlnode.vm.network "private_network", ip: "192.168.50.5"</blockquote><blockquote>controlnode.vm.provision "shell", inline: <<-SHELL</blockquote><blockquote>sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/#g' /etc/ssh/sshd_config</blockquote><blockquote>service ssh restart</blockquote><blockquote>SHELL</blockquote><blockquote>end</blockquote>Мы видим вывод команды ‘vagrant status’: контрольная нода и сервер запущены. Команда ‘vagrant ssh’ работает, ей нужно указать название виртуальной машины. Vagrant создает виртуальную машину vagrant, пароль vagrant, если иное вы не указали в файлике. Должна работать следующая SSH-команда: vagrant@192.168.50.4. Такой IP мы указали выше. <p>На SSH нам предлагается провалидировать хост, добавить его в список доверенных и ввести пароль. Так мы попадаем внутрь машины. Теперь можно выйти и зайти через vagrant SSH, чтобы не путаться и получить тот же самый результат без запроса пароля, т. к. vagrant все проделывает за нас. </p>
15
<blockquote>Vagrant.configure("2") do | config |</blockquote><blockquote>config.vm.define "controlnode" do |controlnode|</blockquote><blockquote>controlnode.vm.box = "ubuntu/focal64"</blockquote><blockquote>controlnode.vm.hostname = "controlnode"</blockquote><blockquote>controlnode.vm.network "private_network", ip: "192.168.50.4"</blockquote><blockquote>controlnode.vm.provision "shell", inline: <<-SHELL</blockquote><blockquote>sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/#g' /etc/ssh/sshd_config</blockquote><blockquote>service ssh restart</blockquote><blockquote>SHELL</blockquote><blockquote>end</blockquote>Вторая машина, управляемая vagrant, - это наша нода. Здесь нет никакой смонтированной папки, поскольку это удаленная машина. У нее тот же самый SHELL, чтобы мы могли зайти в нее по SSH.<blockquote>config.vm.define "server" do |server|</blockquote><blockquote>server.vm.box = "ubuntu/focal64"</blockquote><blockquote>server.vm.hostname = "server"</blockquote><blockquote>controlnode.vm.network "private_network", ip: "192.168.50.5"</blockquote><blockquote>controlnode.vm.provision "shell", inline: <<-SHELL</blockquote><blockquote>sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/#g' /etc/ssh/sshd_config</blockquote><blockquote>service ssh restart</blockquote><blockquote>SHELL</blockquote><blockquote>end</blockquote>Мы видим вывод команды ‘vagrant status’: контрольная нода и сервер запущены. Команда ‘vagrant ssh’ работает, ей нужно указать название виртуальной машины. Vagrant создает виртуальную машину vagrant, пароль vagrant, если иное вы не указали в файлике. Должна работать следующая SSH-команда: vagrant@192.168.50.4. Такой IP мы указали выше. <p>На SSH нам предлагается провалидировать хост, добавить его в список доверенных и ввести пароль. Так мы попадаем внутрь машины. Теперь можно выйти и зайти через vagrant SSH, чтобы не путаться и получить тот же самый результат без запроса пароля, т. к. vagrant все проделывает за нас. </p>
16
<p>Теперь займемся установкой Ansible. Важно понимать, что Ansible поделен на две части: ansible-core и ansible-community. Первый - это "голый" Ansible без плагинов и модулей, второй же содержит в себе предустановленные плагины и модули. Мы будем использовать второй Ansible. </p>
16
<p>Теперь займемся установкой Ansible. Важно понимать, что Ansible поделен на две части: ansible-core и ansible-community. Первый - это "голый" Ansible без плагинов и модулей, второй же содержит в себе предустановленные плагины и модули. Мы будем использовать второй Ansible. </p>
17
<p>Ansible не входит в список стандартных пакетов apt. Для установки Ansible нам нужно воспользоваться командой apt от repository: apt-add-repository ppa: ansible/ansible. Если вы работаете с CentOS, то архив Ansible уже существует на вашей машине, а если вы работаете с Ubuntu, вам придется его добавить, но в этом нет ничего сложного. </p>
17
<p>Ansible не входит в список стандартных пакетов apt. Для установки Ansible нам нужно воспользоваться командой apt от repository: apt-add-repository ppa: ansible/ansible. Если вы работаете с CentOS, то архив Ansible уже существует на вашей машине, а если вы работаете с Ubuntu, вам придется его добавить, но в этом нет ничего сложного. </p>
18
<h2>Настройка плейбука для установки LEMP</h2>
18
<h2>Настройка плейбука для установки LEMP</h2>
19
Плейбук - это список сценариев для запуска Ansible. Плейбуки пишутся в формате .yml. Начинаются они с трех дешей "---" и заканчиваются тремя точками "...". Плейбуки позволяют оставлять комментарии. Плеи в плейбуке задаются с помощью массива. Каждый плей должен содержать host. Для запуска плейбука используем консольную команду ansible-playbook.<blockquote>vagrant@controlnode:~/ansible$ 1s</blockquote><blockquote>hosts.ini playbook.yml</blockquote><blockquote>vagrant@controlnode:~/ansible$ ansible-playbook</blockquote>Каждый плей в плейбуке характеризуется целью и набором задач, тасками. Каждый таск содержит имя. Имя, как и хост, - это строка. Строки задаются через кавычки. Наша первая таска - установка nginx на удаленной машине.<blockquote>hosts: "all"</blockquote><blockquote>become: true</blockquote><blockquote>tasks:</blockquote><blockquote>name: "Install nginx via apt"</blockquote><blockquote>ansible.builtin.apt:</blockquote><blockquote> name: "nginx"</blockquote><blockquote> state: "latest"</blockquote><blockquote> update_cache: true</blockquote>Теперь удалим папку var/www/html, чтобы скопировать нашу папку. Для этого воспользуемся модулем ansible.builtin.file. <blockquote>name: "Delete /var/www/html folder"</blockquote><blockquote>ansible.builtin.file:</blockquote><blockquote>path: "/var/www/html"</blockquote><blockquote>state: "absent"</blockquote>Мы скопировали наш лендинг в папку var/www/html. Я скопировал наш лендинг в папке files в директории Ansible, давайте ее загрузим.<blockquote>name: "Copy our lending to /var/www/html folder"</blockquote><blockquote>ansible.builtin.copy:</blockquote><blockquote> src: "files/html"</blockquote><blockquote> dest: "/var/www/"</blockquote><blockquote> owner: "vagrant"</blockquote><blockquote> group: "vagrant"</blockquote><blockquote> mode: "0644"</blockquote>Запускаем плейбук на controlnode.<blockquote>ansible-playbook playbook.yml -i hosts.ini</blockquote>Если плейбук отыграл успешно, то заходим сюда и любуемся -<a>http://192.168.50.5/</a><h2>Рефакторим с помощью ролей</h2>
19
Плейбук - это список сценариев для запуска Ansible. Плейбуки пишутся в формате .yml. Начинаются они с трех дешей "---" и заканчиваются тремя точками "...". Плейбуки позволяют оставлять комментарии. Плеи в плейбуке задаются с помощью массива. Каждый плей должен содержать host. Для запуска плейбука используем консольную команду ansible-playbook.<blockquote>vagrant@controlnode:~/ansible$ 1s</blockquote><blockquote>hosts.ini playbook.yml</blockquote><blockquote>vagrant@controlnode:~/ansible$ ansible-playbook</blockquote>Каждый плей в плейбуке характеризуется целью и набором задач, тасками. Каждый таск содержит имя. Имя, как и хост, - это строка. Строки задаются через кавычки. Наша первая таска - установка nginx на удаленной машине.<blockquote>hosts: "all"</blockquote><blockquote>become: true</blockquote><blockquote>tasks:</blockquote><blockquote>name: "Install nginx via apt"</blockquote><blockquote>ansible.builtin.apt:</blockquote><blockquote> name: "nginx"</blockquote><blockquote> state: "latest"</blockquote><blockquote> update_cache: true</blockquote>Теперь удалим папку var/www/html, чтобы скопировать нашу папку. Для этого воспользуемся модулем ansible.builtin.file. <blockquote>name: "Delete /var/www/html folder"</blockquote><blockquote>ansible.builtin.file:</blockquote><blockquote>path: "/var/www/html"</blockquote><blockquote>state: "absent"</blockquote>Мы скопировали наш лендинг в папку var/www/html. Я скопировал наш лендинг в папке files в директории Ansible, давайте ее загрузим.<blockquote>name: "Copy our lending to /var/www/html folder"</blockquote><blockquote>ansible.builtin.copy:</blockquote><blockquote> src: "files/html"</blockquote><blockquote> dest: "/var/www/"</blockquote><blockquote> owner: "vagrant"</blockquote><blockquote> group: "vagrant"</blockquote><blockquote> mode: "0644"</blockquote>Запускаем плейбук на controlnode.<blockquote>ansible-playbook playbook.yml -i hosts.ini</blockquote>Если плейбук отыграл успешно, то заходим сюда и любуемся -<a>http://192.168.50.5/</a><h2>Рефакторим с помощью ролей</h2>
20
Ansible предоставляет очень грамотный механизм для разделения тасок по смысловым частям, т. е. он предоставляет роли. Роли - это некий набор тасок, объединенных общим смыслом.<p>Посмотрим, как эти роли работают. У нас есть плейбук с тасками, разделенными по смыслу и являющимися базовыми строительными блоками для ролей. Ansible позволяет создать папку roles, из которой он будет по умолчанию читать роли. Внутри роли установлен порядок: все таски этой роли лежат в папке tasks в файле main.yml. Копируем таски как массив.</p>
20
Ansible предоставляет очень грамотный механизм для разделения тасок по смысловым частям, т. е. он предоставляет роли. Роли - это некий набор тасок, объединенных общим смыслом.<p>Посмотрим, как эти роли работают. У нас есть плейбук с тасками, разделенными по смыслу и являющимися базовыми строительными блоками для ролей. Ansible позволяет создать папку roles, из которой он будет по умолчанию читать роли. Внутри роли установлен порядок: все таски этой роли лежат в папке tasks в файле main.yml. Копируем таски как массив.</p>
21
<p>В плейбуке роли включаются при помощи директивы roles, где прописываются их имена. Роли выполняются и указываются перед тасками. Отрефакторенная структура плейбука будет выглядеть следующим образом:</p>
21
<p>В плейбуке роли включаются при помощи директивы roles, где прописываются их имена. Роли выполняются и указываются перед тасками. Отрефакторенная структура плейбука будет выглядеть следующим образом:</p>
22
<blockquote>#################</blockquote><blockquote># LEMP PLAYBOOK #</blockquote><blockquote>#################</blockquote><blockquote>---</blockquote><blockquote>- hosts: "all"</blockquote><blockquote> become: true</blockquote><blockquote> roles:</blockquote><blockquote> - nginx # все таски файла main.yml по пути %директория ansible%/roles/nginx/tasks/</blockquote><blockquote> - mysql # все таски файла main.yml по пути %директория ansible%/roles/mysql/tasks/</blockquote><blockquote> - php # все таски файла main.yml по пути %директория ansible%/roles/php/tasks/</blockquote><blockquote> tasks:</blockquote><blockquote> - name: "Reload nginx" # этот таск не относится к ролям напрямую, поэтому вынесен после выполнения всех ролей</blockquote><blockquote> ansible.builtin.service:</blockquote><blockquote> name: "nginx"</blockquote><blockquote> state: "reloaded"</blockquote><h2>Ansible Galaxy</h2>
22
<blockquote>#################</blockquote><blockquote># LEMP PLAYBOOK #</blockquote><blockquote>#################</blockquote><blockquote>---</blockquote><blockquote>- hosts: "all"</blockquote><blockquote> become: true</blockquote><blockquote> roles:</blockquote><blockquote> - nginx # все таски файла main.yml по пути %директория ansible%/roles/nginx/tasks/</blockquote><blockquote> - mysql # все таски файла main.yml по пути %директория ansible%/roles/mysql/tasks/</blockquote><blockquote> - php # все таски файла main.yml по пути %директория ansible%/roles/php/tasks/</blockquote><blockquote> tasks:</blockquote><blockquote> - name: "Reload nginx" # этот таск не относится к ролям напрямую, поэтому вынесен после выполнения всех ролей</blockquote><blockquote> ansible.builtin.service:</blockquote><blockquote> name: "nginx"</blockquote><blockquote> state: "reloaded"</blockquote><h2>Ansible Galaxy</h2>
23
Следующий вопрос, который возникает после того, как мы сделали плейбук и отделили роли: можно ли тратить еще меньше сил? Можно. Ansible Galaxy содержит типовые решения многих проблем и типовые модули. Через Ansible Galaxy можно устанавливать готовые роли и использовать их в плейбуках. Рекомендую делать это программистам. Сисадминам и сеньорам я рекомендую залазить в роли, которые есть на GitHub. Это важно для понимания того, что и о чем там написано. <em>Изучение и погружение в Ansible позволяет понять основы автоматической конфигурации и в разы уменьшить ручную работу.<a>Курс "Ansible: Infrastructure as Code" от Слёрма</a>обучает работе с переменными, плейбуками, содержит подробные лекции о том, как писать сложные хендбуки, а главное - дает понимание о том, как можно переиспользовать свою работу в различных системах и автоматизировать рутинные задачи. </em><p><em><a>Узнать больше о курсе</a></em></p>
23
Следующий вопрос, который возникает после того, как мы сделали плейбук и отделили роли: можно ли тратить еще меньше сил? Можно. Ansible Galaxy содержит типовые решения многих проблем и типовые модули. Через Ansible Galaxy можно устанавливать готовые роли и использовать их в плейбуках. Рекомендую делать это программистам. Сисадминам и сеньорам я рекомендую залазить в роли, которые есть на GitHub. Это важно для понимания того, что и о чем там написано. <em>Изучение и погружение в Ansible позволяет понять основы автоматической конфигурации и в разы уменьшить ручную работу.<a>Курс "Ansible: Infrastructure as Code" от Слёрма</a>обучает работе с переменными, плейбуками, содержит подробные лекции о том, как писать сложные хендбуки, а главное - дает понимание о том, как можно переиспользовать свою работу в различных системах и автоматизировать рутинные задачи. </em><p><em><a>Узнать больше о курсе</a></em></p>