=================================== | =================================== | ||||
The following states provide an alternate approach to managing Nginx and Nginx | The following states provide an alternate approach to managing Nginx and Nginx | ||||
vhosts, as well as code organization. Please provide feedback by filing issues, | |||||
servers, as well as code organization. Please provide feedback by filing issues, | |||||
discussing in ``#salt`` in Freenode and the mailing list as normal. | discussing in ``#salt`` in Freenode and the mailing list as normal. | ||||
.. contents:: | .. contents:: | ||||
Manages the startup and running state of the nginx service. | Manages the startup and running state of the nginx service. | ||||
``nginx.ng.vhosts_config`` | |||||
``nginx.ng.servers_config`` | |||||
-------------------------- | -------------------------- | ||||
Manages virtual host files. This state only manages the content of the files | Manages virtual host files. This state only manages the content of the files | ||||
and does not bind them to service calls. | and does not bind them to service calls. | ||||
``nginx.ng.vhosts`` | |||||
``nginx.ng.servers`` | |||||
------------------- | ------------------- | ||||
Manages nginx virtual hosts files and binds them to service calls. | Manages nginx virtual hosts files and binds them to service calls. |
{% set ind_increment = 4 %} | {% set ind_increment = 4 %} | ||||
{%- macro vhost_config(values, key='', ind=0, lb='\n', delim=';', operator=' ') -%} | |||||
{%- macro server_config(values, key='', ind=0, lb='\n', delim=';', operator=' ') -%} | |||||
{%- for value in values -%} | {%- for value in values -%} | ||||
{%- if value is number or value is string -%} | {%- if value is number or value is string -%} | ||||
{{ lb }}{{ key|indent(ind, True) }}{{ operator }}{{ value }}{{ delim }} | {{ lb }}{{ key|indent(ind, True) }}{{ operator }}{{ value }}{{ delim }} | ||||
{%- elif value is mapping -%} | {%- elif value is mapping -%} | ||||
{%- for k, v in value.items() -%} | {%- for k, v in value.items() -%} | ||||
{%- if v is number or v is string -%} | {%- if v is number or v is string -%} | ||||
{{ vhost_config([v], k, ind) }} | |||||
{{ server_config([v], k, ind) }} | |||||
{%- elif v|length() > 0 and (v[0] is number or v[0] is string) -%} | {%- elif v|length() > 0 and (v[0] is number or v[0] is string) -%} | ||||
{{ lb }}{{ k|indent(ind,True) }}{{ vhost_config(v,'', 0, '', '')}}{{ delim }} | |||||
{{ lb }}{{ k|indent(ind,True) }}{{ server_config(v,'', 0, '', '')}}{{ delim }} | |||||
{%- else %} | {%- else %} | ||||
{{ lb }}{{ k|indent(ind, True) }} {{ '{' }} | {{ lb }}{{ k|indent(ind, True) }} {{ '{' }} | ||||
{{- vhost_config(v, '', ind + ind_increment) }} | |||||
{{- server_config(v, '', ind + ind_increment) }} | |||||
{{ '}'|indent(ind, True) }} | {{ '}'|indent(ind, True) }} | ||||
{%- endif -%} | {%- endif -%} | ||||
{%- endfor -%} | {%- endfor -%} | ||||
{%- elif value is iterable -%} | {%- elif value is iterable -%} | ||||
{{ vhost_config(value, ind + ind_increment, delim, operator) }} | |||||
{{ server_config(value, ind + ind_increment, delim, operator) }} | |||||
{%- endif -%} | {%- endif -%} | ||||
{%- endfor -%} | {%- endfor -%} | ||||
{%- endmacro -%} | {%- endmacro -%} | ||||
# Nginx vhost configuration | |||||
# Nginx server configuration | |||||
# | # | ||||
# **** DO NOT EDIT THIS FILE **** | # **** DO NOT EDIT THIS FILE **** | ||||
# | # | ||||
# This file is managed by Salt. | # This file is managed by Salt. | ||||
{{ vhost_config(config) }} | |||||
{{ server_config(config) }} |
include: | include: | ||||
- nginx.ng.config | - nginx.ng.config | ||||
- nginx.ng.service | - nginx.ng.service | ||||
- nginx.ng.vhosts | |||||
- nginx.ng.servers | |||||
- nginx.ng.certificates | - nginx.ng.certificates | ||||
extend: | extend: |
'service': 'nginx', | 'service': 'nginx', | ||||
'webuser': 'www-data', | 'webuser': 'www-data', | ||||
'conf_file': '/etc/nginx/nginx.conf', | 'conf_file': '/etc/nginx/nginx.conf', | ||||
'vhost_available': '/etc/nginx/sites-available', | |||||
'vhost_enabled': '/etc/nginx/sites-enabled', | |||||
'vhost_use_symlink': True, | |||||
'server_available': '/etc/nginx/sites-available', | |||||
'server_enabled': '/etc/nginx/sites-enabled', | |||||
'server_use_symlink': True, | |||||
'pid_file': '/run/nginx.pid', | 'pid_file': '/run/nginx.pid', | ||||
}, | }, | ||||
'CentOS': { | 'CentOS': { | ||||
'service': 'nginx', | 'service': 'nginx', | ||||
'webuser': 'nginx', | 'webuser': 'nginx', | ||||
'conf_file': '/etc/nginx/nginx.conf', | 'conf_file': '/etc/nginx/nginx.conf', | ||||
'vhost_available': '/etc/nginx/conf.d', | |||||
'vhost_enabled': '/etc/nginx/conf.d', | |||||
'vhost_use_symlink': False, | |||||
'server_available': '/etc/nginx/conf.d', | |||||
'server_enabled': '/etc/nginx/conf.d', | |||||
'server_use_symlink': False, | |||||
'pid_file': '/run/nginx.pid', | 'pid_file': '/run/nginx.pid', | ||||
'rh_os_releasever': '$releasever', | 'rh_os_releasever': '$releasever', | ||||
'gpg_check': False, | 'gpg_check': False, | ||||
'service': 'nginx', | 'service': 'nginx', | ||||
'webuser': 'nginx', | 'webuser': 'nginx', | ||||
'conf_file': '/etc/nginx/nginx.conf', | 'conf_file': '/etc/nginx/nginx.conf', | ||||
'vhost_available': '/etc/nginx/conf.d', | |||||
'vhost_enabled': '/etc/nginx/conf.d', | |||||
'vhost_use_symlink': False, | |||||
'server_available': '/etc/nginx/conf.d', | |||||
'server_enabled': '/etc/nginx/conf.d', | |||||
'server_use_symlink': False, | |||||
'pid_file': '/run/nginx.pid', | 'pid_file': '/run/nginx.pid', | ||||
'rh_os_releasever': '$releasever', | 'rh_os_releasever': '$releasever', | ||||
'gpg_check': False, | 'gpg_check': False, | ||||
'service': 'nginx', | 'service': 'nginx', | ||||
'webuser': 'nginx', | 'webuser': 'nginx', | ||||
'conf_file': '/etc/nginx/nginx.conf', | 'conf_file': '/etc/nginx/nginx.conf', | ||||
'vhost_available': '/etc/nginx/conf.d', | |||||
'vhost_enabled': '/etc/nginx/conf.d', | |||||
'vhost_use_symlink': False, | |||||
'server_available': '/etc/nginx/conf.d', | |||||
'server_enabled': '/etc/nginx/conf.d', | |||||
'server_use_symlink': False, | |||||
'pid_file': '/run/nginx.pid', | 'pid_file': '/run/nginx.pid', | ||||
'gpg_check': True, | 'gpg_check': True, | ||||
'gpg_key': 'http://download.opensuse.org/repositories/server:/http/openSUSE_13.2/repodata/repomd.xml.key' | 'gpg_key': 'http://download.opensuse.org/repositories/server:/http/openSUSE_13.2/repodata/repomd.xml.key' | ||||
'service': 'nginx', | 'service': 'nginx', | ||||
'webuser': 'http', | 'webuser': 'http', | ||||
'conf_file': '/etc/nginx/nginx.conf', | 'conf_file': '/etc/nginx/nginx.conf', | ||||
'vhost_available': '/etc/nginx/sites-available', | |||||
'vhost_enabled': '/etc/nginx/sites-enabled', | |||||
'vhost_use_symlink': True, | |||||
'server_available': '/etc/nginx/sites-available', | |||||
'server_enabled': '/etc/nginx/sites-enabled', | |||||
'server_use_symlink': True, | |||||
}, | }, | ||||
'Gentoo': { | 'Gentoo': { | ||||
'package': 'www-servers/nginx', | 'package': 'www-servers/nginx', | ||||
'service': 'nginx', | 'service': 'nginx', | ||||
'webuser': 'nginx', | 'webuser': 'nginx', | ||||
'conf_file': '/etc/nginx/nginx.conf', | 'conf_file': '/etc/nginx/nginx.conf', | ||||
'vhost_available': '/etc/nginx/sites-available', | |||||
'vhost_enabled': '/etc/nginx/sites-enabled', | |||||
'vhost_use_symlink': True, | |||||
'server_available': '/etc/nginx/sites-available', | |||||
'server_enabled': '/etc/nginx/sites-enabled', | |||||
'server_use_symlink': True, | |||||
}, | }, | ||||
}, default='Debian' ), | }, default='Debian' ), | ||||
'install_from_source': False, | 'install_from_source': False, | ||||
}, | }, | ||||
}, | }, | ||||
}, | }, | ||||
'vhosts': { | |||||
'servers': { | |||||
'disabled_postfix': '.disabled', | 'disabled_postfix': '.disabled', | ||||
'symlink_opts': {}, | 'symlink_opts': {}, | ||||
'rename_opts': {}, | 'rename_opts': {}, |
# nginx.ng.vhosts | |||||
# nginx.ng.servers | |||||
# | # | ||||
# Manages virtual hosts and their relationship to the nginx service. | # Manages virtual hosts and their relationship to the nginx service. | ||||
{% from 'nginx/ng/map.jinja' import nginx, sls_block with context %} | {% from 'nginx/ng/map.jinja' import nginx, sls_block with context %} | ||||
{% from 'nginx/ng/vhosts_config.sls' import vhost_states with context %} | |||||
{% from 'nginx/ng/servers_config.sls' import server_states with context %} | |||||
{% from 'nginx/ng/service.sls' import service_function with context %} | {% from 'nginx/ng/service.sls' import service_function with context %} | ||||
{% macro file_requisites(states) %} | {% macro file_requisites(states) %} | ||||
include: | include: | ||||
- nginx.ng.service | - nginx.ng.service | ||||
- nginx.ng.vhosts_config | |||||
- nginx.ng.servers_config | |||||
{% if vhost_states|length() > 0 %} | |||||
{% if server_states|length() > 0 %} | |||||
nginx_service_reload: | nginx_service_reload: | ||||
service.{{ service_function }}: | service.{{ service_function }}: | ||||
- name: {{ nginx.lookup.service }} | - name: {{ nginx.lookup.service }} | ||||
- use: | - use: | ||||
- service: nginx_service | - service: nginx_service | ||||
- watch: | - watch: | ||||
{{ file_requisites(vhost_states) }} | |||||
{{ file_requisites(server_states) }} | |||||
- require: | - require: | ||||
{{ file_requisites(vhost_states) }} | |||||
{{ file_requisites(server_states) }} | |||||
- service: nginx_service | - service: nginx_service | ||||
{% endif %} | {% endif %} |
# nginx.ng.servers_config | |||||
# | |||||
# Manages the configuration of virtual host files. | |||||
{% from 'nginx/ng/map.jinja' import nginx, sls_block with context %} | |||||
{% set server_states = [] %} | |||||
# Simple path concatenation. | |||||
# Needs work to make this function on windows. | |||||
{% macro path_join(file, root) -%} | |||||
{{ root ~ '/' ~ file }} | |||||
{%- endmacro %} | |||||
# Retrieves the disabled name of a particular server | |||||
{% macro disabled_name(server) -%} | |||||
{%- if nginx.lookup.server_use_symlink -%} | |||||
{{ nginx.servers.managed.get(server).get('disabled_name', server) }} | |||||
{%- else -%} | |||||
{{ nginx.servers.managed.get(server).get('disabled_name', server ~ nginx.servers.disabled_postfix) }} | |||||
{%- endif -%} | |||||
{%- endmacro %} | |||||
# Gets the path of a particular server | |||||
{% macro server_path(server, state) -%} | |||||
{%- if state == True -%} | |||||
{{ path_join(server, nginx.servers.managed.get(server).get('enabled_dir', nginx.lookup.server_enabled)) }} | |||||
{%- elif state == False -%} | |||||
{{ path_join(disabled_name(server), nginx.servers.managed.get(server).get('available_dir', nginx.lookup.server_available)) }} | |||||
{%- else -%} | |||||
{{ path_join(server, nginx.servers.managed.get(server).get('available_dir', nginx.lookup.server_available)) }} | |||||
{%- endif -%} | |||||
{%- endmacro %} | |||||
# Gets the current canonical name of a server | |||||
{% macro server_curpath(server) -%} | |||||
{{ server_path(server, nginx.servers.managed.get(server).get('available')) }} | |||||
{%- endmacro %} | |||||
# Creates the sls block that manages symlinking / renaming servers | |||||
{% macro manage_status(server, state) -%} | |||||
{%- set anti_state = {True:False, False:True}.get(state) -%} | |||||
{% if state == True %} | |||||
{%- if nginx.lookup.server_use_symlink %} | |||||
file.symlink: | |||||
{{ sls_block(nginx.servers.symlink_opts) }} | |||||
- name: {{ server_path(server, state) }} | |||||
- target: {{ server_path(server, anti_state) }} | |||||
{%- else %} | |||||
file.rename: | |||||
{{ sls_block(nginx.servers.rename_opts) }} | |||||
- name: {{ server_path(server, state) }} | |||||
- source: {{ server_path(server, anti_state) }} | |||||
{%- endif %} | |||||
{%- elif state == False %} | |||||
{%- if nginx.lookup.server_use_symlink %} | |||||
file.absent: | |||||
- name: {{ server_path(server, anti_state) }} | |||||
{%- else %} | |||||
file.rename: | |||||
{{ sls_block(nginx.servers.rename_opts) }} | |||||
- name: {{ server_path(server, state) }} | |||||
- source: {{ server_path(server, anti_state) }} | |||||
{%- endif -%} | |||||
{%- endif -%} | |||||
{%- endmacro %} | |||||
# Makes sure the enabled directory exists | |||||
nginx_server_enabled_dir: | |||||
file.directory: | |||||
{{ sls_block(nginx.servers.dir_opts) }} | |||||
- name: {{ nginx.lookup.server_enabled }} | |||||
# If enabled and available are not the same, create available | |||||
{% if nginx.lookup.server_enabled != nginx.lookup.server_available -%} | |||||
nginx_server_available_dir: | |||||
file.directory: | |||||
{{ sls_block(nginx.servers.dir_opts) }} | |||||
- name: {{ nginx.lookup.server_available }} | |||||
{%- endif %} | |||||
# Manage the actual server files | |||||
{% for server, settings in nginx.servers.managed.items() %} | |||||
{% endfor %} | |||||
# Managed enabled/disabled state for servers | |||||
{% for server, settings in nginx.servers.managed.items() %} | |||||
{% if settings.config != None %} | |||||
{% set conf_state_id = 'server_conf_' ~ loop.index0 %} | |||||
{{ conf_state_id }}: | |||||
file.managed: | |||||
{{ sls_block(nginx.servers.managed_opts) }} | |||||
- name: {{ server_curpath(server) }} | |||||
- source: salt://nginx/ng/files/server.conf | |||||
- template: jinja | |||||
- context: | |||||
config: {{ settings.config|json() }} | |||||
{% if 'overwrite' in settings and settings.overwrite == False %} | |||||
- unless: | |||||
- test -e {{ server_curpath(server) }} | |||||
{% endif %} | |||||
{% do server_states.append(conf_state_id) %} | |||||
{% endif %} | |||||
{% if settings.enabled != None %} | |||||
{% set status_state_id = 'server_state_' ~ loop.index0 %} | |||||
{{ status_state_id }}: | |||||
{{ manage_status(server, settings.enabled) }} | |||||
{% if settings.config != None %} | |||||
- require: | |||||
- file: {{ conf_state_id }} | |||||
{% endif %} | |||||
{% do server_states.append(status_state_id) %} | |||||
{% endif %} | |||||
{% endfor %} |
# nginx.ng.vhosts_config | |||||
# | |||||
# Manages the configuration of virtual host files. | |||||
{% from 'nginx/ng/map.jinja' import nginx, sls_block with context %} | |||||
{% set vhost_states = [] %} | |||||
# Simple path concatenation. | |||||
# Needs work to make this function on windows. | |||||
{% macro path_join(file, root) -%} | |||||
{{ root ~ '/' ~ file }} | |||||
{%- endmacro %} | |||||
# Retrieves the disabled name of a particular vhost | |||||
{% macro disabled_name(vhost) -%} | |||||
{%- if nginx.lookup.vhost_use_symlink -%} | |||||
{{ nginx.vhosts.managed.get(vhost).get('disabled_name', vhost) }} | |||||
{%- else -%} | |||||
{{ nginx.vhosts.managed.get(vhost).get('disabled_name', vhost ~ nginx.vhosts.disabled_postfix) }} | |||||
{%- endif -%} | |||||
{%- endmacro %} | |||||
# Gets the path of a particular vhost | |||||
{% macro vhost_path(vhost, state) -%} | |||||
{%- if state == True -%} | |||||
{{ path_join(vhost, nginx.vhosts.managed.get(vhost).get('enabled_dir', nginx.lookup.vhost_enabled)) }} | |||||
{%- elif state == False -%} | |||||
{{ path_join(disabled_name(vhost), nginx.vhosts.managed.get(vhost).get('available_dir', nginx.lookup.vhost_available)) }} | |||||
{%- else -%} | |||||
{{ path_join(vhost, nginx.vhosts.managed.get(vhost).get('available_dir', nginx.lookup.vhost_available)) }} | |||||
{%- endif -%} | |||||
{%- endmacro %} | |||||
# Gets the current canonical name of a vhost | |||||
{% macro vhost_curpath(vhost) -%} | |||||
{{ vhost_path(vhost, nginx.vhosts.managed.get(vhost).get('available')) }} | |||||
{%- endmacro %} | |||||
# Creates the sls block that manages symlinking / renaming vhosts | |||||
{% macro manage_status(vhost, state) -%} | |||||
{%- set anti_state = {True:False, False:True}.get(state) -%} | |||||
{% if state == True %} | |||||
{%- if nginx.lookup.vhost_use_symlink %} | |||||
file.symlink: | |||||
{{ sls_block(nginx.vhosts.symlink_opts) }} | |||||
- name: {{ vhost_path(vhost, state) }} | |||||
- target: {{ vhost_path(vhost, anti_state) }} | |||||
{%- else %} | |||||
file.rename: | |||||
{{ sls_block(nginx.vhosts.rename_opts) }} | |||||
- name: {{ vhost_path(vhost, state) }} | |||||
- source: {{ vhost_path(vhost, anti_state) }} | |||||
{%- endif %} | |||||
{%- elif state == False %} | |||||
{%- if nginx.lookup.vhost_use_symlink %} | |||||
file.absent: | |||||
- name: {{ vhost_path(vhost, anti_state) }} | |||||
{%- else %} | |||||
file.rename: | |||||
{{ sls_block(nginx.vhosts.rename_opts) }} | |||||
- name: {{ vhost_path(vhost, state) }} | |||||
- source: {{ vhost_path(vhost, anti_state) }} | |||||
{%- endif -%} | |||||
{%- endif -%} | |||||
{%- endmacro %} | |||||
# Makes sure the enabled directory exists | |||||
nginx_vhost_enabled_dir: | |||||
file.directory: | |||||
{{ sls_block(nginx.vhosts.dir_opts) }} | |||||
- name: {{ nginx.lookup.vhost_enabled }} | |||||
# If enabled and available are not the same, create available | |||||
{% if nginx.lookup.vhost_enabled != nginx.lookup.vhost_available -%} | |||||
nginx_vhost_available_dir: | |||||
file.directory: | |||||
{{ sls_block(nginx.vhosts.dir_opts) }} | |||||
- name: {{ nginx.lookup.vhost_available }} | |||||
{%- endif %} | |||||
# Manage the actual vhost files | |||||
{% for vhost, settings in nginx.vhosts.managed.items() %} | |||||
{% endfor %} | |||||
# Managed enabled/disabled state for vhosts | |||||
{% for vhost, settings in nginx.vhosts.managed.items() %} | |||||
{% if settings.config != None %} | |||||
{% set conf_state_id = 'vhost_conf_' ~ loop.index0 %} | |||||
{{ conf_state_id }}: | |||||
file.managed: | |||||
{{ sls_block(nginx.vhosts.managed_opts) }} | |||||
- name: {{ vhost_curpath(vhost) }} | |||||
- source: salt://nginx/ng/files/vhost.conf | |||||
- template: jinja | |||||
- context: | |||||
config: {{ settings.config|json() }} | |||||
{% if 'overwrite' in settings and settings.overwrite == False %} | |||||
- unless: | |||||
- test -e {{ vhost_curpath(vhost) }} | |||||
{% endif %} | |||||
{% do vhost_states.append(conf_state_id) %} | |||||
{% endif %} | |||||
{% if settings.enabled != None %} | |||||
{% set status_state_id = 'vhost_state_' ~ loop.index0 %} | |||||
{{ status_state_id }}: | |||||
{{ manage_status(vhost, settings.enabled) }} | |||||
{% if settings.config != None %} | |||||
- require: | |||||
- file: {{ conf_state_id }} | |||||
{% endif %} | |||||
{% do vhost_states.append(status_state_id) %} | |||||
{% endif %} | |||||
{% endfor %} |
service: nginx | service: nginx | ||||
webuser: www-data | webuser: www-data | ||||
conf_file: /etc/nginx/nginx.conf | conf_file: /etc/nginx/nginx.conf | ||||
vhost_available: /etc/nginx/sites-available | |||||
vhost_enabled: /etc/nginx/sites-enabled | |||||
vhost_use_symlink: True | |||||
server_available: /etc/nginx/sites-available | |||||
server_enabled: /etc/nginx/sites-enabled | |||||
server_use_symlink: True | |||||
# This is required for RedHat like distros (Amazon Linux) that don't follow semantic versioning for $releasever | # This is required for RedHat like distros (Amazon Linux) that don't follow semantic versioning for $releasever | ||||
rh_os_releasever: '6' | rh_os_releasever: '6' | ||||
# Currently it can be used on rhel/centos/suse when installing from repo | # Currently it can be used on rhel/centos/suse when installing from repo | ||||
- /etc/nginx/conf.d/*.conf | - /etc/nginx/conf.d/*.conf | ||||
- /etc/nginx/sites-enabled/* | - /etc/nginx/sites-enabled/* | ||||
vhosts: | |||||
servers: | |||||
disabled_postfix: .disabled # a postfix appended to files when doing non-symlink disabling | disabled_postfix: .disabled # a postfix appended to files when doing non-symlink disabling | ||||
symlink_opts: {} # partially exposes file.symlink params when symlinking enabled sites | symlink_opts: {} # partially exposes file.symlink params when symlinking enabled sites | ||||
rename_opts: {} # partially exposes file.rename params when not symlinking disabled/enabled sites | rename_opts: {} # partially exposes file.rename params when not symlinking disabled/enabled sites | ||||
managed_opts: {} # partially exposes file.managed params for managed vhost files | |||||
managed_opts: {} # partially exposes file.managed params for managed server files | |||||
dir_opts: {} # partially exposes file.directory params for site available/enabled dirs | dir_opts: {} # partially exposes file.directory params for site available/enabled dirs | ||||
# vhost declarations | |||||
# vhosts will default to being placed in vhost_available | |||||
# server declarations | |||||
# servers will default to being placed in server_available | |||||
managed: | managed: | ||||
mysite: # relative pathname of the vhost file | |||||
mysite: # relative pathname of the server file | |||||
# may be True, False, or None where True is enabled, False, disabled, and None indicates no action | # may be True, False, or None where True is enabled, False, disabled, and None indicates no action | ||||
available_dir: /tmp/sites-available # an alternate directory (not sites-available) where this vhost may be found | |||||
enabled_dir: /tmp/sites-enabled # an alternate directory (not sites-enabled) where this vhost may be found | |||||
available_dir: /tmp/sites-available # an alternate directory (not sites-available) where this server may be found | |||||
enabled_dir: /tmp/sites-enabled # an alternate directory (not sites-enabled) where this server may be found | |||||
disabled_name: mysite.aint_on # an alternative disabled name to be use when not symlinking | disabled_name: mysite.aint_on # an alternative disabled name to be use when not symlinking | ||||
enabled: True | enabled: True | ||||
overwrite: True # overwrite an existing vhost file or not | |||||
overwrite: True # overwrite an existing server file or not | |||||
# May be a list of config options or None, if None, no vhost file will be managed/templated | |||||
# May be a list of config options or None, if None, no server file will be managed/templated | |||||
# Take server directives as lists of dictionaries. If the dictionary value is another list of | # Take server directives as lists of dictionaries. If the dictionary value is another list of | ||||
# dictionaries a block {} will be started with the dictionary key name | # dictionaries a block {} will be started with the dictionary key name | ||||
config: | config: |