On Github RogueDudes / roguedudes.github.io
Това не е презентация за:
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!"]
…за три реда код.
- 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-то, там всичко работи.
Голяма болка, особено когато скриптът стане 1, 000+ реда spaghetti code.
Idempotence е важен, това в Bash е ръчна задача и трябва вие да я предвидите.
Ако имате вече голямо library, започнете като го автоматизирате, но не оставяйте нещата до там.
Нищо лично, но нямаме опит с него, вероятно е cool.