Как сделать так, чтобы ansible обслуживал разные типы виртуальных хостов apache

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

Я создал очень простые роли apache2 для конкретного сценария, например vhost документа и vhost mod_proxy. Я застрял, я не могу понять, как написать playbook для выполнения этих разных конфигураций vhosts на одних и тех же хостах, то есть домен node1.localhost, указывающий на /var/www/vhosts/node1.localhost, и node2.localhost, выполняющий обратный прокси-сервер для другого ящика на tomcat ajp port.

Ниже моя роль:

#roles/apache/tasks/main.yaml
---
- name: Update apt cache
  apt: update_cache=yes

- name: Install Apache2
  apt: 
    name=apache2
    state=present

- name: Creating a Document virtualhost file
  template:
    src=http_vhost.conf.j2
    dest=/etc/apache2/site-available/{{ apache_domain_name }}.conf
    mode=0644
    when: document_vhost == True

- name: Creating a Reverse Proxy virtualhost file
  template:
    src=http_vhost_reverse_proxy.conf.j2
    dest=/etc/apache2/site-available/{{ apache_domain_name }}.conf
    mode=0644
    when: proxy_vhost == True

- name: Activate Vhosts
  command: a2ensite {{ apache_domain_name }}.conf
  when: activate_vhost|bool
  notify: Reload Apache

- name: Deactivate Vhosts
  command: a2dissite {{ apache_domain_name }}.conf
  when: deactivate_vhost|bool
  notify: Reload-Apache

Файл шаблона документа vhost

#roles/templates/http_vhost.conf.j2
<VirtualHost *:{{ apache_port }}>
    ServerAdmin {{ apache_admin_email_address }}
    ServerName {{ apache_domain_name }}
    {% if apache_domain_aliases is defined %}
        {% for serveralias in apache_domain_aliases %}
            ServerAlias {{ serveralias }}
        {% endfor %}
    {% endif %}
    DocumentRoot /var/www/vhosts{{ apache_domain_name}}/htdocs
    <Directory /var/www/vhosts{{ apache_domain_name}}/htdocs>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/{{ apache_domain_name }}_error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel {{ apache_log_level|default('warn') }}

    CustomLog ${APACHE_LOG_DIR}/{{ apache_domain_name }}_access.log combined
 </VirtualHost>

Файл шаблона обратного прокси vhost

#roles/apache/templates/http_vhost_reverse_proxy.conf.j2
<VirtualHost *:{{ apache_port }}>

    ProxyRequests off    
    ProxyPreserveHost On

    ServerAdmin {{ apache_admin_email_address }}
    ServerName {{ apache_domain_name }}
    {% if apache_domain_aliases if defined %}
        {% for serveralias in apache_domain_aliases %}
            ServerAlias {{ serveralias }}
        {% endfor %}
    {% endif %}

    {% if apache_vhosts if defined %}

        {% for vhost in apache_vhosts %}

           ProxyPass {{ vhost.apache_proxy_context }} {{ vhost.reversed_server_mod }}://{{ vhost.reversed_server_ip }}:{{ vhost.reversed_server_port }}{{ vhost.reversed_server_context }}
           ProxyPassReverse {{ vhost.apache_proxy_context }} {{ vhost.reversed_server_mod }}://{{ vhost.reversed_server_ip }}:{{ vhost.reversed_server_port }}{{ vhost.reversed_server_context }}

        {% endfor %}
    {% endif %}

    ErrorLog ${APACHE_LOG_DIR}/{{ apache_domain_name }}_error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel {{ apache_log_level|default('warn') }}

    CustomLog ${APACHE_LOG_DIR}/{{ apache_domain_name }}_access.log combined
</VirtualHost>

Допустим, у меня есть IP-адрес узла 192.168.56.106, и я должен обрабатывать как node1.localhost обычный виртуальный хост, так и node2.localhost прокси-виртуальный хост.

Спасибо за помощь


person black sensei    schedule 03.05.2015    source источник


Ответы (2)


То, как вы настроили свои переменные (используя одни и те же имена переменных как для обычного виртуального хоста, так и для прокси-сервера), не будет работать. Это не проблема ansible (ansible не заботится), Apache не будет доволен полученными файлами. У вас не может быть двух разных конфигураций, настроенных для одного и того же полного доменного имени. Кроме того, вы используете одно и то же имя файла для обоих конфигов, поэтому конфигурация прокси-сервера будет затирать любую существующую конфигурацию виртуального хоста с тем же именем.

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

{{ proxy_apache_domain_name | default(apache_domain_name) }}

Что касается управления тем, какая конфигурация должна быть активной на каком хосте, я бы установил значение по умолчанию для document_vhost и proxy_vhost равным false в defaults/main.yml роли, а затем включил их выборочно для каждого хоста в host_vars хосты.

Это должно позволить вам включать/выключать определенные конфигурации на основе хоста.

роли/apache/по умолчанию/main.yaml

document_vhost: False
proxy_vhost: False

host_vars/192.168.56.106

document_vhost: True
proxy_vhost: True
person RSchulze    schedule 04.05.2015
comment
спасибо за ваш ответ, я действительно думал о том, как зациклиться внутри roles/apache/tasks/main.yml, изменив способ вызова задач, чтобы выбрать список или около того из playbook. Таким образом, часть задач, таких как создание и/или включение виртуальных хостов, будет повторяться. Наверное, это потому, что я пришел из ума программирования. Ваши комментарии заставили меня задуматься о разных сценариях. большое спасибо - person black sensei; 05.05.2015

Я знаю, что уже слишком поздно и могу не ответить на ваш прямой вопрос, но есть роли, которые выполняют большинство этих задач https://github.com/geerlingguy/ansible-role-apache

person Mazzi    schedule 03.09.2015