One place for hosting & domains

      Automating

      Automating the Complexity Out of Server Setup with Ansible


      Video

      Server automation now plays an essential role in systems administration, due to the disposable nature of modern application environments. Configuration management tools such as Ansible are typically used to streamline the process of automating server setup by establishing standard procedures for new servers while also reducing human error associated with manual setups.

      In this tech talk, you’ll learn how to create and execute Ansible playbooks to automate your server infrastructure setup. We’ll see some of the most important Ansible features and how to leverage them to create clean and flexible automation for your DigitalOcean Droplets.

      About the Presenter

      Erika Heidi is a software engineer and devOps turned writer, passionate about producing and presenting technical content for a variety of audiences. As a long-term Linux adopter and open source enthusiast, Erika is focused on lowering the barrier of entrance to the technologies empowering modern web application ecosystems today. Erika is a senior technical writer at the DigitalOcean Community.



      Source link

      Automating Server Setup with Ansible: Un kit del taller de DigitalOcean


      Automatizar la configuración del servidor con materiales del kit de taller de Ansible

      Este kit de taller está diseñado para ayudar al público técnico a familiarizarse con los conceptos vinculados a la gestión de configuración y con el uso de Ansible para automatizar la configuración de la infraestructura del servidor.

      El objetivo es proporcionar un conjunto completo de recursos para que un ponente celebre un evento y de una charla introductoria sobre Ansible. Incluye lo siguiente:

      • Diapositivas y notas para el ponente; se incluyen vídeos demo cortos y comandos para ejecutar una demostración en vivo opcional. Esta charla dura aproximadamente 50 minutos.
      • Un repositorio de GitHub que contenga el código de la aplicación de demostración y las secuencias de comandos de Ansible necesarias para implementar esa aplicación en un servidor de Ubuntu.
      • Este tutorial, explica cómo implementar la demo Travellist de la aplicación Laravel en un servidor remoto.

      Este tutorial está destinado a complementar la demo de charla con detalles y aclaraciones adicionales. También sirve como referencia para los lectores que buscan implementar una aplicación de Laravel en un servidor remoto de Ubuntu usando Ansible.

      Introducción

      Debido al carácter desechable de los entornos de aplicaciones modernos, la automatización de servidores ahora desempeña un papel fundamental en la administración de sistemas. Las herramientas de gestión de configuración como Ansible normalmente se utilizan para agilizar el proceso de automatización de la configuración del servidor estableciendo procedimientos estándares para los nuevos servidores. Esto tiene el beneficio de reducir los errores humanos asociados con las configuraciones manuales.

      Ansible ofrece una arquitectura simplificada que no requiere la instalación de software especial en los nodos. También proporciona un conjunto sólido de características y módulos incorporados que facilitan la escritura de secuencias de comandos de automatización.

      Este tutorial, diseñado para acompañar a las diapositivas y las notas del ponente para el kit del taller Automatizar la configuración del servidor con Ansible, le mostrará cómo configurar un archivo de inventario y ejecutar un conjunto de secuencias de comandos de aprovisionamiento para automatizar completamente el proceso de configurar un servidor LEMP remoto (Linux, (E)Nginx, MariaDB y PHP-FPM) en Ubuntu 18.04 e implementar una aplicación demo Laravel en este sistema.

      Nota: Este material está destinado a demostrar cómo usar playbooks para automatizar la configuración del servidor con Ansible. Aunque nuestra demo consiste en una aplicación Laravel que se ejecuta en un servidor LEMP, se anima a los lectores que modifiquen y adapten la configuración incluida para que se adapte a sus propias necesidades.

      Requisitos previos

      Para este tutorial, necesitará lo siguiente:

      Paso 1: Clonar el repositorio demo

      Lo primero que debemos hacer es clonar el repositorio que contiene las secuencias de comando de aprovisionamiento de Ansible y la aplicación demo Laravel que implementaremos en los servidores remotos. Puede encontrar todos los archivos necesarios en el repositorio de Github do-community/ansible-laravel-demo.

      Tras iniciar sesión en su nodo de control de Ansible como su usuario sudo, clone el repositorio y navegue al directorio creado por el comando git:

      • git clone https://github.com/do-community/ansible-laravel-demo.git
      • cd ansible-laravel-demo

      Ahora, puede ejecutar un comando ls para inspeccionar los contenidos del repositorio clonado:

      • ls -l --group-directories-first

      Verá resultados como este:

      ansible-laravel-demo

      drwxrwxr-x 3 sammy sammy 4096 Mar 24 15:24 application
      drwxrwxr-x 2 sammy sammy 4096 Mar 24 15:24 group_vars
      drwxrwxr-x 7 sammy sammy 4096 Mar 24 15:24 roles
      -rw-rw-r-- 1 sammy sammy  102 Mar 24 15:24 inventory-example
      -rw-rw-r-- 1 sammy sammy 1987 Mar 24 15:24 laravel-deploy.yml
      -rw-rw-r-- 1 sammy sammy  794 Mar 24 15:24 laravel-env.j2
      -rw-rw-r-- 1 sammy sammy  920 Mar 24 15:24 readme.md
      -rw-rw-r-- 1 sammy sammy  318 Mar 24 15:24 server-setup.yml
      

      Aquí tiene una descripción de cada una de estas carpetas y archivos y de lo que son:

      • application/: este directorio contiene la aplicación demo Laravel que va a ser implementada en el servidor remoto al final del taller.
      • group_vars/: este directorio contiene los archivos variables que contienen opciones personalizadas para la configuración de la aplicación, como las credenciales de la base de datos y dónde guardar los archivos de la aplicación en el servidor remoto.
      • roles/: este directorio contiene los diferentes roles de Ansible que gestionan el aprovisionamiento de un servidor LEMP de Ubuntu.
      • inventory-example: este archivo puede usarse como una base para crear un inventario personalizado para su infraestructura.
      • laravel-deploy.yml: este playbook implementará la aplicación demo Laravel en el servidor remoto.
      • laravel-env.j2: el playbook laravel-deploy.yml utiliza esta plantilla para configurar el archivo de entorno de la aplicación.
      • readme.md: este archivo contiene información general sobre el aprovisionamiento contenido en este repositorio.
      • server-setup.yml: este playbook proporcionará un servidor LEMP usando los roles definidos en el diretorio roles/.

      Paso 2: Configurar el archivo de inventario y probar la conexión con los nodos

      Ahora, crearemos un archivo de inventario para listar los hosts que queremos administrar usando Ansible. Primero, copie el archivo inventory-example a un nuevo archivo llamado hosts:

      • cp inventory-example hosts

      Ahora, utilice su editor de texto favorito para abrir el nuevo archivo de inventario y actualizarlo con sus propios servidores. En este caso, utilizaremos nano:

      El inventario de ejemplo que viene con el kit de taller contiene dos grupos de Ansible: dev y production. Esto está destinado a demostrar la forma de usar variables de grupo para personalizar la implementación en varios entornos. Si desea probar esta configuración con un único nodo, puede usar dev o el grupo production y eliminar el otro del archivo de inventario.

      ansible-laravel-demo/hosts

      [dev]
      203.0.113.0.101
      
      [prod]
      203.0.113.0.102
      
      [all:vars]
      ansible_python_interpreter=/usr/bin/python3
      

      Nota: La variable ansible_python_interpreter define la ruta al ejecutable de Python en el host remoto. Aquí, indicamos a Ansible que establezca esta variable para todos los hosts en este archivo de inventario.

      Guarde y cierre el archivo cuando termine. Si utiliza nano, puede hacerlo pulsando CTRL+X, luego Y y ENTER para confirmar.

      Una vez que haya terminado de ajustar su archivo de inventario, puede ejecutar el módulo ping de Ansible para probar si el nodo de control puede conectar con los hosts:

      • ansible all -i hosts -m ping -u root

      Vamos a desglosar este comando:

      • all: esta opción indica a Ansible que ejecute el siguiente comando en todos los hosts desde el archivo de inventario designado.
      • -i hosts: especifica qué inventario debería usarse. Cuando no se proporciona esta opción, Ansible intentará usar el inventario predeterminado, que normalmente se ubica en /etc/ansible/hosts.
      • -m ping: esto ejecutará el módulo ping de Ansible, que probará la conectividad con los nodos y si el ejecutable de Python puede encontarse o no en los sistemas remotos.
      • -u root: esta opción especifica el usuario remoto que debería usarse para establecer conexión con los nodos. Estamos usando la cuenta root como ejemplo porque normalmente es la única cuenta disponibles en los servidores nuevos. Es posible que sean necesarias otras opciones de conexión dependiendo del proveedor de su infraestructura y de la configuración SSH.

      Si su conexión SSH a los nodos se configura correctamente, obtendrá el siguiente resultado:

      Output

      203.0.113.0.101 | SUCCESS => { "changed": false, "ping": "pong" } 203.0.113.0.102 | SUCCESS => { "changed": false, "ping": "pong" }

      La respuesta pong significa que su nodo de control puede establecer conexión con sus nodos gestionados y que Ansible puede ejecutar los comandos de Python en los hosts remotos.

      Paso 3: Configurar los archivos variables

      Antes de ejecutar los playbooks que están incluidos en este kit de taller, primero deberá editar el archivo de variables que contiene ajustes como el nombre del usuario remoto que se creará y las credenciales de la base de datos que se configurarán con MariaDB.

      Abra el archivo group_vars/all usando el editor de texto que prefiera:

      ansible-laravel-demo/group_vars/all.yml

      ---
      # Initial Server Setup
      remote_user: sammy
      
      # MySQL Setup
      mysql_root_password: MYSQL_ROOT_PASSWORD
      mysql_app_db: travellist
      mysql_app_user: travellist_user
      mysql_app_pass: DB_PASSWORD
      
      # Web Server Setup
      http_host: "{{ ansible_facts.eth0.ipv4.address }}"
      remote_www_root: /var/www
      app_root_dir: travellist-demo
      document_root: "{{ remote_www_root }}/{{ app_root_dir }}/public"
      
      # Laravel Env Variables
      app_name: Travellist
      app_env: dev
      app_debug: true
      app_url: "http://{{ http_host }}"
      db_host: localhost
      db_port: 3306
      db_database: "{{ mysql_app_db }}"
      db_user: "{{ mysql_app_user }}"
      db_pass: "{{ mysql_app_pass }}"
      

      Las variables que debe considerar son las siguientes:

      • remote_user: el usuario especificado se creará en el servidor remoto y se le concendrán privilegios sudo.
      • mysql_root_password: esta variable define la contraseña root de la base de datos para el servidor de MariaDB. Observe que esta debería ser una contraseña segura que usted elija.
      • mysql_app_db: el nombre de la base de datos que va a crear para la aplicación Laravel. No es necesario que cambie este valor, pero puede hacerlo si lo desea. Este valor se usará para establecer el archivo de configuración .env de Laravel.
      • mysql_app_user: el nombre del usuario de la base de datos para la aplicación Laravel. De nuevo, no es necesario que cambie este valor, pero puede hacerlo si lo desea.
      • mysql_app_pass: la contraseña de la base de datos para la aplicación Laravel. Esta debería ser una contraseña segura de su elección.
      • http_host: el nombre de dominio o dirección IP del host remoto. Aquí, recurriremos al hecho de que Ansible contiene la dirección ipv4 para la interfaz de red eth0. En el caso de que tenga nombres de dominios apuntando a sus hosts remotos, es posible que desee crear archivos de variables independientes para cada uno de ellos sobrescribiendo este valor de modo que la configuración de Nginx contenga el hostname correcto para cada servidor.

      Una vez que termine de editar estos valores, guarde y cierre el archivo.

      Crear archivos de variables adicionales para varios entornos

      Si configuró su archivo de inventario con varios nodos, es posible que desee crear archivos de variables adicionales para configurar cada nodo de forma adecuada. En nuestro inventario de ejemplo, creamos dos grupos distintos: dev y production. Para evitar tener las mismas credenciales de la base de datos y otros ajustes en ambos entornos, debemos crear un archivo variable independiente que albergue nuestros valores de producción.

      Es posible que desee copiar el archivo variable y usarlo como base para sus valores de producción:

      • cp group_vars/all.yml group_vars/production.yml
      • nano group_vars/production.yml

      Debido a que el archivo all.yml contiene los valores predeterminados que deberían ser válidos para todos los entornos, puede eliminar del nuevo archivo production.yml todas las variables que no necesitarán modificaciones. Las variables que debería actualizar para cada entorno se resaltan aquí:

      ansible-laravel-demo/group_vars/production

      ---
      # Initial Server Setup
      remote_user: prod_user
      
      # MySQL Setup
      mysql_root_password: MYSQL_PROD_ROOT_PASSWORD
      mysql_app_pass: MYSQL_PROD_APP_PASSWORD
      
      # Laravel Env Variables
      app_env: prod
      app_debug: false
      

      Observe que cambiamos el valor de app_env a prod y fijamos el valor app_debug en false. Estos son los ajustes de Laravel recomendados para los entornos de producción.

      Cuando termine de personalizar sus variables de producción, guarde y cierre el archivo.

      Cifrar archivos variables con Ansible Vault

      Si planea compartir su configuración Ansible con otros usuarios, es importante mantener las credenciales y otros datos sensibles de sus archivos variables protegidos. Esto es posible con Ansible Vault, una función que se incluye con Ansible por defecto. Ansible Vault le permite cifrar archivos de variables de modo que solo los usuarios con acceso a la contraseña de almacén puedan ver, editar o descifrar estos archivos. La contraseña de almacén es también necesaria para ejecutar un playbook o un comando que utilice archivos cifrados.

      Para cifrar su archivo de variables de producción, ejecute lo siguiente:

      • ansible-vault encrypt group_vars/production.yml

      Se le solicitará proporcionar una contraseña de almacén y confirmarla. Una vez que termine, si comprueba el contenido del archivo, verá que los datos estarán cifrados.

      Si desea ver el archivo variable sin cambiar su contenido, puede usar el comando view.

      • ansible-vault view group_vars/production.yml

      Se le pedirá que proporcione la misma contraseña que definió cuando cifró ese archivo con asnible-vault. Tras proporcionar la contraseña, el contenido del archivo aparecerá en su terminal. Para salir de la vista de archivo, escriba q.

      Para editar un archivo previamente cifrado con Ansible Vault, utilice el comando de almacén edit:

      • ansible-vault edit group_vars/production.yml

      Este comando lo solicitará proporcionar la contraseña de almacén para el archivo. Su editor de terminal predeterminado se utilizará para abrir el archivo para su edición. Tras realizar los cambios deseados, guarde y cierre el archivo. Ansible Vault lo cifrará de nuevo automáticamente.

      Ahora ha terminado de configurar sus archivos variables. En el siguiente paso, ejecutaremos el playbook para configurar Nginx, PHP-FPM y MariaDB (que junto con un sistema operativo basado en Linux como Ubuntu forman la pila LEMP) en sus servidores remotos.

      Paso 4: Ejecutar el playbook de LEMP

      Antes de implementar la aplicación demo Laravel en los servidores remotos, debemos configurar un entorno LEMP que presentará la aplicación. El playbook server-setup.yml incluye los roles de Ansible necesarios para configurar esto. Para inspeccionar sus contenidos, ejecute:

      ansible-laravel-demo/server-setup.yml

      ---
      - hosts: all
        become: true
        roles:
          - { role: setup, tags: ['setup'] }
      
          - { role: mariadb, tags: ['mysql', 'mariadb', 'db', 'lemp'] }
      
          - { role: php, tags: ['php', 'web', 'php-fpm', 'lemp'] }
      
          - { role: nginx, tags: ['nginx', 'web', 'http', 'lemp'] }
      
          - { role: composer, tags: ['composer'] }
      

      Aquí tiene una descripción de los roles incluidos en este playbook:

      • setup: contiene las tareas necesarias para crear un nuevo usuario del sistema y concederle privilegios sudo, y para habilitar el firewall ufw.
      • mariadb: instala la el servidor de la base de datos MariaDB y crea la base de datos y el usuario de la aplicación.
      • php: instala php-fpm y los módulos PHP que son necesarios para ejecutar una aplicación Laravel.
      • nginx: instala el servidor web Nginx y permite el acceso en el puerto 80.
      • composer: instala Composer globalmente.

      Observe que hemos configurado algunas etiquetas en cada rol. Esto es para que resulte sencillo volver ejecutar solo partes de este playbook, si es necesario. Si realiza cambios en su archivo de plantilla de Nginx, por ejemplo, es posible que desee ejecutar solo el rol de Nginx.

      El siguiente comando ejecutará este playbook en todos los servidores desde su archivo de inventario. El --ask-vault-pass solo es necesario en caso de que haya usado ansible-vault para cifrar archivos variables en el paso anterior:

      • ansible-playbook -i hosts server-setup.yml -u root --ask-vault-pass

      Verá un resultado similar a este:

      Output

      PLAY [all] ********************************************************************************************** TASK [Gathering Facts] ********************************************************************************** ok: [203.0.113.0.101] ok: [203.0.113.0.102] TASK [setup : Install Prerequisites] ******************************************************************** changed: [203.0.113.0.101] changed: [203.0.113.0.102] ... RUNNING HANDLER [nginx : Reload Nginx] ****************************************************************** changed: [203.0.113.0.101] changed: [203.0.113.0.102] PLAY RECAP ********************************************************************************************** 203.0.113.0.101 : ok=31 changed=27 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1 203.0.113.0.102 : ok=31 changed=27 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1

      Sus nodos ahora están listos para presentar aplicaciones PHP usando Nginx+PHP-FPM, con MariaDB como el servidor de la base de datos. En el siguiente paso, implementaremos la aplicación demo Laravel incluida con el playbook de Ansible laravel-deploy.yml.

      Paso 5: Implementar la aplicación de Laravel

      Ahora que tiene un entorno LEMP en funcionamiento en su servidor remoto, puede ejecutar el playbook laravel-deploy.yml. Este playbook ejecutará las siguientes tareas:

      1. Crear la raíz del documento de la aplicación en el servidor remoto, si esto aún no se hizo.
      2. Sincronizar la carpeta de la aplicación local con el servidor remoto usando el módulo sync.
      3. Usar el módulo acl para establecer permisos para el usuario www-data en la carpeta de almacenamiento.
      4. Configurar el archivo de aplicación .env en base a la plantilla laravel-env.j2.
      5. Instalar las dependencias de la aplicación con Composer.
      6. Generar la clave de seguridad de la aplicación.
      7. Configurar un enlace público para la carpeta de almacenamiento.
      8. Ejecutar migraciones y seeders de la base de datos.

      Este playbook debería ejecutarse a través de un usuario no root con permisos sudo. Este usuario se creó cuando ejecutó el playbook server-setup.yml en el paso anterior, usando el nombre definido por la variable remote_user.

      Cuano esté listo, ejecute el playbook laravel-deploy.yml con:

      • ansible-playbook -i hosts laravel-deploy.yml -u sammy --ask-vault-pass

      El --ask-vault-pass solo es necesario en caso de que haya usado ansible-vault para cifrar archivos variables en el paso anterior.

      Verá un resultado similar a este:

      Output

      PLAY [all] ********************************************************************************************** TASK [Gathering Facts] ********************************************************************************** ok: [203.0.113.0.101] ok: [203.0.113.0.102] TASK [Make sure the remote app root exists and has the right permissions] ******************************* ok: [203.0.113.0.101] ok: [203.0.113.0.102] TASK [Rsync application files to the remote server] ***************************************************** ok: [203.0.113.0.101] ok: [203.0.113.0.102] ... TASK [Run Migrations + Seeders] ************************************************************************* ok: [203.0.113.0.101] ok: [203.0.113.0.102] PLAY RECAP ********************************************************************************************** 203.0.113.0.101 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 203.0.113.0.102 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

      Cuando finalice la ejecución, podrá acceder a la aplicación demo apuntando su navegador al nombre de dominio o dirección IP de su nodo:

      http://node_domain_or_IP
      

      Verá una página como la siguiente:

      Demo Travellist de Laravel

      Conclusión

      En este tutorial, se muestra la manera de configurar un archivo de inventario de Ansible, establecer conexión con nodos remotos y ejecutar playbooks de Ansible para configurar un servidor LEMP e implementar una aplicación de demostración de Laravel en él. Esta guía complementa las diapositivas y notas del ponente de Automatizar la configuración del servidor con el Kit del taller Ansible; además, viene acompañada de un repositorio de GitHub de demostración que contiene todos los archivos necesarios para seguir con el componente de demostración de este taller.



      Source link

      Automating Server Setup with Ansible: Набор материалов для тренинга DigitalOcean


      Материалы для проведения тренинга по автоматизации настройки сервера с помощью Ansible

      Данный набор материалов для тренинга предназначен для ознакомления технических специалистов с понятиями управления конфигурацией и использованием Ansible для автоматизации настройки инфраструктуры сервера.

      Его цель — предоставление полного набора ресурсов для докладчика при проведении мероприятия и выступления со вступительной речью, посвященной Ansible. Он включает следующее:

      • Слайды и заметки для докладчика, включая короткие демонстрационные видеоматериалы и команды для запуска вспомогательного демонстрационного рабочего приложения. Длительность доклада составляет примерно 50 минут.
      • Репозиторий GitHub, содержащий код демоприложения и необходимые скрипты Ansible для развертывания этого приложения на сервере Ubuntu.
      • Данное руководство, которое знакомит пользователя с процессом развертывания демоприложения Travellist на базе Laravel на удаленном сервере.

      Руководство предназначено для предоставления дополнительных данных и пояснений при обсуждении демоприложения. Оно также служит справочником для читателей, которые хотят развернуть приложение Laravel на удаленном сервере Ubuntu с помощью Ansible.

      Введение

      Автоматизация сервера сегодня играет важнейшую роль в системном администрировании, что вызвано расходной природой современных сред приложений. Инструменты управления конфигурацией, такие как Ansible, обычно используются для придания гибкости процессу автоматизации настройки сервера с помощью организации стандартных процедур для новых серверов. Это полезно для снижения вызванных человеческим фактором ошибок, связанных с ручной настройкой.

      Ansible предлагает упрощенную архитектуру, которая не требует установки специального программного обеспечения на узлах. Также он имеет широкий набор функций и встроенные модули, упрощающие написание скриптов автоматизации.

      Данное руководство, предназначенное для использования вместе со слайдами и замечаниями докладчика набора материалов для тренинга по автоматизации настройки сервера с помощью Ansible, демонстрирует, как настроить inventory-файл и выполнить набор скриптов для полной автоматизации процесса настройки удаленного сервера LEMP (Linux, ENginx, MariaDB и PHP-FPM) на Ubuntu 18.04, а также выполнить развертывание демонстрационного приложения Laravel для данной системы.

      Примечание. Этот материал предназначен для демонстрации использования плейбуков для автоматизации настройки сервера с помощью Ansible. Хотя наше демо включает приложение Laravel, запущенное на сервере LEMP, читатели могут вносить изменения и адаптировать указанную настройку согласно собственным потребностям.

      Предварительные требования

      Для данного обучающего руководства вам потребуется следующее:

      Шаг 1 — Клонирование репозитория с демо

      Прежде всего вам необходимо клонировать репозиторий со скриптами конфигурирования Ansible и демоприложением Laravel, которое мы будем развертывать на удаленных серверах. Все необходимые файлы можно найти в репозитории do-community/ansible-laravel-demo на Github.

      После входа на контрольный узел Ansible с помощью вашего пользователя sudo клонируйте репозиторий и перейдите в директорию, созданную командой git​​:

      • git clone https://github.com/do-community/ansible-laravel-demo.git
      • cd ansible-laravel-demo

      Теперь вы можете запустить команду ls для просмотра содержимого клонированного репозитория:

      • ls -l --group-directories-first

      Вывод будет выглядеть следующим образом:

      ansible-laravel-demo

      drwxrwxr-x 3 sammy sammy 4096 Mar 24 15:24 application
      drwxrwxr-x 2 sammy sammy 4096 Mar 24 15:24 group_vars
      drwxrwxr-x 7 sammy sammy 4096 Mar 24 15:24 roles
      -rw-rw-r-- 1 sammy sammy  102 Mar 24 15:24 inventory-example
      -rw-rw-r-- 1 sammy sammy 1987 Mar 24 15:24 laravel-deploy.yml
      -rw-rw-r-- 1 sammy sammy  794 Mar 24 15:24 laravel-env.j2
      -rw-rw-r-- 1 sammy sammy  920 Mar 24 15:24 readme.md
      -rw-rw-r-- 1 sammy sammy  318 Mar 24 15:24 server-setup.yml
      

      Ниже вы найдете описание каждой из этих папок и файлов и их значения:

      • application/: эта директория содержит демоприложение Laravel, которое будет развернуто на удаленном сервере к концу тренинга.
      • group_vars/: эта директория содержит файлы с переменными, содержащие пользовательские опции настройки приложения, такие как учетные данные базы данных и место хранения файлов приложения на удаленном сервере.
      • roles/: эта директория содержит различные роли Ansible, которые определяют конфигурацию LEMP-сервера на Ubuntu.
      • inventory-example: этот файл может использоваться в качестве основы для создания пользовательского inventory-файла для вашей инфраструктуры.
      • laravel-deploy.yml: этот плейбук будет выполнять развертывание демоприложения Laravel на удаленном сервере.
      • laravel-env.j2: этот шаблон используется плейбуком laravel-deploy.yml для настройки файла среды приложения.
      • readme.md: этот файл содержит общую информацию о конфигурации, содержащейся в этом репозитории.
      • server-setup.yml: этот плейбук будет выполнять конфигурацию сервера LEMP, используя роли, определенные в директории roles/.

      Шаг 2 — Настройка inventory-файла и тестирование подключения к узлам

      Теперь мы создадим inventory-файл для просмотра списка хостов, которые мы будем администрировать с помощью Ansible. Сначала скопируйте файл inventory-example в новый файл с именем hosts:

      • cp inventory-example hosts

      Теперь необходимо воспользоваться текстовым редактором по вашему выбору, чтобы открыть новый inventory-файл и обновить его на ваших серверах. Мы будем использовать nano:

      Пример inventory-файла, который входит в комплект материалов для тренинга, содержит две группы Ansible: dev и production. Это сделано для демонстрации использования переменных групп для настройки развертывания в разных средах. Если вы хотите протестировать эту настройку на отдельном узле, вы можете использовать группу dev или production и удалить другую группу из inventory-файла.

      ansible-laravel-demo/hosts

      [dev]
      203.0.113.0.101
      
      [prod]
      203.0.113.0.102
      
      [all:vars]
      ansible_python_interpreter=/usr/bin/python3
      

      Примечание. Переменная ansible_python_interpreter определяет путь к исполняемому файлу Python на удаленном хосте. Здесь мы просим Ansible задать эту переменную для всех хостов в этом inventory-файле.

      Сохраните и закройте файл после завершения. Если вы использовали nano, нажмите CTRL+X, а затем Y и ENTER для подтверждения.

      После внесения изменений в inventory-файл вы можете запустить модуль ping в Ansible для тестирования возможности подключения узла к хостам:

      • ansible all -i hosts -m ping -u root

      Давайте разберем эту команду:

      • all: эта опция просит Ansible запустить следующую команду для всех хостов из указанного inventory-файла.
      • -i hosts: указывает, какой inventory-файл необходимо использовать. Если эта опция не указана, Ansible будет пытаться использовать inventory-файл по умолчанию, который обычно находится в директории /etc/ansible/hosts.
      • -m ping: эта опция запускает модуль ping в Ansible, который будет тестировать подключение к узлам и проверять, находится ли исполняемый файл Python на удаленных системах.
      • -u root: этот опция указывает, какой удаленный пользователь должен использоваться для подключения к узлам. Здесь мы используем учетную запись root в качестве примера, поскольку это, как правило, единственная учетная запись, доступная на новых серверах. Другие опции подключения могут потребоваться в зависимости от поставщика инфраструктуры и конфигурации SSH.

      Если ваше SSH-подключение к узлам настроено корректно, вы получите следующий вывод:

      Output

      203.0.113.0.101 | SUCCESS => { "changed": false, "ping": "pong" } 203.0.113.0.102 | SUCCESS => { "changed": false, "ping": "pong" }

      Вывод pong означает, что ваш контрольный узел может подключаться к управляемым узлам и что Ansible может выполнять команды Python на удаленных хостах.

      Шаг 3 — Настройка файлов с переменными

      Перед запуском плейбуков, которые включены в этот комплект материалов для тренинга, вам необходимо будет сначала изменить файл с переменными, который содержит настройки, например, имя удаленного пользователя, которого необходимо создать, и учетные данные базы данных для настройки с помощью MariaDB.

      Откройте файл group_vars/all в используемом вами текстовом редакторе:

      ansible-laravel-demo/group_vars/all.yml

      ---
      # Initial Server Setup
      remote_user: sammy
      
      # MySQL Setup
      mysql_root_password: MYSQL_ROOT_PASSWORD
      mysql_app_db: travellist
      mysql_app_user: travellist_user
      mysql_app_pass: DB_PASSWORD
      
      # Web Server Setup
      http_host: "{{ ansible_facts.eth0.ipv4.address }}"
      remote_www_root: /var/www
      app_root_dir: travellist-demo
      document_root: "{{ remote_www_root }}/{{ app_root_dir }}/public"
      
      # Laravel Env Variables
      app_name: Travellist
      app_env: dev
      app_debug: true
      app_url: "http://{{ http_host }}"
      db_host: localhost
      db_port: 3306
      db_database: "{{ mysql_app_db }}"
      db_user: "{{ mysql_app_user }}"
      db_pass: "{{ mysql_app_pass }}"
      

      Вам необходимо обратить внимание на следующие переменные:

      • remote_user: указанный пользователь будет создан на удаленном сервере и получит привилегии sudo.
      • mysql_root_password: эта переменная определяет root-пароль базы данных для сервера MariaDB. Обратите внимание, что это должен быть защищенный пароль по вашему выбору.
      • mysql_app_db: имя базы данных, которую необходимо создать для приложения Laravel. Вам не обязательно изменять это значение, но вы можете сделать это, если хотите. Это значение будет использоваться для настройки файла конфигурации Laravel .env.
      • mysql_app_user: имя пользователя базы данных для приложения Laravel. Вам также не обязательно изменять это значение, но вы можете сделать это.
      • mysql_app_pass: пароль базы данных для приложения Laravel. Это должен быть защищенный пароль по вашему выбору.
      • http_host: доменное имя или IP-адрес удаленного хоста. Здесь мы используем факт Ansible, который содержит IPv4-адрес для сетевого интерфейса eth0. Если у вас есть доменные имена, указывающие на ваши удаленные хосты, вы можете создать отдельные файлы с переменными для каждого из них, перезаписав это значение, чтобы конфигурация Nginx содержала корректное имя хоста для каждого сервера.

      Когда вы закончите редактирование этих значений, сохраните и закройте файл.

      Создание дополнительных файлов с переменными для нескольких сред

      Если вы настроили ваш inventory-файл для нескольких узлов, вы, возможно, захотите создать дополнительные файлы с переменными для настройки каждого узла. В нашем примере inventory-файла мы создали две отдельные группы: dev и production. Чтобы избежать использования одних и тех же учетных данных базы данных и других настроек в двух средах, нам необходимо создать отдельный файл для хранения значений группы production.

      Вы, возможно, захотите скопировать файл с переменными по умолчанию и использовать его в качестве основы для ваших значений для группы production:

      • cp group_vars/all.yml group_vars/production.yml
      • nano group_vars/production.yml

      Поскольку файл all.yml содержит значения по умолчанию, которые будут корректными для всех сред, вы можете удалить все переменные, которые не будут изменены, в новом файле production.yml. Переменные, которые вам необходимо обновить для каждой среды, указаны здесь:

      ansible-laravel-demo/group_vars/production

      ---
      # Initial Server Setup
      remote_user: prod_user
      
      # MySQL Setup
      mysql_root_password: MYSQL_PROD_ROOT_PASSWORD
      mysql_app_pass: MYSQL_PROD_APP_PASSWORD
      
      # Laravel Env Variables
      app_env: prod
      app_debug: false
      

      Обратите внимание, что мы изменили значение app_env на prod и задали значение false для app_debug​​​. Это рекомендуемые настройки Laravel для среды production.

      После завершения настройки переменных для production сохраните и закройте файл.

      Шифрование файлов с переменными с помощью Ansible Vault

      Если вы захотите поделиться своей настройкой Ansible с другими пользователями, необходимо обеспечить безопасность учетных данных базы данных и других конфиденциальных данных в ваших файлах с переменными. Это можно сделать с помощью Ansible Vault, утилиты, которая поставляется с Ansible по умолчанию. Ansible Vault позволяет вам шифровать файлы с переменными, чтобы только пользователи с доступом к паролю Vault могли просматривать, изменять или расшифровывать эти файлы. Пароль Vault также требуется для запуска плейбука или команды, которые используют шифрованные файлы.

      Для шифрования вашего файла с переменными для production выполните следующую команду:

      • ansible-vault encrypt group_vars/production.yml

      Вам будет предложено ввести пароль Vault и подтвердить его. После этого, если вы решите просмотреть содержимое этого файла, вы увидите, что данные зашифрованы.

      Если вы хотите просмотреть файл с переменными, не изменяя его содержимое, воспользуйтесь командой view:

      • ansible-vault view group_vars/production.yml

      Вам будет предложено указать тот же пароль, который вы задали при шифровании этого файла с помощью ansible-vault. После предоставления пароля содержимое файла появится в вашем терминале. Чтобы закрыть просмотр файла, введите q.

      Для редактирования файла, который ранее был зашифрован с помощью Ansible Vault, используйте команду edit:

      • ansible-vault edit group_vars/production.yml

      Эта команда будет запрашивать пароль Vault для этого файла. Затем ваш редактор по умолчанию, поддерживающий работу в терминале, будет использован для открытия файла для редактирования. После внесения желаемых изменений сохраните и закройте файл, после чего он снова будет автоматически зашифрован в Ansible Vault​​​.

      Вы успешно завершили настройку ваших файлов с переменными. В следующем шаге мы запустим плейбук для настройки Nginx, PHP-FPM и MariaDB (которые, наряду с операционной системой на базе Linux, например Ubuntu, формируют стек LEMP) на вашем удаленном сервере (или серверах).

      Шаг 4 — Запуск плейбука LEMP

      Перед развертыванием демоприложения Laravel на удаленном сервере (серверах) нам необходимо настроить среду LEMP, которая будет обслуживать приложение. Плейбук server-setup.yml содержит роли Ansible, необходимые для настройки. Чтобы просмотреть его содержимое, выполните следующую команду:

      ansible-laravel-demo/server-setup.yml

      ---
      - hosts: all
        become: true
        roles:
          - { role: setup, tags: ['setup'] }
      
          - { role: mariadb, tags: ['mysql', 'mariadb', 'db', 'lemp'] }
      
          - { role: php, tags: ['php', 'web', 'php-fpm', 'lemp'] }
      
          - { role: nginx, tags: ['nginx', 'web', 'http', 'lemp'] }
      
          - { role: composer, tags: ['composer'] }
      

      Ниже вы найдете обзор всех ролей, включенных в этот плейбук:

      • setup: содержит задачи, необходимые для создания нового пользователя системы и предоставления ему привилегий sudo, а также активации брандмауэра ufw.
      • mariadb: устанавливает сервер базы данных MariaDB и создает базу данных приложения и пользователя.
      • php: устанавливает модули php-fpm и PHP, которые необходимы для запуска приложения Laravel.
      • nginx: устанавливает веб-сервер Nginx и разрешает доступ к порту 80.
      • composer: устанавливает Composer на глобальном уровне.

      Обратите внимание, что мы задали несколько тегов для каждой роли. Это нужно для перезапуска только отдельных частей данного плейбука, если возникнет такая необходимость. Если вы внесете изменения в ваш файл шаблонов Nginx, например, вам может понадобиться только перезапуск роли Nginx.

      Следующая команда будет запускать этот плейбук на всех серверах из вашего inventory-файла. --ask-vault-pass требуется только в случае, если вы использовали ansible-vault для шифрования файлов на предыдущем шаге:

      • ansible-playbook -i hosts server-setup.yml -u root --ask-vault-pass

      Вывод будет выглядеть следующим образом:

      Output

      PLAY [all] ********************************************************************************************** TASK [Gathering Facts] ********************************************************************************** ok: [203.0.113.0.101] ok: [203.0.113.0.102] TASK [setup : Install Prerequisites] ******************************************************************** changed: [203.0.113.0.101] changed: [203.0.113.0.102] ... RUNNING HANDLER [nginx : Reload Nginx] ****************************************************************** changed: [203.0.113.0.101] changed: [203.0.113.0.102] PLAY RECAP ********************************************************************************************** 203.0.113.0.101 : ok=31 changed=27 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1 203.0.113.0.102 : ok=31 changed=27 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1

      Теперь ваш узел (узлы) готов к обслуживанию приложений PHP с помощью Nginx+PHP-FPM и MariaDB в качестве сервера базы данных. В следующем шаге мы будем развертывать демоприложение Laravel, включенное в набор материалов, используя плейбук Ansible laravel-deploy.yml.

      Шаг 5 — Развертывание приложения Laravel

      Теперь, когда у вас есть рабочая среда LEMP на вашем удаленном сервере (серверах), вы можете запустить плейбук laravel-deploy.yml. Этот плейбук выполняет следующие задачи:

      1. Создание корневой директории документов приложения на удаленном сервере, если она еще не была создана.
      2. Синхронизация локальной папки приложения с удаленным сервером с помощью модуля sync.
      3. Настройка с помощью модуля acl разрешений для пользователя www-data при работе с папкой хранилища.
      4. Настройка приложения .env на основе шаблона laravel-env.j2.
      5. Установка зависимостей приложения с помощью Composer.
      6. Создание ключа безопасности приложения.
      7. Создание публичной ссылки для папки storage.
      8. Запуск процессов миграции и пополнения базы данных.

      Плейбук необходимо запускать с помощью пользователя non-root user с привилегиями sudo. Этот пользователь был создан при запуске плейбука server-setup.yml на предыдущем шаге, а его имя задано в переменной remote_user.

      Когда все будет готово, запустите плейбук laravel-deploy.yml с помощью следующей команды:

      • ansible-playbook -i hosts laravel-deploy.yml -u sammy --ask-vault-pass

      --ask-vault-pass требуется только в случае, если вы использовали ansible-vault для шифрования файлов на предыдущем шаге.

      Вывод будет выглядеть следующим образом:

      Output

      PLAY [all] ********************************************************************************************** TASK [Gathering Facts] ********************************************************************************** ok: [203.0.113.0.101] ok: [203.0.113.0.102] TASK [Make sure the remote app root exists and has the right permissions] ******************************* ok: [203.0.113.0.101] ok: [203.0.113.0.102] TASK [Rsync application files to the remote server] ***************************************************** ok: [203.0.113.0.101] ok: [203.0.113.0.102] ... TASK [Run Migrations + Seeders] ************************************************************************* ok: [203.0.113.0.101] ok: [203.0.113.0.102] PLAY RECAP ********************************************************************************************** 203.0.113.0.101 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 203.0.113.0.102 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

      После завершения выполнения команды вы сможете получить доступ к демоприложению, указав в браузере доменное имя или IP-адрес вашего узла:

      http://node_domain_or_IP
      

      Вы увидите подобную страницу:

      Демоприложение Travellist на базе Laravel

      Заключение

      Это обучающее руководство демонстрирует процесс настройки inventory-файла Ansible и подключения к удаленным узлам, а также запуск плейбуков Ansible для настройки сервера LEMP и развертывания на нем демоприложения Laravel. Данное руководство служит дополнением к слайдам и заметкам для докладчика из набора материалов для тренинга по автоматизации настройки сервера с помощью Ansible и использует репозиторий GitHub, содержащий все необходимые файлы для выполнения демонстрации в рамках тренинга.



      Source link