Това не е презентация за:
make
, rake
, grunt
gulp
whatever you crazy kids use these days…
Всекидневни задачи,
Дълги и досадни задачи,
…или как да си подкарам Ruby-то на съвръра.
Генади мрази да конфигурира сървъри.
Станимир мрази да конфигурира сървъри.
Генади и Станимир много мразят да конфигурират сървъри.
Когато машината и dependencies еволюират, много
Автоматизацията е като документация за машината… особено когато имате повече от една машина.
Reproducibility — няма разминаване в средите
Генади работи с Python3, Стан с Python2
Ама при мен работи?!
★ 5, 276 stars
⟳ 9, 851 commits
35 releases
644 contributors
★ 1, 971 stars
⟳ 15688 commits
276 releases
274 contributors
def application(env, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b"Hello Rogue!"]
pip
build-essential
…за три реда код.
- name: Install packages
apt: >
pkg={{ item }}
state=present
with_items:
- 'python{{ python_version }}'
- 'python{{ python_version }}-dev'
- name: Check if pip is installed
command: >
which {{ pip_executable }}
register: pip_installed
changed_when: false
ignore_errors: true
- name: Install pip
shell: >
wget -qO- https://raw.github.com/pypa/pip/master/contrib/get-pip.py | {{ python_executable }}
when: pip_installed | failed
package {
[
"python${version}",
"python${version}-dev"
]:
}
-> exec { "wget -qO- https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python${version}":
path => ['/usr/bin', '/bin'],
unless => "which pip 2>&1 1>/dev/null"
}
- name: Insall uWSGI
pip: >
executable={{ pip_executable }}
name=uwsgi
state=present
- name: Install Upstart script for uWSGI Emperor
template: src=uwsgi.conf.j2 dest=/etc/init/uwsgi.conf
- name: Create uWSGI Emperor configuration directory
file: >
path=/etc/uwsgi/vassals/
state=directory recurse=yes
- name: Create vassal configuration
template: >
src=vassal.ini.j2
dest=/etc/uwsgi/vassals/{{ uwsgi_vassal_name }}.ini
notify: restart uwsgi
- name: Start uWSGI Emperor
service: name=uwsgi state=started enabled=yes
package { 'uwsgi':
provider => 'pip',
require => Package['build-essential']
}
file {
'/etc/init/uwsgi.conf':
source => 'puppet:///modules/uwsgi/uwsgi.conf';
['/etc/uwsgi', '/etc/uwsgi/vassals']:
ensure => directory;
"/etc/uwsgi/vassals/${vassal_name}.ini":
content => template('uwsgi/vassal.ini.erb'),
notify => Service['uwsgi'];
}
service { 'uwsgi':
ensure => running,
enable => true,
require => [Package['uwsgi'], File['/etc/init/uwsgi.conf']]
}
- name: 'Add PPA for stable releases'
apt_repository:
repo='ppa:nginx/stable'
update_cache=true
- name: 'Install packages'
apt:
pkg=nginx
state=latest
apt::ppa { 'ppa:nginx/stable': }
-> package { 'nginx':
ensure => latest
}
- name: Create site configuration
template: >
src=site.conf.j2
dest=/etc/nginx/sites-available/{{ nginx_site_name }}
notify: restart nginx
- name: Disable default site
file: >
path=/etc/nginx/sites-enabled/default
state=absent
notify: restart nginx
- name: Enable custom site
file: >
path=/etc/nginx/sites-enabled/{{ nginx_site_name }}
src=/etc/nginx/sites-available/{{ nginx_site_name }}
state=link
notify: restart nginx
file {
'/etc/nginx/sites-enabled/default':
require => Package['nginx'],
notify => Service['nginx'],
ensure => absent;
"/etc/nginx/sites-enabled/${site_name}":
require => Package['nginx'],
notify => Service['nginx'],
ensure => link,
target => "/etc/nginx/sites-available/${site_name}";
"/etc/nginx/sites-available/${site_name}":
require => Package['nginx'],
notify => Service['nginx'],
content => template('nginx/site.conf.erb')
}
- name: Create site configuration
template: >
src=site.conf.j2
dest=/etc/nginx/sites-available/{{ nginx_site_name }}
notify: restart nginx
- name: Disable default site
file: >
path=/etc/nginx/sites-enabled/default
state=absent
notify: restart nginx
- name: Enable custom site
file: >
path=/etc/nginx/sites-enabled/{{ nginx_site_name }}
src=/etc/nginx/sites-available/{{ nginx_site_name }}
state=link
notify: restart nginx
file {
'/etc/nginx/sites-enabled/default':
ensure => absent;
"/etc/nginx/sites-enabled/${site_name}":
ensure => link,
target => "/etc/nginx/sites-available/${site_name}";
"/etc/nginx/sites-available/${site_name}":
content => template('nginx/site.conf.erb')
}
File {
require => Package['nginx'],
notify => Service['nginx']
}
- name: Start nginx
service: >
name=nginx
state=started
enabled=yes
service { 'nginx':
ensure => running,
enable => true,
require => Package['nginx']
}
roles/nginx/defaults/main.yml
group_vars/webservers
inventory/servers.ini
Modules (Amazon, DO)
Local Facts
Playbook
Environment
Command-line
Hiera
Facts
Environment
Global Variables?
Libraries / Repositories with re-usable code
Нож с две остриета.
Ще отнеме много време да се направи.
Не е моя работа, има си devops, да се оправят.
Ще си ползвам Heroku-то, там всичко работи.