Skip to content

Instantly share code, notes, and snippets.

@sashka
Created November 3, 2014 15:55
Show Gist options
  • Select an option

  • Save sashka/4f52795933d3b5a30025 to your computer and use it in GitHub Desktop.

Select an option

Save sashka/4f52795933d3b5a30025 to your computer and use it in GitHub Desktop.
Уличная магия по раскладыванию шаблонных настроек для сайта. Шаблон с SSL или без SSL выбирается в зависимости от того, если что-нибудь в каталоге file/ssl/domain.tld или нет — если нет, то выкладывается шаблон без SSL.
server {
listen 80;
server_name www.{{name}};
access_log off;
rewrite ^(.*)$ http://{{name}}$1;
}
server {
listen 80;
server_name {{name}};
# access_log off;
access_log {{home}}/{{name}}/logs/access.log mokote;
error_log {{home}}/{{name}}/logs/error.log;
location / {
root {{home}}/{{name}}/site;
index index.html;
expires 10m;
add_header Cache-Control private;
# add_header Content-Type "text/html; charset=UTF-8";
}
location ~ /\.ht {
deny all;
}
}
server {
listen 80;
server_name www.{{name}} {{name}};
access_log {{home}}/{{name}}/logs/redirect.log mokote;
rewrite ^(.*)$ https://{{name}}$1 permanent;
}
server {
listen 443 ssl;
server_name {{name}};
ssl on;
ssl_certificate {{home}}/{{name}}/ssl/{{name}}.chained.crt;
ssl_certificate_key {{home}}/{{name}}/ssl/{{name}}.key;
ssl_session_cache shared:ssl_session_cache:5m;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
add_header Strict-Transport-Security "max-age=31536000";
access_log {{home}}/{{name}}/logs/access.log mokote;
error_log {{home}}/{{name}}/logs/error.log;
error_page 403 404 /404.html;
location / {
root {{home}}/{{name}}/site;
index index.html;
}
}
---
- hosts: m1.mokote.com
gather_facts: no
sudo: yes
vars:
locale: en_US.UTF-8
timezone: Europe/Moscow
roles:
# - apt
# - locale
# - timezone
# - svnbackup
# - firewall
# - exim
# - svnbackup
tasks:
- include: site.yml
vars:
home: /mokote/www
name: blabla.com
active: yes
---
- debug: msg="name:{{name}} active:{{active}}"
- name: look for ssl cert and keys for {{name}}
local_action: command ls files/ssl/{{name}}
register: ssl
ignore_errors: True
- debug: msg="{{ssl}}"
- name: create site directories
file: state=directory path={{item.path}} owner={{item.owner}} group={{item.group}} mode={{item.mode}}
with_items:
- { path: "{{home}}/{{name}}", owner: "root", group: "root", "mode": 755 }
- { path: "{{home}}/{{name}}/logs", owner: "www-data", group: "adm", "mode": 755 }
- { path: "{{home}}/{{name}}/site", owner: "www-data", group: "adm", "mode": 755 }
- name: create a directory for ssl credentials
file: state="directory" path="{{home}}/{{name}}/ssl" owner="www-data" group="www-data" mode=750
when: ssl.stdout_lines
- name: deploy ssl credentials
copy: dest="{{home}}/{{name}}/ssl/{{item}}" src="files/ssl/{{name}}/{{item}}" owner="www-data" group="www-data" mode=440
when: ssl.stdout_lines
with_items: ssl.stdout_lines
- name: deploy non-ssl template nginx.conf
template: dest="{{home}}/{{name}}/nginx.conf" src="nginx.conf" owner="www-data" group="www-data" mode=664
when: not ssl.stdout_lines
- name: deploy ssl template nginx.conf
template: dest="{{home}}/{{name}}/nginx.conf" src="nginx_ssl.conf" owner="www-data" group="www-data" mode=664
when: ssl.stdout_lines
- name: activate nginx site
file: state=link src="{{home}}/{{name}}/nginx.conf" dest="/etc/nginx/sites-enabled/{{name}}.conf"
when: active
- name: inactivate nginx site
file: state=absent path="/etc/nginx/sites-enabled/{{name}}.conf"
when: not active
@CoolCold

CoolCold commented Nov 4, 2014

Copy link
Copy Markdown

access_log {{home}}/{{name}}/logs/access.log mokote; - тут не видно, вероятно ротация автомагически где-то приделана

тута

  • name: create site directories
    file: state=directory path={{item.path}} owner={{item.owner}} group={{item.group}} mode={{item.mode}}
    with_items:
  • { path: "{{home}}/{{name}}", owner: "root", group: "root", "mode": 755 }
  • { path: "{{home}}/{{name}}/logs", owner: "www-data", group: "adm", "mode": 755 }
  • { path: "{{home}}/{{name}}/site", owner: "www-data", group: "adm", "mode": 755 }
  • name: create a directory for ssl credentials
    file: state="directory" path="{{home}}/{{name}}/ssl" owner="www-data" group="www-data" mode=750
    when: ssl.stdout_lines

из интересного - when: ssl.stdout_lines , а вот доступ на запись к файлам (логам, исходникам, сертификатам) считается не очень хорошо по секурити.

Еще я не увидал как site specific nginx конфиг класть, но это я может плохо смотрел.
В целом ансибл забавный :)

@sashka

sashka commented Nov 4, 2014

Copy link
Copy Markdown
Author

@CoolCold

access_log {{home}}/{{name}}/logs/access.log mokote; - тут не видно, вероятно ротация автомагически где-то приделана

Да, так и есть, это правило прописывается один раз, когда ставится нгинкс:

/var/log/nginx/*.log /srv/www/*/logs/*.log {
        daily
        missingok
        rotate 1000
        compress
        delaycompress
        notifempty
        create 0640 www-data adm
        sharedscripts
        prerotate
                if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
                        run-parts /etc/logrotate.d/httpd-prerotate; \
                fi \
        endscript
        postrotate
                [ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
        endscript
}

а вот доступ на запись к файлам (логам, исходникам, сертификатам) считается не очень хорошо по секурити.

What's the best practice?

из интересного - when: ssl.stdout_lines

Это простой способ понять, были ли файлики в каталоге files/blabla.com или не было. Если не было, то SSL-шаблон не нужен.

Еще я не увидал как site specific nginx конфиг класть, но это я может плохо смотрел.

Не, этого просто нет в шаблоне.

Этот playbook нужен был мне только в процессе переноса всего с m2 на m1, а сами сайты раскладываются рсинком, в силу своей статической природы. Поэтому мне было достаточно только задать единую структуру для них для всех:

/data/www/blabla.com
                 nginx.conf
                 site/
                 logs/
                 ssl/

Шаблон умеет создавать симлинк на nginx.conf в /etc/nginx/sites-enabled (или удалять, если он уже не нужен).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment