One place for hosting & domains

      установки

      Использование Ansible для установки и настройки LAMP в Ubuntu 18.04


      Введение

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

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

      В этом руководстве мы объясняем, как использовать Ansible для автоматизации шагов, описанных в руководстве по установке Linux, Apache, MySQL и PHP (LAMP) в Ubuntu 18.04. Комплект LAMP — это набор программного обеспечения с открытым исходным кодом, которое обычно устанавливается в комплексе для размещения на сервере динамических сайтов и веб-приложений. Этот термин представляет собой аббревиатуру. Операционная система Linux используется с веб-сервером Apache. Данные сайта хранятся в базе данных MySQL, а за обработку динамического контента отвечает PHP.

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

      Чтобы выполнить автоматическую настройку из сценария, который мы обсуждаем в этом руководстве, вам потребуется следующее:

      Прежде чем продолжить, вам нужно убедиться, что ваш узел управления Ansible может подключаться и выполнять команды для вашего хоста (или хостов) Ansible. Для проверки подключения ознакомьтесь с шагом 3 руководства по установке и настройке Ansible в Ubuntu 18.04.

      Что делает этот сценарий?

      Этот сценарий Ansible предоставляет альтернативу ручному запуску в соответствии с процедурой, описанной в нашем руководстве по установке Linux, Apache, MySQL и PHP (LAMP) в Ubuntu 18.04.

      При запуске этого сценария будут выполняться следующие действия на ваших хостах Ansible:

      1. Установка aptitude, инструмента, который в Ansible используется в качестве альтернативы диспетчеру пакетов apt.
      2. Установка необходимых пакетов LAMP.
      3. Создание нового VirtualHost Apache и настройка для него специального корневого каталога документов.
      4. Активация нового VirtualHost.
      5. Отключение используемого по умолчанию веб-сайта Apache, когда для переменной disable_default установлено значение true.
      6. Установка пароля для root-пользователя MySQL.
      7. Удаление анонимных учетных записей MySQL и тестовой базы данных.
      8. Настройка UFW, чтобы разрешить прием трафика HTTP на настроенном порту (по умолчанию порт номер 80).
      9. Настройка тестового скрипта PHP с помощью предоставленного шаблона.

      После выполнения запуска сценария вы получите веб-среду для PHP, запущенную поверх Apache, в соответствии с опциями, которые вы определили внутри переменных конфигурации.

      Как использовать этот сценарий

      В первую очередь нам нужно получить сценарий LAMP и его зависимости из репозитория do-community/ansible-playbooks. Нам нужно будет клонировать этот репозиторий в локальную папку внутри узла управления Ansible.

      Если вы клонировали этот репозиторий ранее, выполняя другое руководство, перейдите к вашей копии ansible-playbooks и запустите команду git pull, чтобы убедиться, что репозиторий содержит обновленный контент:

      • cd ~/ansible-playbooks
      • git pull

      Если вы впервые используете репозиторий do-community/ansible-playbooks, необходимо начать с клонирования репозитория в вашу домашнюю папку с помощью следующей команды:

      • cd ~
      • git clone https://github.com/do-community/ansible-playbooks.git
      • cd ansible-playbooks

      Файлы, которые нас интересуют, находятся в папке lamp_ubuntu1804, которая имеет следующую структуру:

      lamp_ubuntu1804
      ├── files
      │   ├── apache.conf.j2
      │   └── info.php.j2
      ├── vars
      │   └── default.yml
      ├── playbook.yml
      └── readme.md
      

      Ниже представлены все эти файлы:

      • files/info.php.j2: шаблон для настройки тестовой страницы PHP в корне веб-сервера
      • files/apache.conf.j2: шаблон для настройки Apache VirtualHost.
      • vars/default.yml: файл переменных для настройки параметров сценария.
      • playbook.yml: файл сценария, содержащий задачи, которые будут выполняться на удаленном сервере (или серверах).
      • readme.md: текстовый файл, содержащий информацию об этом сценарии.

      Мы изменим файл переменных сценария для настройки конфигураций MySQL и Apache. Перейдите в директорию lamp_ubuntu1804 и откройте файл vars/default.yml с помощью вашего редактора командной строки:

      • cd lamp_ubuntu1804
      • nano vars/default.yml

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

      vars/default.yml

      ---
      mysql_root_password: "mysql_root_password"
      app_user: "sammy"
      http_host: "your_domain"
      http_conf: "your_domain.conf"
      http_port: "80"
      disable_default: true
      

      Ниже приводится список, содержащий краткое описание всех этих переменных и то, как их необходимо изменить:

      • mysql_root_password: желаемый пароль для учетной записи root MySQL.
      • app_user: удаленный пользователь без прав root для хоста Ansible, который будет настроен в качестве владельца файлов приложения.
      • http_host: ваше доменное имя.
      • http_conf: имя файла конфигурации, который будет создан в Apache.
      • http_port: HTTP-порт для этого виртуального хоста, где 80 — это значение по умолчанию.
      • disable_default: нужно ли отключить веб-сайт по умолчанию, который поставляется с Apache.

      После завершения обновления переменных в vars/default.yml сохраните и закройте этот файл. Если вы используете nano, нажмите CTRL+X, Y, затем ENTER.

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

      Для выполнения сценария только на server1, подключенном как sammy, вы можете воспользоваться следующей командой:

      • ansible-playbook playbook.yml -l server1 -u sammy

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

      Output

      PLAY [all] ********************************************************************************************************* TASK [Gathering Facts] *********************************************************************************************************ok: [server1] TASK [Install prerequisites] *********************************************************************************************************ok: [server1] => (item=aptitude) ... TASK [UFW - Allow HTTP on port 80] ********************************************************************************************************* changed: [server1] TASK [Sets Up PHP Info Page] ********************************************************************************************************* changed: [server1] RUNNING HANDLER [Reload Apache] ********************************************************************************************************* changed: [server1] RUNNING HANDLER [Restart Apache] ********************************************************************************************************* changed: [server1] PLAY RECAP ********************************************************************************************************* server1 : ok=15 changed=11 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

      Примечание. Дополнительную информацию о запуске сценариев Ansible см. в нашей шпаргалке по Ansible.

      После завершения работы сценария откройте ваш браузер и перейдите на хост или IP-адрес сервера, в соответствии с настройками переменных сценария, добавив /info.php:

      http://server_host_or_IP/info.php
      

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

      страница phpinfo

      Поскольку эта страница содержит чувствительную информацию о вашей среде PHP, рекомендуется удалить ее с сервера с помощью команды rm -f /var/www/info.php после завершения настройки.

      Содержание сценария

      Вы можете найти файлы для установки сервера LAMP, который мы обсуждаем в данном руководстве, в папке lamp_ubuntu1804 внутри репозитория DigitalOcean Community Playbooks. Чтобы скопировать или загрузить содержимое скриптов напрямую, нажмите кнопку Raw сверху каждого скрипта.

      Полное содержимое сценария, как и связанные файлы, также представлены здесь для удобства.

      vars/default.yml

      Файл переменных default.yml содержит значения, используемые в задачах сценария, в том числе пароль для учетной записи root MySQL и доменное имя для настройки в Apache.

      vars/default.yml

      ---
      mysql_root_password: "mysql_root_password"
      app_user: "sammy"
      http_host: "your_domain"
      http_conf: "your_domain.conf"
      http_port: "80"
      disable_default: true
      

      files/apache.conf.j2

      Файл apache.conf.j2 — это шаблон Jinja 2, который выполняет настройку нового VirtualHost в Apache. Переменные, используемые в этом шаблоне, определяются в файле переменных vars/default.yml.

      files/apache.conf.j2

      <VirtualHost *:{{ http_port }}>
         ServerAdmin webmaster@localhost
         ServerName {{ http_host }}
         ServerAlias www.{{ http_host }}
         DocumentRoot /var/www/{{ http_host }}
         ErrorLog ${APACHE_LOG_DIR}/error.log
         CustomLog ${APACHE_LOG_DIR}/access.log combined
      
         <Directory /var/www/{{ http_host }}>
               Options -Indexes
         </Directory>
      
         <IfModule mod_dir.c>
             DirectoryIndex index.php index.html index.cgi index.pl  index.xhtml index.htm
         </IfModule>
      
      </VirtualHost>
      

      files/info.php.j2

      Файл info.php.j2 — это другой шаблон Jinja, который используется для настройки тестового скрипта PHP в корне документов на новом настроенном сервере LAMP.

      files/info.php.j2

      <?php
      phpinfo();
      
      

      playbook.yml

      Файл playbook.yml — это место, где определяются все задачи из этой настройки. Он начинается с определения группы серверов, которая должна стать целью этой настройки (all), после чего использует значение become: true, чтобы определить, что задачи следует выполнять с эскалацией привилегии (sudo) по умолчанию. Далее он включает переменную vars/default.yml для загрузки вариантов конфигурации.

      playbook.yml

      
      ---
      - hosts: all
        become: true
        vars_files:
          - vars/default.yml
      
        tasks:
          - name: Install prerequisites
            apt: name={{ item }} update_cache=yes state=latest force_apt_get=yes
            loop: [ 'aptitude' ]
      
        #Apache Configuration
          - name: Install LAMP Packages
            apt: name={{ item }} update_cache=yes state=latest
            loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ]
      
          - name: Create document root
            file:
              path: "/var/www/{{ http_host }}"
              state: directory
              owner: "{{ app_user }}"
              mode: '0755'
      
          - name: Set up Apache virtualhost
            template:
              src: "files/apache.conf.j2"
              dest: "/etc/apache2/sites-available/{{ http_conf }}"
            notify: Reload Apache
      
          - name: Enable new site
            shell: /usr/sbin/a2ensite {{ http_conf }}
            notify: Reload Apache
      
          - name: Disable default Apache site
            shell: /usr/sbin/a2dissite 000-default.conf
            when: disable_default
            notify: Reload Apache
      
        # MySQL Configuration
          - name: Sets the root password
            mysql_user:
              name: root
              password: "{{ mysql_root_password }}"
              login_unix_socket: /var/run/mysqld/mysqld.sock
      
          - name: Removes all anonymous user accounts
            mysql_user:
              name: ''
              host_all: yes
              state: absent
              login_user: root
              login_password: "{{ mysql_root_password }}"
      
          - name: Removes the MySQL test database
            mysql_db:
              name: test
              state: absent
              login_user: root
              login_password: "{{ mysql_root_password }}"
      
        # UFW Configuration
          - name: "UFW - Allow HTTP on port {{ http_port }}"
            ufw:
              rule: allow
              port: "{{ http_port }}"
              proto: tcp
      
        # PHP Info Page
          - name: Sets Up PHP Info Page
            template:
              src: "files/info.php.j2"
              dest: "/var/www/{{ http_host }}/info.php"
      
        handlers:
          - name: Reload Apache
            service:
              name: apache2
              state: reloaded
      
          - name: Restart Apache
            service:
              name: apache2
              state: restarted
      

      Вы можете изменить эти файлы в соответствии с требованиями вашего рабочего процесса.

      Заключение

      В этом руководстве мы использовали Ansible для автоматизации процесса установки и настройки среды LAMP на удаленном сервере. Поскольку у всех возникают различные потребности при работе с базами данных MySQL и пользователями, мы рекомендуем изучить официальную документацию Ansible для получения дополнительной информации и знакомства с вариантами использования модуля mysql_user в Ansible.

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



      Source link

      Использование Ansible для установки и настройки WordPress с LAMP в Ubuntu 18.04


      Введение

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

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

      В этом руководстве мы объясняем, как использовать Ansible для автоматизации шагов, описанных в руководстве по установке WordPress с LAMP в Ubuntu 18.04. WordPress — это самая популярная CMS (система управления контентом) в сети Интернет, которая позволяет пользователям создавать гибкие блоги и веб-сайты поверх бекэнда в виде базы данных MySQL и с обработкой PHP. После настройки практически все административные функции доступны через пользовательский веб-интерфейс.

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

      Чтобы выполнить автоматическую настройку из сценария, который мы обсуждаем в этом руководстве, вам потребуется следующее:

      Прежде чем продолжить, вам нужно убедиться, что ваш узел управления Ansible может подключаться и выполнять команды для вашего хоста (или хостов) Ansible. Для проверки подключения ознакомьтесь с шагом 3 руководства по установке и настройке Ansible в Ubuntu 18.04.

      Что делает этот сценарий?

      Этот сценарий Ansible предоставляет альтернативу ручному запуску в соответствии с процедурой, описанной в нашем руководстве по установке WordPress с LAMP в Ubuntu 18.04.

      При запуске этого сценария будут выполняться следующие действия на ваших хостах Ansible:

      1. Установите aptitude, инструмент, который в Ansible используется в качестве альтернативы диспетчеру пакетов apt.
      2. Установите необходимые пакеты LAMP и расширения PHP.
      3. Создайте и активируйте новый VirtualHost для веб-сайта WordPress.
      4. Активируйте модуль rewrite (mod_rewrite) Apache.
      5. Отключите заданный по умолчанию веб-сайт Apache.
      6. Установите пароль для root-пользователя MySQL.
      7. Удалите анонимные учетные записи MySQL и тестовую базу данных.
      8. Создайте новую базу данных MySQL и пользователя для веб-сайта WordPress.
      9. Настройте UFW, чтобы разрешить прием трафика HTTP на настроенном порту (по умолчанию порт номер 80).
      10. Загрузите и распакуйте WordPress.
      11. Укажите корректные права владения и разрешения для директории.
      12. Настройте файл wp-config.php с помощью предоставленного шаблона.

      После завершения запуска сценария вы получите установку WordPress, запущенную поверх среды LAMP, в соответствии с опциями, которые вы определили внутри переменных конфигурации.

      Как использовать этот сценарий

      В первую очередь нам нужно получить сценарий WordPress с LAMP и его зависимости из репозитория do-community/ansible-playbooks. Нам нужно будет клонировать этот репозиторий в локальную папку внутри узла управления Ansible.

      Если вы клонировали этот репозиторий ранее, выполняя другое руководство, перейдите к вашей копии ansible-playbooks и запустите команду git pull, чтобы быть уверенным, что репозиторий содержит обновленный контент:

      • cd ~/ansible-playbooks
      • git pull

      Если вы впервые используете репозиторий do-community/ansible-playbooks, необходимо выполнить клонирование репозитория в вашу домашнюю папку с помощью следующей команды:

      • cd ~
      • git clone https://github.com/do-community/ansible-playbooks.git
      • cd ansible-playbooks

      Файлы, которые нас интересуют, находятся в папке wordpress-lamp_ubuntu1804, которая имеет следующую структуру:

      wordpress-lamp_ubuntu1804
      ├── files
      │   ├── apache.conf.j2
      │   └── wp-config.php.j2
      ├── vars
      │   └── default.yml
      ├── playbook.yml
      └── readme.md
      

      Ниже представлены все эти файлы:

      • files/apache.conf.j2: шаблон для настройки Apache VirtualHost.
      • files/wp-config.php.j2: шаблон для настройки файла конфигурации WordPress.
      • vars/default.yml: файл переменных для настройки параметров сценария.
      • playbook.yml: файл сценария, содержащий задачи, которые будут выполняться на удаленном сервере (или серверах).
      • readme.md: текстовый файл, содержащий информацию об этом сценарии.

      Мы изменим файл переменных сценария для настройки его параметров. Перейдите в директорию wordpress-lamp_ubuntu1804 и откройте файл vars/default.yml с помощью вашего редактора командной строки:

      • cd wordpress-lamp_ubuntu1804
      • nano vars/default.yml

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

      vars/default.yml

      ---
      #System Settings
      php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ]
      
      #MySQL Settings
      mysql_root_password: "mysql_root_password"
      mysql_db: "wordpress"
      mysql_user: "sammy"
      mysql_password: "password"
      
      #HTTP Settings
      http_host: "your_domain"
      http_conf: "your_domain.conf"
      http_port: "80"
      

      Ниже приводится список, содержащий краткое описание всех этих переменных и то, как их необходимо изменить:

      • php_modules: массив, содержащий расширения PHP, которые необходимо установить для обеспечения работоспособности вашей установки WordPress. Вам не нужно изменять эту переменную, но вам может потребоваться добавить новые расширения в список, если для вашей конкретной установки это требуется.
      • mysql_root_password: желаемый пароль для учетной записи root MySQL.
      • mysql_db: имя базы данных MySQL, которая должна быть создана для WordPress.
      • mysql_user: имя пользователя MySQL, который должен быть создан для WordPress.
      • mysql_password: пароль для нового пользователя MySQL.
      • http_host: ваше доменное имя.
      • http_conf: имя файла конфигурации, который будет создан в Apache.
      • http_port: HTTP-порт для этого виртуального хоста, где 80 — это значение по умолчанию.

      После завершения обновления переменных в vars/default.yml сохраните и закройте этот файл. Если вы используете nano, нажмите CTRL+X, Y, затем ENTER.

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

      Для выполнения сценария только на server1, подключенном как sammy, вы можете воспользоваться следующей командой:

      • ansible-playbook playbook.yml -l server1 -u sammy

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

      Output

      PLAY [all] ***************************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************** ok: [server1] TASK [Install prerequisites] *********************************************************************************************************** ok: [server1] … TASK [Download and unpack latest WordPress] ******************************************************************************************** changed: [server1] TASK [Set ownership] ******************************************************************************************************************* changed: [server1] TASK [Set permissions for directories] ************************************************************************************************* changed: [server1] TASK [Set permissions for files] ******************************************************************************************************* changed: [server1] TASK [Set up wp-config] **************************************************************************************************************** changed: [server1] RUNNING HANDLER [Reload Apache] ******************************************************************************************************** changed: [server1] RUNNING HANDLER [Restart Apache] ******************************************************************************************************* changed: [server1] PLAY RECAP ***************************************************************************************************************************** server1 : ok=22 changed=18 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

      Примечание. Дополнительную информацию о запуске сценариев Ansible см. в нашей шпаргалке по Ansible.

      После завершения работы сценария вы можете перейти в браузер для завершения установки WordPress оттуда.

      Перейдите на домен сервера или публичный IP-адрес:

      http://server_host_or_IP
      

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

      Страница выбора языка WordPress

      После выбора языка, который вы хотите использовать для установки WordPress, вы перейдете к финальному этапу настройки пользователя и пароля WordPress для входа в панель управления:

      Установка WordPress

      При нажатии далее вы перейдете на страницу входа:

      Запрос данных для входа в WP

      После входа вы перейдете в панель управления WordPress:

      Панель администратора WP

      Список стандартных действий по настройке вашей установки WordPress включает выбор параметров постоянных ссылок для ваших постов (см. Settings > Permalinks) и выбор новой темы (Appearance > Themes).

      Содержание сценария

      Вы можете найти файлы для установки сервера WordPress on LAMP, который мы обсуждаем в данном руководстве, в папке wordpress-lamp_ubuntu1804 внутри репозитория DigitalOcean Community Playbooks. Чтобы скопировать или загрузить содержимое скриптов напрямую, нажмите кнопку Raw сверху каждого скрипта.

      Полное содержимое сценария, как и связанные файлы, также находятся здесь для удобства.

      vars/default.yml

      Файл переменных default.yml содержит значения, используемые в задачах сценария, в том числе параметры базы данных и доменное имя для настройки в Apache.

      vars/default.yml

      #System Settings
      php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ]
      
      #MySQL Settings
      mysql_root_password: "mysql_root_password"
      mysql_db: "wordpress"
      mysql_user: "sammy"
      mysql_password: "password"
      
      #HTTP Settings
      http_host: "your_domain"
      http_conf: "your_domain.conf"
      http_port: "80"
      

      files/apache.conf.j2

      Файл apache.conf.j2 — это шаблон Jinja 2, который выполняет настройку нового VirtualHost в Apache. Переменные, используемые в этом шаблоне, определяются в файле переменных vars/default.yml.

      files/apache.conf.j2

      <VirtualHost *:{{ http_port }}>
         ServerAdmin webmaster@localhost
         ServerName {{ http_host }}
         ServerAlias www.{{ http_host }}
         DocumentRoot /var/www/{{ http_host }}
         ErrorLog ${APACHE_LOG_DIR}/error.log
         CustomLog ${APACHE_LOG_DIR}/access.log combined
      
         <Directory /var/www/{{ http_host }}>
               Options -Indexes
         </Directory>
      
         <IfModule mod_dir.c>
             DirectoryIndex index.php index.html index.cgi index.pl  index.xhtml index.htm
         </IfModule>
      
      </VirtualHost>
      

      files/wp-config.php.j2

      Файл wp-config.php.j2 — это другой шаблон Jinja, используемый для настройки основного файла конфигурации, который используется WordPress. Переменные, используемые в этом шаблоне, определяются в файле переменных vars/default.yml. Уникальные ключи аутентификации и секретные ключи генерируются с помощью hash-функции.

      files/info.php.j2

      <?php
      /**
       * The base configuration for WordPress
       *
       * The wp-config.php creation script uses this file during the
       * installation. You don't have to use the web site, you can
       * copy this file to "wp-config.php" and fill in the values.
       *
       * This file contains the following configurations:
       *
       * * MySQL settings
       * * Secret keys
       * * Database table prefix
       * * ABSPATH
       *
       * @link https://codex.wordpress.org/Editing_wp-config.php
       *
       * @package WordPress
       */
      
      // ** MySQL settings - You can get this info from your web host ** //
      /** The name of the database for WordPress */
      define( 'DB_NAME', '{{ mysql_db }}' );
      
      /** MySQL database username */
      define( 'DB_USER', '{{ mysql_user }}' );
      
      /** MySQL database password */
      define( 'DB_PASSWORD', '{{ mysql_password }}' );
      
      /** MySQL hostname */
      define( 'DB_HOST', 'localhost' );
      
      /** Database Charset to use in creating database tables. */
      define( 'DB_CHARSET', 'utf8' );
      
      /** The Database Collate type. Don't change this if in doubt. */
      define( 'DB_COLLATE', '' );
      
      /** Filesystem access **/
      define('FS_METHOD', 'direct');
      
      /**#@+
       * Authentication Unique Keys and Salts.
       *
       * Change these to different unique phrases!
       * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
       * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
       *
       * @since 2.6.0
       */
      define( 'AUTH_KEY',         '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'SECURE_AUTH_KEY',  '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'LOGGED_IN_KEY',    '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'NONCE_KEY',        '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'AUTH_SALT',        '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'SECURE_AUTH_SALT', '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'LOGGED_IN_SALT',   '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'NONCE_SALT',       '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      
      /**#@-*/
      
      /**
       * WordPress Database Table prefix.
       *
       * You can have multiple installations in one database if you give each
       * a unique prefix. Only numbers, letters, and underscores please!
       */
      $table_prefix = 'wp_';
      
      /**
       * For developers: WordPress debugging mode.
       *
       * Change this to true to enable the display of notices during development.
       * It is strongly recommended that plugin and theme developers use WP_DEBUG
       * in their development environments.
       *
       * For information on other constants that can be used for debugging,
       * visit the Codex.
       *
       * @link https://codex.wordpress.org/Debugging_in_WordPress
       */
      define( 'WP_DEBUG', false );
      
      /* That's all, stop editing! Happy publishing. */
      
      /** Absolute path to the WordPress directory. */
      if ( ! defined( 'ABSPATH' ) ) {
          define( 'ABSPATH', dirname( __FILE__ ) . '/' );
      }
      
      /** Sets up WordPress vars and included files. */
      require_once( ABSPATH . 'wp-settings.php' );
      
      

      playbook.yml

      Файл playbook.yml — это место, где определяются все задачи из этой настройки. Он начинается с определения группы серверов, которая должна стать целью этой настройки (all), после чего использует значение become: true, чтобы определить, что задачи следует выполнять с эскалацией привилегии (sudo) по умолчанию. Затем он включает переменную vars/default.yml для загрузки вариантов конфигурации.

      playbook.yml

      ---
      - hosts: all
        become: true
        vars_files:
          - vars/default.yml
      
        tasks:
          - name: Install prerequisites
            apt: name=aptitude update_cache=yes state=latest force_apt_get=yes
            tags: [ system ]
      
          - name: Install LAMP Packages
            apt: name={{ item }} update_cache=yes state=latest
            loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ]
            tags: [ system ]
      
          - name: Install PHP Extensions
            apt: name={{ item }} update_cache=yes state=latest
            loop: "{{ php_modules }}"
            tags: [ system ]
      
        # Apache Configuration
          - name: Create document root
            file:
              path: "/var/www/{{ http_host }}"
              state: directory
              owner: "www-data"
              group: "www-data"
              mode: '0755'
            tags: [ apache ]
      
          - name: Set up Apache VirtualHost
            template:
              src: "files/apache.conf.j2"
              dest: "/etc/apache2/sites-available/{{ http_conf }}"
            notify: Reload Apache
            tags: [ apache ]
      
          - name: Enable rewrite module
            shell: /usr/sbin/a2enmod rewrite
            notify: Reload Apache
            tags: [ apache ]
      
          - name: Enable new site
            shell: /usr/sbin/a2ensite {{ http_conf }}
            notify: Reload Apache
            tags: [ apache ]
      
          - name: Disable default Apache site
            shell: /usr/sbin/a2dissite 000-default.conf
            notify: Restart Apache
            tags: [ apache ]
      
        # MySQL Configuration
          - name: Set the root password
            mysql_user:
              name: root
              password: "{{ mysql_root_password }}"
              login_unix_socket: /var/run/mysqld/mysqld.sock
            tags: [ mysql, mysql-root ]
      
          - name: Remove all anonymous user accounts
            mysql_user:
              name: ''
              host_all: yes
              state: absent
              login_user: root
              login_password: "{{ mysql_root_password }}"
            tags: [ mysql ]
      
          - name: Remove the MySQL test database
            mysql_db:
              name: test
              state: absent
              login_user: root
              login_password: "{{ mysql_root_password }}"
            tags: [ mysql ]
      
          - name: Creates database for WordPress
            mysql_db:
              name: "{{ mysql_db }}"
              state: present
              login_user: root
              login_password: "{{ mysql_root_password }}"
            tags: [ mysql ]
      
          - name: Create MySQL user for WordPress
            mysql_user:
              name: "{{ mysql_user }}"
              password: "{{ mysql_password }}"
              priv: "{{ mysql_db }}.*:ALL"
              state: present
              login_user: root
              login_password: "{{ mysql_root_password }}"
            tags: [ mysql ]
      
        # UFW Configuration
          - name: "UFW - Allow HTTP on port {{ http_port }}"
            ufw:
              rule: allow
              port: "{{ http_port }}"
              proto: tcp
            tags: [ system ]
      
        # WordPress Configuration
          - name: Download and unpack latest WordPress
            unarchive:
              src: https://wordpress.org/latest.tar.gz
              dest: "/var/www/{{ http_host }}"
              remote_src: yes
              creates: "/var/www/{{ http_host }}/wordpress"
            tags: [ wordpress ]
      
          - name: Set ownership
            file:
              path: "/var/www/{{ http_host }}"
              state: directory
              recurse: yes
              owner: www-data
              group: www-data
            tags: [ wordpress ]
      
          - name: Set permissions for directories
            shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type d -exec chmod 750 {} \;"
            tags: [ wordpress ]
      
          - name: Set permissions for files
            shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type f -exec chmod 640 {} \;"
            tags: [ wordpress ]
      
          - name: Set up wp-config
            template:
              src: "files/wp-config.php.j2"
              dest: "/var/www/{{ http_host }}/wordpress/wp-config.php"
            tags: [ wordpress ]
      
        handlers:
          - name: Reload Apache
            service:
              name: apache2
              state: reloaded
      
          - name: Restart Apache
            service:
              name: apache2
              state: restarted
      

      Вы можете изменить эти файлы в соответствии с требованиями вашего рабочего процесса.

      Заключение

      В этом руководстве мы использовали Ansible для автоматизации процесса установки и настройки веб-сайта WordPress с LAMP на сервере Ubuntu 18.04.

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



      Source link

      Использование ldflags для установки информации о версиях в приложениях Go


      Введение

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

      В Go эту проблему можно решить с помощью опции -ldflags команды go build. Эта опция вставляет в двоичный файл во время сборки динамическую информацию, не требуя изменения исходного кода. В этой опции ld означает программу linker, которая связывает разные фрагменты скомпилированного исходного кода в двоичном файле. Таким образом, название опции ldflags означает флаги linker. Данная опция передает файл в инструмент linker цепи инструментов Go cmd/link, позволяющий изменять значения импортированных пакетов во время сборки из командной строки.

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

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

      Для выполнения примера из этой статьи вам потребуется следующее:

      Создание образца приложения

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

      Создайте внутри каталога src подкаталог с именем вашего приложения. В этом обучающем руководстве мы будем использовать имя приложения app:

      Смените рабочий каталог на эту папку:

      Затем используйте предпочитаемый текстовый редактор для создания входной точки программы, main.go:

      Добавьте следующий код, чтобы ваше приложение распечатывало информацию о версии:

      app/main.go

      package main
      
      import (
          "fmt"
      )
      
      var Version = "development"
      
      func main() {
          fmt.Println("Version:t", Version)
      }
      

      Внутри функции main() вы декларировали переменную Version, затем распечатали строку Version: с символом табуляции t, а затем декларированную переменную.

      На данном этапе переменная Version имеет заданное значение development, и эта версия будет использоваться для приложения по умолчанию. Впоследствии вы сможете заменить это значение на официальный номер версии, соответствующий желаемому семантическому формату версий.

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

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

      Output

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

      Использование ldflags с go build

      Как указывалось выше, ldflags означает флаги linker и используется для передачи флагов в linker через цепочку инструментов Go. При этом используется следующий синтаксис:

      • go build -ldflags="-flag"

      В этом примере мы передали флаг в соответствующую команду go tool link, которая запускается в рамках go build. Эта команда заключает в двойные кавычки передаваемое в ldflags содержимое, чтобы предотвратить разрыв символов или неправильную интерпретацию передаваемых символов командной строкой. Отсюда вы можете передать много разных флагов link. В этом обучающем руководстве мы используем флаг -X для записи информации в переменную во время связи, а затем указываем путь пакета к переменной и ее новое значение:

      • go build -ldflags="-X 'package_path.variable_name=new_value'"

      Внутри кавычек содержится опция -X и пара ключ-значение, соответствующая изменяемой переменной и ее новому значению. Символ . разделяет путь пакета и имя переменной, а одинарные кавычки используются для предотвращения разрыва символов в паре ключ-значение.

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

      • go build -ldflags="-X 'main.Version=v1.0.0'"

      В этой команде main — это путь пакета переменной Version, поскольку данная переменная содержится в файле main.go. Version — это переменная, в которую выполняется запись, а v1.0.0 — это новое значение.

      Для использования ldflags необходимо, чтобы изменяемое значение существовало и относилось к переменной уровня пакета типа string. Эта переменная может быть экспортированной или неэкспортированной. Значение не может быть const и не может задаваться результатом вызова функции. К счастью, Version соответствует всем этим требованиям. Она уже декларирована как переменная в файле main.go и ее текущее значение (development) и желаемое значение (v1.0.0) являются строками.

      После сборки нового двоичного файла app запустите приложение:

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

      Output

      С помощью -ldflags вы успешно изменили значение переменной Version с development на v1.0.0.

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

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

      Таргетирование переменных субпакета

      В последнем разделе вы внесли изменения в переменную Version в пакете верхнего уровня приложения. Однако ситуация не всегда такая простая. Очень часто наиболее практичным способом будет поместить эти переменные в другой пакет, поскольку пакет main не является импортируемым. Чтобы смоделировать это в образце приложения вы создадите новый субпакет app/build, в котором будет храниться информация о времени сборки двоичного файла и имени пользователя, отправившего команду сборки.

      Чтобы добавить новый субпакет, добавьте в проект новый каталог с именем build:

      Затем создайте новый файл с именем build.go для хранения новых переменных:

      Добавьте в текстовом редакторе новые переменные Time и User:

      app/build/build.go

      package build
      
      var Time string
      
      var User string
      

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

      Сохраните и закройте файл.

      Затем откройте файл main.go для добавления этих переменных в ваше приложение:

      Добавьте в файл main.go следующие выделенные строки:

      main.go

      package main
      
      import (
          "app/build"
          "fmt"
      )
      
      var Version = "development"
      
      func main() {
          fmt.Println("Version:t", Version)
          fmt.Println("build.Time:t", build.Time)
          fmt.Println("build.User:t", build.User)
      }
      

      В этих строках вы вначале импортируете пакет app/build, а затем выполняете печать build.Time и build.User точно так же, как и при печати переменной Version.

      Сохраните файл и закройте текстовый редактор.

      Чтобы сделать эти переменные целью опции ldflags, вы можете использовать путь импорта app/build с символом . в конце User или . Time, поскольку вам уже известен путь импорта. Для моделирования более сложной ситуации, когда путь к переменной не очевиден, мы используем команду nm в цепочке инструментов Go.

      Команда go tool nm выводит символы из заданного исполняемого файла, объектного файла или архива. В данном случае символ относится к объекту в коде, например, к определенной или импортированной переменной или функции. Генерирование таблицы символов с помощью команды nm и использование grep для поиска переменной позволяет быстро найти информацию о пути.

      Примечание: команда nm не поможет найти путь к переменной, если имя пакета содержит любые символы, кроме символов ASCII, или содержит символ " или %, поскольку это ограничение относится к самому инструменту.

      Для использования этой команды выполните сборку двоичного файла для app:

      После сборки app укажите на него инструменту nm и выполните поиск в результатах:

      • go tool nm ./app | grep app

      Инструмент nm выводит большое количество данных. В связи с этим в предыдущей команде использовался оператор | для передачи результатов в команду grep, которая выполняет поиск терминов с app верхнего уровня в заголовке.

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

      Output

      55d2c0 D app/build.Time 55d2d0 D app/build.User 4069a0 T runtime.appendIntStr 462580 T strconv.appendEscapedRune . . .

      В данном случае первые две строки набора результатов содержат пути к двум переменным, которые вы ищете: app/build.Time и app/build.User.

      Теперь вам известны пути, и вы можете снова выполнить сборку приложения с изменением переменных Version, User и Time во время сборки. Для этого нужно передать несколько флагов -X в -ldflags:

      • go build -v -ldflags="-X 'main.Version=v1.0.0' -X 'app/build.User=$(id -u -n)' -X 'app/build.Time=$(date)'"

      Вы передали команду Bash id -u -n для вывода текущего пользователя и команду date для вывода текущей даты.

      После сборки исполняемого файла запустите программу:

      В системе Unix эта команда выводит примерно следующие результаты:

      Output

      Version: v1.0.0 build.Time: Fri Oct 4 19:49:19 UTC 2019 build.User: sammy

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

      Заключение

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

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



      Source link