ืืคื ื ืืื ืื ืจื ืืืืชื ืฆืจืื ืืืชืื ืืื ืกืคืจื ืืฉืืง ืฉื Ansible ืืื ืืืืื ืืช ืืฉืจืช ืืคืจืืกืช ืืืฉืื Rails. ืืืืืคื ืืคืชืืข, ืื ืืฆืืชื ืืืจืื ืคืฉืื ืฉืื ืืืจ ืฉืื. ืื ืจืฆืืชื ืืืขืชืืง ืกืคืจ ืืฉืืง ืฉื ืืืฉืื ืืืจ ืืื ืืืืื ืื ืงืืจื, ืืืกืืคื ืฉื ืืืจ ืืืืชื ืฆืจืื ืืงืจืื ืืช ืืชืืขืื, ืืืกืืฃ ืืื ืืขืฆืื. ืืืื ืื ื ืืืื ืืขืืืจ ืืืืฉืื ืืืืืฅ ืืช ืืชืืืื ืืื ืืขืืจืช ืืืืืจ ืืื.
ืืืืจ ืืจืืฉืื ืฉืฆืจืื ืืืืื ืืื ืฉ-ansible ืืกืคืงืช ืื ืืืฉืง ื ืื ืืืืฆืืข ืจืฉืืื ืืืืืจืช ืืจืืฉ ืฉื ืคืขืืืืช ืืฉืจืช(ืื) ืืจืืืงืื ืืืืฆืขืืช SSH. ืืื ืืื ืงืกื, ืืชื ืื ืืืื ืืืชืงืื ืชืืกืฃ ืืืงืื ืืคืก ืคืจืืกืช ืืื ืืฉืืชื ืฉื ืืืืฉืื ืฉืื ืขื docker, ื ืืืืจ ืืขืื ืืืจืื ืืืืื ืืืืฅ ืืงืืคืกื. ืืื ืืืชืื ืกืคืจ ืืฉืืง, ืขืืื ืืืขืช ืื ืืืืืง ืืชื ืจืืฆื ืืขืฉืืช ืืืื ืืขืฉืืช ืืืช. ืื ืืกืืื ืฉืื ื ืื ืืจืืฆื ืขื ืกืคืจื ืืฉืืง ืืืื ืื ื-GitHub, ืื ืืืืจืื ืืื: "ืืขืชืง ืืืจืฅ, ืื ืืขืืื."
ืื ืฉืื ืื ื ืฆืจืืืื?
ืืคื ืฉืืืจ ืืืจืชื, ืืื ืืืชืื ืกืคืจ ืืฉืืง ืืชื ืฆืจืื ืืืขืช ืื ืืชื ืจืืฆื ืืขืฉืืช ืืืื ืืขืฉืืช ืืช ืื. ืืืื ื ืืืื ืื ืื ืื ื ืฆืจืืืื. ืขืืืจ ืืืฉืื Rails ื ืฆืืจื ืืกืคืจ ืืืืืืช ืืขืจืืช: nginx, postgresql (redis ืืื'). ืื ืืกืฃ, ืื ืื ื ืฆืจืืืื ืืจืกื ืกืคืฆืืคืืช ืฉื ืืืื. ืขืืืฃ ืืืชืงืื ืืืชื ืืจื rbenv (rvm, asdf...). ืืืคืขืื ืืช ืื ืื ืืืฉืชืืฉ ืฉืืจืฉ ืื ืชืืื ืจืขืืื ืจืข, ืื ืืชื ืฆืจืื ืืืฆืืจ ืืฉืชืืฉ ื ืคืจื ืืืืืืืจ ืืช ืืืืืืืช ืฉืื. ืืืืจ ืืื, ืขืืื ืืืขืืืช ืืช ืืงืื ืฉืื ื ืืฉืจืช, ืืืขืชืืง ืืช ืืืืืจืืช ืขืืืจ nginx, postgres ืืื' ืืืืชืืื ืืช ืื ืืฉืืจืืชืื ืืืื.
ืืชืืฆืื ืืื, ืจืฆืฃ ืืคืขืืืืช ืืื ืืืืงืื:
- ืืชืืืจ ืืฉืืจืฉ
- ืืืชืงืื ืืืืืืช ืืขืจืืช
- ืืืฆืืจ ืืฉืชืืฉ ืืืฉ, ืืืืืืจ ืืืืืืช, ืืคืชื ssh
- ืืืืจ ืืืืืืช ืืขืจืืช (nginx ืืื') ืืืคืขื ืืืชื
- ืื ื ืืืฆืจืื ืืฉืชืืฉ ืืืกื ืื ืชืื ืื (ื ืืชื ืืืฆืืจ ืืื ืืกื ื ืชืื ืื)
- ืืชืืืจ ืืืฉืชืืฉ ืืืฉ
- ืืชืงื rbenv ื-ruby
- ืืชืงื ืช ืืืื ืืืจ
- ืืขืืืช ืงืื ืืืคืืืงืฆืื
- ืืคืขืืช ืฉืจืช Puma
ืืชืจ ืขื ืื, ื ืืชื ืืืฆืข ืืช ืืฉืืืื ืืืืจืื ืื ืืืืฆืขืืช capistrano, ืืคืืืช ืืืืฅ ืืงืืคืกื ืืื ืืืื ืืืขืชืืง ืงืื ืืชืื ืกืคืจืืืช ืฉืืจืืจ, ืืืืืืฃ ืืช ืืืจืกื ืขื ืกืืืืื ืง ืืืืจ ืคืจืืกื ืืืฆืืืช, ืืืขืชืืง ืืืืจืืช ืืกืคืจืืื ืืฉืืชืคืช, ืืืคืขืื ืืืืฉ ืืช puma ืืื'. ืื ืื ืืืื ืืืืขืฉืืช ืืืืฆืขืืช Ansible, ืืื ืืื?
ืืื ื ืืงืืืฅ
ืืื ืกืืื ืืฉ ืงืคืื
ืกืคืจ ืืฉืืง ืคืฉืื
Playbook ืืื ืงืืืฅ yml ืฉืืืืฆืขืืช ืชืืืืจ ืืืืื, ืืชืืจ ืื Ansible ืฆืจืื ืืขืฉืืช ืืืืฆื. ืืืื ื ืืฆืืจ ืืช ืกืคืจ ืืืฉืืงืื ืืจืืฉืื ืฉืื ืขืืฉื ืืืื:
---
- name: Simple playbook
hosts: all
ืืื ืื ืื ื ืคืฉืื ืืืืจืื ืฉืกืคืจ ืืืฉืืงืื ืฉืื ื ื ืงืจื Simple Playbook
ืืื ืืฉ ืืืคืขืื ืืช ืชืืื ื ืขืืืจ ืื ืืืืจืืื. ืื ืื ื ืืืืืื ืืฉืืืจ ืืืชื ืืกืคืจืืื /ansible ืขื ืืฉื playbook.yml
ืืชื ืกื ืืืจืืฅ:
ansible-playbook ./playbook.yml
PLAY [Simple Playbook] ************************************************************************************************************************************
skipping: no hosts matched
Ansible ืืืืจ ืฉืืื ืื ืืืืจ ืืืจืืื ืฉืชืืืืื ืืจืฉืืืช ืืื. ืื ืืืืืื ืืืืืช ืจืฉืืืื ืืกืคืืืฉื
ืืืื ื ืืฆืืจ ืืืชื ืืืืชื ืกืคืจืืื ืืคืฉืจืืช:
123.123.123.123
ืื ืื ื ืคืฉืื ืืฆืืื ืื ืืช ืืืืจื (ืืืืคื ืืืืืืื ืืืืจื ืฉื ื-VPS ืฉืื ื ืืืืืงื, ืื ืฉืืชื ืืืื ืืจืฉืื localhost) ืื ืฉืืืจ ืืืชื ืชืืช ืืฉื inventory
.
ืืชื ืืืื ืื ืกืืช ืืืจืืฅ ืื ืกible ืขื ืงืืืฅ ืืฆืื:
ansible-playbook ./playbook.yml -i inventory
PLAY [Simple Playbook] ************************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************************
PLAY RECAP ************************************************************************************************************************************
ืื ืืฉ ืื ืืืฉืช ssh ืืืืจื ืฉืฆืืื, ืืื ืื ืกืืื ืชืชืืืจ ืืชืืกืืฃ ืืืืข ืขื ืืืขืจืืช ืืืจืืืงืช. (ืืจืืจืช ืืืื TASK [ืืืกืืฃ ืขืืืืืช]) ืฉืืืืจืื ืืื ืืืชื ืืื ืงืฆืจ ืขื ืืืืฆืืข (PLAY RECAP).
ืืืจืืจืช ืืืื, ืืืืืืจ ืืฉืชืืฉ ืืฉื ืืืฉืชืืฉ ืฉืชืืชืื ืืชื ืืืืืจ ืืืขืจืืช. ืกืืืจ ืืื ืื ืฉืื ืื ืืืื ืขื ืืืืจื. ืืงืืืฅ Playbook, ืืชื ืืืื ืืฆืืื ืืืืื ืืฉืชืืฉ ืืืฉืชืืฉ ืืื ืืืชืืืจ ืืืืฆืขืืช ืืื ืืื remote_user. ืืื ืื, ืืืืข ืขื ืืขืจืืช ืืจืืืงืช ืขืฉืื ืืืืืช ืืืืชืจ ืขืืืจื, ืืืื ืืืืื ืืื ืืืืกืืฃ. ื ืืชื ืืืฉืืืช ืืฉืืื ืื ืื:
---
- name: Simple playbook
hosts: all
remote_user: root
become: true
gather_facts: no
ื ืกื ืืืคืขืื ืฉืื ืืช ืกืคืจ ืืืคืขืื ืืืื ืฉืืืืืืจ ืคืืขื. (ืื ืฆืืื ืช ืืช ืืฉืชืืฉ ืืฉืืจืฉ, ืขืืื ืืฆืืื ืื ืืช ืืื ืืื word: true ืขื ืื ืช ืืืืืช ืืืืืืืช ืืืืืจืืช. ืืคื ืฉืืชืื ืืชืืขืื: become set to โtrueโ/โyesโ to activate privilege escalation.
ืืืจืืช ืฉืื ืืืืจื ืืจืืจ ืืื).
ืืืื ืชืงืื ืฉืืืื ืฉื ืืจืื ืืืื ืืขืืืื ืฉ-ansible ืื ืืืื ืืงืืืข ืืช ืืืชืืจืืื ืฉื Python, ืืื ืชืืื ืืฆืืื ืืืช ืืืืคื ืืื ื:
ansible_python_interpreter: /usr/bin/python3
ืืชื ืืืื ืืืืืช ืืืื ืืฉ ืื python ืขื ืืคืงืืื whereis python
.
ืืชืงื ืช ืืืืืืช ืืขืจืืช
ืืืคืฆื ืืกืื ืืจืืืช ืฉื Ansible ืืืืืช ืืืืืืื ืจืืื ืืขืืืื ืขื ืืืืืืช ืืขืจืืช ืฉืื ืืช, ืื ืฉืื ื ืฆืืจื ืืืชืื ืกืงืจืืคืืื ืฉื bash ืืื ืกืืื ืฉืืื. ืืขืช ืื ื ืืงืืงืื ืืืื ืืืืืืืืื ืืืื ืืื ืืขืืื ืืช ืืืขืจืืช ืืืืชืงืื ืืืืืืช ืืขืจืืช. ืืฉ ืื ืืืืื ืื ืืื ืืงืก ื-VPS ืฉืื, ืื ืืื ืืืชืงืื ืืืืืืช ืื ื ืืฉืชืืฉ apt-get
ะธ
ืืืื ื ืฉืืื ืืช ืกืคืจ ืืืฉืืงืื ืฉืื ื ืขื ืืืฉืืืืช ืืจืืฉืื ืืช:
---
- name: Simple playbook
hosts: all
remote_user: root
become: true
gather_facts: no
tasks:
- name: Update system
apt: update_cache=yes
- name: Install system dependencies
apt:
name: git,nginx,redis,postgresql,postgresql-contrib
state: present
ืืฉืืื ืืื ืืืืืง ืืืฉืืื ืฉ-Ansible ืชืืฆืข ืืฉืจืชืื ืืจืืืงืื. ืื ื ื ืืชื ืื ืืืฉืืื ืฉื ืืื ืฉื ืืื ืืขืงืื ืืืจ ืืืฆืืขื ืืืืื. ืืื ืื ื ืืชืืจืื, ืืืืฆืขืืช ืืชืืืืจ ืฉื ืืืืื ืกืคืฆืืคื, ืื ืืื ืฆืจืื ืืขืฉืืช. ืืืงืจื ืืื apt: update_cache=yes
- ืืืืจ ืืขืืื ืืืืืืช ืืขืจืืช ืืืืฆืขืืช ืืืืื apt. ืืคืงืืื ืืฉื ืืื ืงืฆืช ืืืชืจ ืืกืืืืช. ืื ื ืืขืืืจืื ืจืฉืืื ืฉื ืืืืืืช ืืืืืื apt ืืืืืจืื ืฉืื state
ืฆืจืื ืืืคืื present
, ืืืืืจ, ืื ื ืืืืจืื ืืืชืงืื ืืช ืืืืืืืช ืืืื. ืืืืคื ืืืื, ืื ื ืืืืืื ืืืืจ ืืื ืืืืืง ืืืชื, ืื ืืขืืื ืืืชื ืคืฉืื ืขื ืืื ืฉืื ืื state
. ืฉืืื ืื ืฉืืื ืฉ-rails ืืขืืื ืขื postgresql ืื ืื ื ืฆืจืืืื ืืช ืืืืืช postgresql-contrib, ืืืชื ืื ื ืืชืงืื ืื ืืขืช. ืฉืื, ืืชื ืฆืจืื ืืืขืช ืืืขืฉืืช ืืช ืื; ืื ืกืืื ืืขืฆืื ืื ืืขืฉื ืืืช.
ื ืกื ืืืคืขืื ืฉืื ืืช ืกืคืจ ืืืคืขืื ืืืืืง ืฉืืืืืืืช ืืืชืงื ืืช.
ืืฆืืจืช ืืฉืชืืฉืื ืืืฉืื.
ืืขืืืื ืขื ืืฉืชืืฉืื, ื-Ansible ืืฉ ืื ืืืืื - ืืฉืชืืฉ. ืืืื ื ืืกืืฃ ืขืื ืืฉืืื ืืืช (ืืืืืชื ืืช ืืืืงืื ืืืืืขืื ืืืจ ืืกืคืจ ืืืฉืืง ืืืืืจื ืืืขืจืืช ืืื ืื ืืืขืชืืง ืืืชื ืืืืจื ืืื ืคืขื):
---
- name: Simple playbook
# ...
tasks:
# ...
- name: Add a new user
user:
name: my_user
shell: /bin/bash
password: "{{ 123qweasd | password_hash('sha512') }}"
ืื ื ืืืฆืจืื ืืฉืชืืฉ ืืืฉ, ืืืืืจืื ืขืืืจื ืชืื ืืช ืืกืืกืื. ืืื ืื ืื ื ื ืชืงืืื ืืืื ืืขืืืช. ืื ืื ืฉืืืช ืืืฉืชืืฉ ืฆืจืืืื ืืืืืช ืฉืื ืื ืขืืืจ ืืืจืืื ืฉืื ืื? ืืืืกืื ืืกืืกืื ืืืงืกื ืืจืืจ ืืกืคืจ ืืืฉืืงืื ืืื ืจืขืืื ืจืข ืืืื. ืืชืืจ ืืชืืื, ื ืื ืืก ืืช ืฉื ืืืฉืชืืฉ ืืืกืืกืื ืืืฉืชื ืื ืืืงืจืืช ืกืืฃ ืืืืืจ ืืจืื ืืืฆื ืืืฆืคืื ืืช ืืกืืกืื.
---
- name: Simple playbook
# ...
tasks:
# ...
- name: Add a new user
user:
name: "{{ user }}"
shell: /bin/bash
password: "{{ user_password | password_hash('sha512') }}"
ืืฉืชื ืื ืืืืืจืื ืืกืคืจื ืืฉืืง ืืืืฆืขืืช ืคืืื ืืชืืืชืืช ืืคืืื.
ื ืฆืืื ืืช ืขืจืื ืืืฉืชื ืื ืืงืืืฅ ืืืืื:
123.123.123.123
[all:vars]
user=my_user
user_password=123qweasd
ืฉืืื ืื ืืื ืืื [all:vars]
- ืื ืืืืจ ืฉืืืืฉ ืืื ืฉื ืืืงืกื ืืื ืืฉืชื ืื (vars) ืืื ืืฉืืืื ืขื ืื ืืืืจืืื (ืืืื).
ืื ืืขืืฆืื ืืขื ืืื "{{ user_password | password_hash('sha512') }}"
. ืืขื ืืื ืืื ืฉ-ansible ืื ืืชืงืื ืืช ืืืฉืชืืฉ ืืจื user_add
ืืื ืฉืืืืช ืขืืฉื ืืช ืื ืืื ืืช. ืืื ืฉืืืจ ืืช ืื ืื ืชืื ืื ืืฉืืจืืช, ืืืื ืื ืื ื ืืืืืื ืื ืืืืืจ ืืช ืืกืืกืื ื-hash ืืจืืฉ, ืืื ืื ืฉืืคืงืืื ืืื ืขืืฉื.
ืืืื ื ืืกืืฃ ืืช ืืืฉืชืืฉ ืฉืื ื ืืงืืืฆืช sudo. ืขื ืืืช, ืืคื ื ืื ืขืืื ื ืืืืื ืฉืงืืืืช ืงืืืฆื ืืื ืื ืืฃ ืืื ืื ืืขืฉื ืืืช ืขืืืจื ื:
---
- name: Simple playbook
# ...
tasks:
# ...
- name: Ensure a 'sudo' group
group:
name: sudo
state: present
- name: Add a new user
user:
name: "{{ user }}"
shell: /bin/bash
password: "{{ user_password | password_hash('sha512') }}"
groups: "sudo"
ืืื ืื ืคืฉืื, ืืฉ ืื ื ืื ืืืืื ืงืืืฆืชื ืืืฆืืจืช ืงืืืฆืืช, ืขื ืชืืืืจ ืืืื ืืืื ื-apt. ืื ืื ืืกืคืืง ืืื ืืจืฉืื ืืช ืืงืืืฆื ืืื ืืืฉืชืืฉ (groups: "sudo"
).
ืื ืื ืฉืืืืฉื ืืืืกืืฃ ืืคืชื ssh ืืืฉืชืืฉ ืื ืืื ืฉื ืืื ืืืืื ืก ืืืืฆืขืืชื ืืื ืกืืกืื:
---
- name: Simple playbook
# ...
tasks:
# ...
- name: Ensure a 'sudo' group
group:
name: sudo
state: present
- name: Add a new user
user:
name: "{{ user }}"
shell: /bin/bash
password: "{{ user_password | password_hash('sha512') }}"
groups: "sudo"
- name: Deploy SSH Key
authorized_key:
user: "{{ user }}"
key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
state: present
ืืืงืจื ืื, ืืขืืฆืื ืืขื ืืื "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
- ืืื ืืขืชืืง ืืช ืชืืื ืืงืืืฅ id_rsa.pub (ืืืชืื ืฉืืฉื ืฉืื ืฉืื ื), ืืืืืจ, ืืืืง ืืฆืืืืจื ืฉื ืืคืชื ssh ืืืขืื ืืืชื ืืจืฉืืืช ืืืคืชืืืช ืืืืจืฉืื ืขืืืจ ืืืฉืชืืฉ ืืฉืจืช.
ืชืคืงืืืื
ืืช ืื ืฉืืืฉ ืืืฉืืืืช ืืืฆืืจืช ืฉืืืืฉ ื ืืชื ืืงืืืช ืืกืืื ืืงืืืฆื ืืืช ืฉื ืืฉืืืืช, ืืืืื ืืืืกื ืงืืืฆื ืื ืื ืคืจื ืืืืฉืืง ืืจืืฉื ืืื ืฉืืื ืื ืชืืื ืืื. ืืืืจื ืื, Ansible ืืฉ
ืืคื ืืื ื ืืงืืฆืื ืฉืฆืืื ืืืชืืื, ืืฉ ืืืงื ืชืคืงืืืื ืืกืคืจืืืช ืชืคืงืืืื ื ืคืจืืช, ืืื ืชืคืงืื ืืฉ ืกืคืจืื ื ืคืจืืช ืืืืชื ืฉื, ืืชืื ืกืคืจืืืช ืืืฉืืืืช, ืืงืืฆืื, ืืชืื ืืืช ืืื'.
ืืืื ื ืืฆืืจ ืืื ื ืงืืฆืื: ./ansible/roles/user/tasks/main.yml
(main ืืื ืืงืืืฅ ืืจืืฉื ืฉืืืืขื ืืืืืฆืข ืืืฉืจ ืชืคืงืื ืืืืืจ ื-Playbook; ื ืืชื ืืืืจ ืืืื ืงืืฆื ืชืคืงืืืื ืืืจืื). ืืขืช ืชืืื ืืืขืืืจ ืืช ืื ืืืฉืืืืช ืืงืฉืืจืืช ืืืฉืชืืฉ ืืงืืืฅ ืืื:
# Create user and add him to groups
- name: Ensure a 'sudo' group
group:
name: sudo
state: present
- name: Add a new user
user:
name: "{{ user }}"
shell: /bin/bash
password: "{{ user_password | password_hash('sha512') }}"
groups: "sudo"
- name: Deploy SSH Key
authorized_key:
user: "{{ user }}"
key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
state: present
ืืกืคืจ ืืืฉืืงืื ืืจืืฉื, ืขืืื ืืฆืืื ืืืฉืชืืฉ ืืชืคืงืื ืืืฉืชืืฉ:
---
- name: Simple playbook
hosts: all
remote_user: root
gather_facts: no
tasks:
- name: Update system
apt: update_cache=yes
- name: Install system dependencies
apt:
name: git,nginx,redis,postgresql,postgresql-contrib
state: present
roles:
- user
ืืื ืื, ืื ืขืฉืื ืืืืืช ืืืืื ื ืืขืืื ืืช ืืืขืจืืช ืืคื ื ืื ืฉืืจ ืืืฉืืืืช; ืืฉื ืื, ืืชื ืืืื ืืฉื ืืช ืืช ืฉื ืืืืืง tasks
ืฉืื ืื ืืืืืจืื ื pre_tasks
.
ืืืืจืช nginx
ืืืจ ืืืืจ ืืืืืช ืื ื Nginx ืืืชืงื; ืขืืื ื ืืืืืืจ ืืืชื ืืืืคืขืื ืืืชื. ืืืื ื ืขืฉื ืืช ืื ืืื ืืชืคืงืื. ืืืื ื ืืฆืืจ ืืื ื ืงืืฆืื:
- ansible
- roles
- nginx
- files
- tasks
- main.yml
- templates
ืขืืฉืื ืื ืื ื ืฆืจืืืื ืงืืฆืื ืืชืื ืืืช. ืืืืื ืืื ืืื ืืื ืฉ-ansible ืืขืชืืง ืืช ืืงืืฆืื ืืฉืืจืืช, ืืคื ืฉืื. ืืชืื ืืืช ืืืืืืช ืืืืืช ืขื ืกืืืืช j2 ืืื ืืืืืืช ืืืฉืชืืฉ ืืขืจืื ืืฉืชื ืื ืืืืฆืขืืช ืืืชื ืกืืืจืื ืืชืืืชืืื ืืคืืืื.
ืืืื ื ืคืขืื ืืช nginx ืคื ืืื main.yml
ืงืึนืึถืฅ. ืืฉืืื ืื ืืฉ ืื ื ืืืืื systemd:
# Copy nginx configs and start it
- name: enable service nginx and start
systemd:
name: nginx
state: started
enabled: yes
ืืื ืื ืื ื ืื ืจืง ืืืืจืื ืฉ-nginx ืืืื ืืืืืช ืืืคืขื (ืืืืืจ, ืื ืื ื ืืคืขืืืื ืืืชื), ืืื ืื ืื ื ืืื ืืืืจืื ืฉืืื ืืืื ืืืืืช ืืืคืขื.
ืืขืช ื ืขืชืืง ืืช ืงืืฆื ืืชืฆืืจื:
# Copy nginx configs and start it
- name: enable service nginx and start
systemd:
name: nginx
state: started
enabled: yes
- name: Copy the nginx.conf
copy:
src: nginx.conf
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'
backup: yes
- name: Copy template my_app.conf
template:
src: my_app_conf.j2
dest: /etc/nginx/sites-available/my_app.conf
owner: root
group: root
mode: '0644'
ืื ื ืืืฆืจืื ืืช ืงืืืฅ ืืชืฆืืจื ืืจืืฉื ืฉื nginx (ืืชื ืืืื ืืงืืช ืืืชื ืืฉืืจืืช ืืืฉืจืช, ืื ืืืชืื ืืืชื ืืขืฆืื). ืืื ืืช ืงืืืฅ ืืชืฆืืจื ืฉื ืืืคืืืงืฆืื ืฉืื ื ืืกืคืจืืืช sites_available (ืื ืื ืืืจืื ืืื ืฉืืืืฉื). ืืืงืจื ืืจืืฉืื, ืื ื ืืฉืชืืฉืื ืืืืืื ืืืขืชืงื ืืื ืืืขืชืืง ืงืืฆืื (ืืงืืืฅ ืืืื ืืืืืช ื- /ansible/roles/nginx/files/nginx.conf
). ืืฉื ืืื, ืื ื ืืขืชืืงืื ืืช ืืชืื ืืช, ืืืืืืคืื ืืช ืขืจืื ืืืฉืชื ืื. ืืชืื ืืช ืฆืจืืื ืืืืืช ื /ansible/roles/nginx/templates/my_app.j2
). ืืื ืขืฉืื ืืืืจืืืช ืืขืจื ืื:
upstream {{ app_name }} {
server unix:{{ app_path }}/shared/tmp/sockets/puma.sock;
}
server {
listen 80;
server_name {{ server_name }} {{ inventory_hostname }};
root {{ app_path }}/current/public;
try_files $uri/index.html $uri.html $uri @{{ app_name }};
....
}
ืฉืืื ืื ืืชืืกืคืืช {{ app_name }}
, {{ app_path }}
, {{ server_name }}
, {{ inventory_hostname }}
- ืืื ืื ืืืฉืชื ืื ืฉืืขืจืืื ืฉืืื Ansible ืืืืืคื ืืชืื ืืช ืืคื ื ืืืขืชืงื. ืื ืฉืืืืฉื ืื ืืชื ืืฉืชืืฉ ืืกืคืจ ืืฉืืง ืขืืืจ ืงืืืฆืืช ืฉืื ืืช ืฉื ืืืจืืื. ืืืืืื, ืื ื ืืืืืื ืืืืกืืฃ ืืช ืงืืืฅ ืืืืื ืฉืื ื:
[production]
123.123.123.123
[staging]
231.231.231.231
[all:vars]
user=my_user
user_password=123qweasd
[production:vars]
server_name=production
app_path=/home/www/my_app
app_name=my_app
[staging:vars]
server_name=staging
app_path=/home/www/my_stage
app_name=my_stage_app
ืื ื ืฉืืง ืืขืช ืืช ืกืคืจ ืืืฉืืงืื ืฉืื ื, ืืื ืืืฆืข ืืช ืืืฉืืืืช ืฉืฆืืื ื ืขืืืจ ืฉื ื ืืืืจืืื. ืื ืืื ืขื ืืืช, ืขืืืจ ืืืจื ืืืืื, ืืืฉืชื ืื ืืืื ืฉืื ืื ืืืื ืฉื ืืืืฆืืจ, ืืื ืจืง ืืชืคืงืืืื ืืืกืคืจื ืืฉืืง, ืืื ืื ืืชืฆืืจืืช nginx. {{ inventory_hostname }}
ืืื ืฆืืจื ืืฆืืื ืืงืืืฅ ืืืืื - ืื
ืื ืืชื ืจืืฆื ืฉืืืื ืื ืงืืืฅ ืืืื ืขืืืจ ืืกืคืจ ืืืจืืื, ืืื ืืืคืขืื ืจืง ืขืืืจ ืงืืืฆื ืืืช, ื ืืชื ืืขืฉืืช ืืืช ืขื ืืคืงืืื ืืืื:
ansible-playbook -i inventory ./playbook.yml -l "staging"
ืืคืฉืจืืช ื ืืกืคืช ืืื ืงืืฆื ืืืื ื ืคืจืืื ืืงืืืฆืืช ืฉืื ืืช. ืื ืฉืืชื ืืืื ืืฉืื ืืช ืฉืชื ืืืืฉืืช ืื ืืฉ ืื ืืืจืืื ืจืืื ืืฉืื ืื.
ืืื ื ืืืืจ ืืืืืจืช nginx. ืืืืจ ืืขืชืงืช ืงืืืฆื ืืชืฆืืจื, ืขืืื ื ืืืฆืืจ ืงืืฉืืจ ืกืืืื ื-sitest_enabled ืื my_app.conf ื-sites_available. ืืืคืขื ืืืืฉ ืืช nginx.
... # old code in mail.yml
- name: Create symlink to sites-enabled
file:
src: /etc/nginx/sites-available/my_app.conf
dest: /etc/nginx/sites-enabled/my_app.conf
state: link
- name: restart nginx
service:
name: nginx
state: restarted
ืืื ืคืฉืื ืืื - ืฉืื ืืืืืืื ืืคืฉืจืืื ืขื ืชืืืืจ ืกืื ืืจืื ืืืื. ืืื ืืฉ ื ืงืืื ืืืช. ืืื ืืขื ืืืคืขืื ืืืืฉ ืืช nginx ืืื ืคืขื. ืฉืืชื ืื ืฉืื ืื ื ืื ืืืชืืื ืคืงืืืืช ืืื: "ืขืฉื ืืช ืื ืืื", ืืชืืืืจ ื ืจืื ืืืชืจ ืืื "ืื ืฆืจืื ืืืืืช ืืืฆื ืืื". ืืืจืื ืื ืืืืืง ืืื ansible ืขืืื. ืื ืืงืืืฆื ืืืจ ืงืืืืช, ืื ืฉืืืืืช ืืืขืจืืช ืืืจ ืืืชืงื ืช, ืืื ืื ืกืืื ืชืืืืง ืืืช ืืชืืื ืขื ืืืฉืืื. ืืื ืื, ืงืืฆืื ืื ืืืขืชืงื ืื ืื ืชืืืืื ืืืืืืื ืืื ืฉืืืจ ื ืืฆื ืืฉืจืช. ื ืืื ืื ืฆื ืืืช ืืืืคืขืื ืืืืฉ ืืช nginx ืจืง ืื ืงืืฆื ืืชืฆืืจื ืฉืื ื. ืืฉ ืื ืืืืช ืจืืฉืื ืืื:
# Copy nginx configs and start it
- name: enable service nginx and start
systemd:
name: nginx
state: started
enabled: yes
- name: Copy the nginx.conf
copy:
src: nginx.conf
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'
backup: yes
register: restart_nginx
- name: Copy template my_app.conf
template:
src: my_app_conf.j2
dest: /etc/nginx/sites-available/my_app.conf
owner: root
group: root
mode: '0644'
register: restart_nginx
- name: Create symlink to sites-enabled
file:
src: /etc/nginx/sites-available/my_app.conf
dest: /etc/nginx/sites-enabled/my_app.conf
state: link
- name: restart nginx
service:
name: nginx
state: restarted
when: restart_nginx.changed
ืื ืืฉืชื ื ืืื ืืงืืฆื ืืชืฆืืจื, ืืืขืฉื ืขืืชืง ืืืืฉืชื ื ืืืจืฉื restart_nginx
. ืืจืง ืื ืืืฉืชื ื ืืื ื ืจืฉื, ืืฉืืจืืช ืืืคืขื ืืืืฉ.
ืืืืืื, ืืชื ืฆืจืื ืืืืกืืฃ ืืช ืชืคืงืื nginx ืืกืคืจ ืืืฉืืงืื ืืจืืฉื.
ืืืืจืช postgresql
ืื ืื ื ืฆืจืืืื ืืืคืขืื ืืช postgresql ืืืืฆืขืืช systemd ืืืืชื ืืืคื ืืื ืฉืขืฉืื ื ืขื nginx, ืืื ืืืฆืืจ ืืฉืชืืฉ ืฉืื ื ืฉืชืืฉ ืืื ืืืฉืช ืืืกืืก ืื ืชืื ืื ืืืืกืืก ืื ืชืื ืื ืขืฆืื.
ืืืื ื ืืฆืืจ ืชืคืงืื /ansible/roles/postgresql/tasks/main.yml
:
# Create user in postgresql
- name: enable postgresql and start
systemd:
name: postgresql
state: started
enabled: yes
- name: Create database user
become_user: postgres
postgresql_user:
name: "{{ db_user }}"
password: "{{ db_password }}"
role_attr_flags: SUPERUSER
- name: Create database
become_user: postgres
postgresql_db:
name: "{{ db_name }}"
encoding: UTF-8
owner: "{{ db_user }}"
ืื ืืชืืจ ืืื ืืืืกืืฃ ืืฉืชื ืื ืืืืื, ืื ืืืจ ื ืขืฉื ืืจืื ืคืขืืื, ืืื ืื ืืช ืืชืืืืจ ืฉื ืืืืืืืื postgresql_db ื-postgresql_user. ืืืืข ื ืืกืฃ ื ืืชื ืืืฆืื ืืชืืขืื. ืืื ืืื ืืื ืืขื ืืื ืช ืืื ืืื become_user: postgres
. ืืขืืืื ืืื ืฉืืืจืืจืช ืืืื, ืจืง ืืืฉืชืืฉ postgres ืืฉ ืืืฉื ืืืกื ืื ืชืื ืื postgresql ืืจืง ืืืืคื ืืงืืื. ืื ืืื ืื ืืืคืฉืจืช ืื ื ืืืฆืข ืคืงืืืืช ืืฉื ืืืฉืชืืฉ ืืื (ืื ืืฉ ืื ื ืืืฉื, ืืืืื).
ืืื ืื, ืืืชืื ืฉืืืื ืขืืื ืืืืกืืฃ ืฉืืจื ื-pg_hba.conf ืืื ืืืคืฉืจ ืืืฉืชืืฉ ืืืฉ ืืืฉื ืืืกื ืื ืชืื ืื. ื ืืชื ืืขืฉืืช ืืืช ืืืืชื ืืืคื ืฉืื ืฉืื ืื ื ืืช ืชืฆืืจืช nginx.
ืืืืืื, ืืชื ืฆืจืื ืืืืกืืฃ ืืช ืืชืคืงืื postgresql ืืกืคืจ ืืืฉืืงืื ืืจืืฉื.
ืืชืงื ืช ืจืืื ืืจื rbenv
ื-Ansible ืืื ืืืืืืื ืืขืืืื ืขื rbenv, ืืื ืืื ืืืชืงื ืขื ืืื ืฉืืืื ืืืืจ git. ืืื, ืืขืื ืื ืืืคืืช ืืืืืช ืืื ืื ืกืื ืืจืืืช. ืืืื ื ืืฆืืจ ืื ืชืคืงืื /ansible/roles/ruby_rbenv/main.yml
ืืืืื ื ืชืืื ืืืื ืืืชื:
# Install rbenv and ruby
- name: Install rbenv
become_user: "{{ user }}"
git: repo=https://github.com/rbenv/rbenv.git dest=~/.rbenv
ืื ื ืฉืื ืืฉืชืืฉืื ืืื ืืืืช become_user ืืื ืืขืืื ืชืืช ืืืฉืชืืฉ ืฉืืฆืจื ื ืืืืจืืช ืืื. ืืื rbenv ืืืชืงื ืืกืคืจืืืช ืืืืช ืฉืื, ืืื ืืืืคื ืืืืืื. ืืื ืื ื ืื ืืฉืชืืฉืื ืืืืืื git ืืื ืืฉืืคื ืืช ืืืืืจ, ืชืื ืฆืืื ืจืืคื ื-dest.
ืืืืจ ืืื, ืขืืื ื ืืจืฉืื ืืช rbenv init ื-bashrc ืืืืืกืืฃ ืืช rbenv ื-PATH ืฉื. ืืฉืืื ืื ืืฉ ืื ื ืืช ืืืืื lineinfile:
- name: Add rbenv to PATH
become_user: "{{ user }}"
lineinfile:
path: ~/.bashrc
state: present
line: 'export PATH="${HOME}/.rbenv/bin:${PATH}"'
- name: Add rbenv init to bashrc
become_user: "{{ user }}"
lineinfile:
path: ~/.bashrc
state: present
line: 'eval "$(rbenv init -)"'
ืื ืืชื ืฆืจืื ืืืชืงืื ruby_build:
- name: Install ruby-build
become_user: "{{ user }}"
git: repo=https://github.com/rbenv/ruby-build.git dest=~/.rbenv/plugins/ruby-build
ืืืืกืืฃ ืชืชืงืื ืืืื. ืื ื ืขืฉื ืืืืฆืขืืช rbenv, ืืืืืจ, ืคืฉืื ืขื ืืคืงืืื bash:
- name: Install ruby
become_user: "{{ user }}"
shell: |
export PATH="${HOME}/.rbenv/bin:${PATH}"
eval "$(rbenv init -)"
rbenv install {{ ruby_version }}
args:
executable: /bin/bash
ืื ืื ื ืืืืจืื ืืืื ืคืงืืื ืืืฆืข ืืขื ืื. ืขื ืืืช, ืืื ืื ื ื ืชืงืืื ืืขืืืื ืฉ-ansible ืื ืืจืืฅ ืืช ืืงืื ืืืืื ื-bashrc ืืคื ื ืืคืขืืช ืืคืงืืืืช. ืืืฉืืขืืช ืืื ืฉ-rbenv ืืฆืืจื ืืืืืช ืืืืืจ ืืฉืืจืืช ืืืืชื ืกืงืจืืคื.
ืืืขืื ืืืื ื ืืืขืช ืืืขืืืื ืฉืืคืงืืื ืืขืืคืช ืืื ืืฆื ืื ืงืืืช ืืื ืืคืฉืจืืช. ืืืืืจ, ืื ืชืืื ืืืืงื ืืืืืืืืช ืื ืืจืกื ืื ืฉื ืจืืื ืืืชืงื ืช ืื ืื. ืื ืื ื ืืืืืื ืืขืฉืืช ืืืช ืืขืฆืื ื:
- name: Install ruby
become_user: "{{ user }}"
shell: |
export PATH="${HOME}/.rbenv/bin:${PATH}"
eval "$(rbenv init -)"
if ! rbenv versions | grep -q {{ ruby_version }}
then rbenv install {{ ruby_version }} && rbenv global {{ ruby_version }}
fi
args:
executable: /bin/bash
ืื ืื ืฉื ืืชืจ ืืื ืืืชืงืื bundler:
- name: Install bundler
become_user: "{{ user }}"
shell: |
export PATH="${HOME}/.rbenv/bin:${PATH}"
eval "$(rbenv init -)"
gem install bundler
ืืฉืื, ืืืกืฃ ืืช ืืชืคืงืื ruby_rbenv ืฉืื ื ืืกืคืจ ืืืฉืืงืื ืืจืืฉื.
ืงืืฆืื ืืฉืืชืคืื.
ืืืืคื ืืืื, ื ืืชื ืืื ืืืฉืืื ืืช ืืืืืจื ืืื. ืืืืจ ืืื, ืื ืื ืฉื ืืชืจ ืืื ืืืคืขืื ืืช capistrano ืืืื ืืขืชืืง ืืช ืืงืื ืขืฆืื, ืืฆืืจ ืืช ืืกืคืจืืืช ืืืจืืฉืืช ืืืคืขืื ืืช ืืืคืืืงืฆืื (ืื ืืื ืืืืืจ ื ืืื). ืขื ืืืช, Capistrano ืืืจืฉ ืืขืชืื ืงืจืืืืช ืงืืฆื ืชืฆืืจื ื ืืกืคืื, ืืืื database.yml
ืื .env
ื ืืชื ืืืขืชืืง ืืืชื ืืืืืง ืืื ืงืืฆืื ืืชืื ืืืช ืขืืืจ nginx. ืืฉ ืจืง ืขืืื ืืช ืืืช. ืืคื ื ืืขืชืงืช ืงืืฆืื, ืขืืื ืืืฆืืจ ืขืืืจื ืืื ื ืกืคืจืืืช, ืืฉืื ืืื ืื:
# Copy shared files for deploy
- name: Ensure shared dir
become_user: "{{ user }}"
file:
path: "{{ app_path }}/shared/config"
state: directory
ืื ื ืืฆืืื ืื ืจืง ืกืคืจืืื ืืืช ื-Ansible ืชืืฆืืจ ืืืืืืืืช ืกืคืจืืืช ืื ืืืืืช ืืฆืืจื.
ืืกืคืช ืื ืกืืื
ืืืจ ื ืชืงืื ื ืืขืืืื ืฉืืฉืชื ืื ืืืืืื ืืืืื ื ืชืื ืื ืกืืืืื ืืื ืกืืกืืช ืืืฉืชืืฉ. ืื ืืฆืจืช .env
ืงืืืฅ ืขืืืจ ืืืงืฉื, ืืื database.yml
ืื ืืืืืื ืืืืืช ืืคืืื ืืืชืจ ื ืชืื ืื ืงืจืืืืื ืืืื. ืื ืืืื ืืื ืืืกืชืืจ ืืืชื ืืขืื ืืื ืกืงืจื ืืืช. ืืืืจื ืื ืืื ืืฉืืฉ
ืืืื ื ืืฆืืจ ืงืืืฅ ืืืฉืชื ืื /ansible/vars/all.yml
(ืืื ื ืืชื ืืืฆืืจ ืงืืฆืื ืฉืื ืื ืขืืืจ ืงืืืฆืืช ืฉืื ืืช ืฉื ืืืจืืื, ืืืืืง ืืื ืืงืืืฅ ืืืืื: production.yml, staging.yml ืืื').
ืืฉ ืืืขืืืจ ืืช ืื ืืืฉืชื ืื ืฉืืืืืื ืืืืืช ืืืฆืคื ืื ืืงืืืฅ ืื ืืืืฆืขืืช ืชืืืืจ yml ืกืื ืืจืื:
# System vars
user_password: 123qweasd
db_password: 123qweasd
# ENV vars
aws_access_key_id: xxxxx
aws_secret_access_key: xxxxxx
aws_bucket: bucket_name
rails_secret_key_base: very_secret_key_base
ืืืืจ ืืื ื ืืชื ืืืฆืคืื ืืช ืืงืืืฅ ืืื ืขื ืืคืงืืื:
ansible-vault encrypt ./vars/all.yml
ืืืืคื ืืืขื, ืืขืช ืืืฆืคื ื, ืชืฆืืจื ืืืืืืจ ืกืืกืื ืืคืขื ืื. ืืชื ืืืื ืืจืืืช ืื ืืืื ืืชืื ืืงืืืฅ ืืืืจ ืงืจืืื ืืคืงืืื ืื.
ืืืืฆืขืืช ansible-vault decrypt
ื ืืชื ืืคืขื ื ืืช ืืงืืืฅ, ืืฉื ืืช ืืืืืจ ืืื ืืืฆืคืื ืฉืื.
ืืชื ืื ืฆืจืื ืืคืขื ื ืืช ืืงืืืฅ ืืื ืืขืืื. ืืชื ืืืืกื ืืืชื ืืืฆืคื ืืืคืขืื ืืช ืกืคืจ ืืืฉืืง ืขื ืืืจืืืื ื --ask-vault-pass
. Ansible ืืืงืฉ ืืช ืืกืืกืื, ืืืืืจ ืืช ืืืฉืชื ืื ืืืืฆืข ืืช ืืืฉืืืืช. ืื ืื ืชืื ืื ืืืฉืืจื ืืืฆืคื ืื.
ืืคืงืืื ืืืืื ืขืืืจ ืืกืคืจ ืงืืืฆืืช ืฉื ืืืจืืื ืืืกืคืช ืืคืฉืจืืช ืชืืจืื ืืขืจื ืื:
ansible-playbook -i inventory ./playbook.yml -l "staging" --ask-vault-pass
ืืื ืื ื ืื ืืชื ืื ืืช ืืืงืกื ืืืื ืฉื ืกืคืจื ืืฉืืง ืืชืคืงืืืื, ืืชืื ืืช ืื ืืขืฆืื. ืื ืื ืกืื ืื ืืื - ืื ืืชื ืื ืืืื ืื ืฆืจืื ืืขืฉืืช, ืื ืื ืื ืืขืฉื ืืช ืื ืืฉืืืื.
ืืงืืจ: www.habr.com