Rails á¡ááºááá®áá±ážááŸááºážááá¯á¡áá¯á¶ážááŒá¯áááºá¡ááœááºáá¬áá¬ááá¯ááŒááºáááºááẠAnsible playbook á¡áá»á¬ážá¡ááŒá¬ážááá¯áááŒá¬áá±ážáá®ááá±ážáááºááá¯á¡ááºáá²á·áááºá á¡á¶á·ááŒá áá¬áá±á¬ááºážáá¬á ááá¯ážááŸááºážáá²á· á¡ááá·áºááá·áºáááºá áœá²á á¬á¡á¯ááºááᯠáá»áœááºáá±á¬áº ááŸá¬áááœá±á·áá²á·áá«áá°ážá ááŒá áºáá»ááºáá±áá¬ááᯠáá¬ážááááºáá² áááŒá¬ážáá°áá²á· ááŒáááºážá á¬á¡á¯ááºááᯠáá°ážááá°ážáá»ááºáá² áá±á¬ááºáá¯á¶ážááŸá¬áá±á¬á· á á¬ááœááºá á¬áááºážááœá±ááᯠááá¯ááºááá¯ááºáááºááŒá®áž á¡áá¬á¡á¬ážáá¯á¶ážááᯠá á¯áá±á¬ááºážáá²á·ááá«áááºá á€áá±á¬ááºážáá«ážáá¡áá°á¡áá®ááŒáá·áº áá áºá á¯á¶áá áºáŠážá¡á¬áž á€áá¯ááºáááºážá ááºááᯠá¡ááŸáááºááŒáŸáá·áºááẠáá»áœááºá¯ááºáá°áá®áá±ážááá¯ááºáááºá
ááááá¯á¶áž áá¬ážáááºáááá·áºá¡áá»ááºááŸá¬ ansible ááẠááá·áºá¡á¬áž SSH ááŸáá áºááá·áº á¡áá±ážááááºážáá¬áá¬áá áºáá¯áá±á«áºááœáẠááŒáá¯áááºáááºááŸááºáá¬ážáá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá á¬áááºážááᯠáá¯ááºáá±á¬ááºááẠá¡áááºááŒá±áá±á¬ interface ááᯠáá±ážáá±á¬ááºáááºá á€áá±áá¬ááœáẠááŸá±á¬áºáááºááŒááºážáááŸááá«á áááºááẠááááºá¡ááºáá áºáá¯ááᯠááá·áºááœááºážá áááá«á dockerá á á±á¬áá·áºááŒáá·áºááŒááºážááŸáá·áº á¡ááŒá¬ážá¡áá¬áá»á¬ážááŸáá·áºá¡áá° ááá·áºá¡ááºááºáá®áá±ážááŸááºážá á ááºáááºáá»áááºááᯠáá¯áááŒáá·áº á¡áá¯á¶ážááŒá¯ááá¯ááºáááºááŒá áºáááºá ááá±ážá á¬á¡á¯ááºáá áºá¡á¯ááºáá±ážááá¯á·á¡ááœáẠáááºáá¬áá¯ááºáá»ááºááá² á¡ááá¡áá»ááááá«áááºá ááá¯á·ááŒá±á¬áá·áº GitHub á០á¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ ááá±ážá á¬á¡á¯ááºáá»á¬áž ááá¯á·ááá¯áẠ"áááá¹áá°áá°ážááŒá®áž ááœáá·áºáá«á áááºážááẠá¡áá¯ááºáá¯ááºáá«áááºá"
áá«ááá¯á· áá¬ááá¯áá²?
áá»áœááºáá±á¬áºááŒá±á¬áá²á·áááá¯áá² playbook áá±ážááá¯á·á¡ááœáẠáááºáá¬áá¯ááºáá»ááºááá²á á¡á²áá«ááᯠáááºááá¯áá¯ááºáááá²ááá¯áᬠááááá¯á·ááá¯áááºá áá«ááá¯á· áá¬ááá¯áááºááá¯áᬠáá¯á¶ážááŒááºááŒáá¡á±á¬ááºá Rails á¡ááºááá®áá±ážááŸááºážá¡ááœáẠáá»áœááºá¯ááºááá¯á·ááẠnginxá postgresql (redis, etc) áá»á¬ážá áœá¬ááá¯á¡ááºáá«áááºá ááá¯á·á¡ááŒáẠáá»áœááºá¯ááºááá¯á·ááẠááá¹áááŒá¬ážá áá®ážááŒá¬ážáá¬ážááŸááºážáá áºáᯠááá¯á¡ááºáá«áááºá áááºážááᯠrbenv (rvm, asdf...) ááŸáááá·áº ááá·áºááœááºážááẠá¡áá±á¬ááºážáá¯á¶ážááŒá áºáááºá á€á¡áá¬á¡á¬ážáá¯á¶ážááᯠá¡ááŒá áºá¡áá¯á¶ážááŒá¯áá°áá áºáŠážá¡áá±ááŒáá·áº áá¯ááºáá±á¬ááºááŒááºážááẠá¡ááŒá²áááºážááá¯ážááœá¬ážáá±á¬ á¡ááŒá¶á¥á¬ááºáá áºáá¯ááŒá áºáá±á¬ááŒá±á¬áá·áº áááºááẠáá®ážááŒá¬ážá¡áá¯á¶ážááŒá¯áá°áá áºáŠážááᯠáááºáá®ážááŒá®áž áááºážáá¡ááœáá·áºá¡áá±ážáá»á¬ážááᯠáááºááŸááºááẠááá¯á¡ááºáá«áááºá áááºážááŒá®ážáá±á¬ááºá áááºááẠáá»áœááºá¯ááºááá¯á·ááá¯ááºááᯠáá¬áá¬ááá¯á· á¡ááºáá¯ááºáá¯ááºáááºá nginxá postgres á áááºááá¯á·á¡ááœáẠconfigs áá»á¬ážááᯠáá°ážáá°ááŒá®áž á€áááºáá±á¬ááºááŸá¯á¡á¬ážáá¯á¶ážááᯠá áááºááẠááá¯á¡ááºáááºá
ááááºá¡áá±ááŒáá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá á¡á á®á¡á á¥áºááŸá¬ á¡á±á¬ááºáá«á¡ááá¯ááºážááŒá áºáááºá
- root á¡ááŒá áºáááºáá±á¬ááºáá«á
- á áá áºáááºáá±á·áá»áºáá»á¬ážááᯠááá·áºááœááºážáá«á
- á¡áá¯á¶ážááŒá¯áá°á¡áá áºáááºáá®ážáá«á á¡ááœáá·áºá¡áá±ážáá»á¬ážáááºááŸááºáá«á ssh áá±á¬á·
- á áá áºáááºáá±á·áá»áºáá»á¬áž (nginx á áááºááá¯á·) ááᯠconfigure áá¯ááºááŒá®áž áááºážááá¯á·ááᯠrun áá«á
- áá»áœááºá¯ááºááá¯á·ááẠáá±áá¬áá±á·á áºááœáẠá¡áá¯á¶ážááŒá¯áá°áá áºáŠážááᯠáááºáá®ážááẠ(áááºáá»ááºáá»ááºážáá±áá¬áá±á·á áºáá áºáá¯ááᯠáááºáá®ážááá¯ááºáááº)
- á¡áá¯á¶ážááŒá¯áá°á¡áá áºá¡ááŒá Ạá¡áá±á¬áá·áºáááºáá«á
- rbenv ááŸáá·áº ruby ââááᯠinstall áá¯ááºáá«á
- á¡á á¯á¡áá±ážááᯠáááºáááºááŒááºážá
- á¡ááá®áá±ážááŸááºážáá¯ááºááᯠáááºááŒááºážá
- Puma áá¬áá¬ááᯠá áááºáá±áá«áááºá
ááá¯á·á¡ááŒááºá áá±á¬ááºáá¯á¶ážá¡ááá·áºáá»á¬ážááᯠcapistrano áá¯á¶ážááŒá®áž áá¯ááºáá±á¬ááºááá¯ááºáááºá á¡áááºážáá¯á¶áž á¡ááœááºá¡ááœááºážá០áá¯ááºááᯠáá¯ááºááœáŸááºááá·áº áááºážááœáŸááºáá»á¬ážáá²ááá¯á· áá°ážáá°ááá¯ááºáááºá á¡á±á¬ááºááŒááºá áœá¬ ááŒáá·áºáá»ááºááŒá®ážáá±á¬á¡áá«ááœáẠsymlink áá áºáá¯ááŒáá·áº áá¯ááºáá±ááŸá¯ááᯠááŒá±á¬ááºážááá¯ááºáááºá áá»áŸáá±áá¬ážáá±á¬ directory á០configs áá»á¬ážááᯠáá°ážáá°ááá¯ááºáááºá puma ááᯠááŒááºáááºá áááºááŒááºáž á áááºááŒáá·áº ááŒá¯áá¯ááºááá¯ááºáááºá á€á¡áá¬á¡á¬ážáá¯á¶ážááᯠAnsible ááᯠá¡áá¯á¶ážááŒá¯á áá¯ááºáá±á¬ááºááá¯ááºáá±á¬áºáááºáž á¡áááºááŒá±á¬áá·áºáááºážá
ááá¯ááºáááºáá±á¬ááºáá¯á¶
Ansible ááẠáááºážáá»ááºáááºá
ááá¯ážááŸááºážáá±á¬ Playbook
Playbook ááẠá¡áá°ážá¡áá¬ážá¡ááá¯ááá¯á¡áá¯á¶ážááŒá¯á Ansible áá¬áá¯ááºááá·áºáááºááᯠáá±á¬áºááŒááá·áº yml ááá¯ááºáá áºáá¯ááŒá áºáááºá áá¬ááŸááááºááá¯ááºáá²á· ááááá¯á¶áž playbook ááᯠáááºáá®ážááá¯ááºáá¡á±á¬ááºá
---
- name: Simple playbook
hosts: all
áá®áá±áá¬ááŸá¬ áá»áœááºáá±á¬áºááá¯á· ááá¯ážááá¯ážááŸááºážááŸááºážááŒá±á¬ááẠáá»áœááºáá±á¬áºááá¯á·áá²á· playbook ááá¯á·áá±á«áºáá«áááºá Simple Playbook
áááºážá¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠhost á¡á¬ážáá¯á¶ážá¡ááœáẠáá¯ááºáá±á¬ááºááá·áºáááºá áááºážááᯠ/ansible directory ááœáẠáá¬áááºááŒáá·áº ááááºážáááºážááá¯ááºáá«áááºá playbook.yml
ááŒá±ážáááºááŒáá¯ážá
á¬ážáá«
ansible-playbook ./playbook.yml
PLAY [Simple Playbook] ************************************************************************************************************************************
skipping: no hosts matched
Ansible á áááºážááẠá
á¬áááºážá¡á¬ážáá¯á¶ážááŸáá·áº ááá¯ááºáá®áá±á¬ áááºááá·áºá¡áááºááŸááºááá¯áá»áŸ áááááŒá±á¬ááºáž ááŒá±á¬ááŒá¬ážáá²á·áááºá áá°ážáá°ážááŒá¬ážááŒá¬áž á
á¬áááºážááŒá¯á
á¯áá¬ážááááºá
áá°áá®áá±á¬ ansible directory ááœáẠáááºáá®ážááŒáá«á áá¯á·á
123.123.123.123
á€áááºááŸá¬ áá»áœááºá¯ááºááá¯á·ááẠhost ááᯠááá¯ážááá¯ážááŸááºážááŸááºáž áááºááŸááºáá¯á¶ (á¥ááá¬á¡á¬ážááŒáá·áº á
ááºážáááºáááºá¡ááœáẠáá»áœááºá¯ááºááá¯á·á VPS á host ááá¯á·ááá¯áẠlocalhost ááᯠá
á¬áááºážááœááºážááá¯ááºáááº) ááŸáá·áº áááºážááᯠá¡áááºá¡á±á¬ááºááœáẠááááºážáááºážáá«á inventory
.
á
á¬áááºážááá¯ááºáá
áºáá¯ááŒáá·áº ansible ááᯠá
ááºážáá¯á¶ážááá¯ááºáááº-
ansible-playbook ./playbook.yml -i inventory
PLAY [Simple Playbook] ************************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************************
PLAY RECAP ************************************************************************************************************************************
á¡áááºá ááá·áºááœáẠáááºááŸááºáá¬ážáá±á¬ host ááá¯á· ssh áááºáá±á¬ááºááœáá·áºááŸááá«á ansible ááẠá¡áá±ážááááºážá áá áºá¡ááŒá±á¬ááºáž á¡áá»ááºá¡áááºáá»á¬ážááᯠáá»áááºáááºááŒá®áž á á¯áá±á¬ááºážáá«áááºá (áá°áááºáž TASK [á¡áá»ááºá¡áááºá á¯áá±á¬ááºážááŒááºáž]) ááŒá®ážáá±á¬áẠáááºážááẠáá¯ááºáá±á¬ááºááŸá¯ááá¯ááºáᬠá¡ááá¯áá»á¯á¶ážá¡á á®áááºáá¶á ᬠ(PLAY RECAP) ááᯠáá±ážáá«áááºá
áá¯á¶ááŸááºá¡á¬ážááŒáá·áºá áá»áááºáááºááŸá¯ááẠáááºá áá áºááá¯á· á¡áá±á¬áá·áºáááºáá¬ážááá·áº á¡á±á¬ááºááŸá áá¯á¶ážá áœá²áá°á¡áááºááᯠá¡áá¯á¶ážááŒá¯áááºá á¡áááºááŸááºá¡áá±á«áºááœáẠááŒá áºááá¯ááºáá»á±áá»á¬ážáááºá playbook ááá¯ááºááœááºá remote_user ááœáŸááºááŒá¬ážáá»ááºááᯠá¡áá¯á¶ážááŒá¯á áá»áááºáááºááẠáááºááá·áºá¡áá¯á¶ážááŒá¯áá°ááᯠá¡áá¯á¶ážááŒá¯ááááºááᯠááẠáááºááŸááºááá¯ááºáá«áááºá ááá¯á·á¡ááŒááºá á¡áá±ážááááºážá áá áºá¡ááŒá±á¬ááºáž á¡áá»ááºá¡áááºáá»á¬ážááẠááá·áºá¡ááœáẠáááŒá¬áá áááá¯á¡ááºáá² áááºážááᯠá á¯áá±á¬ááºážáá¬ááœáẠá¡áá»áááºáááŒá¯ááºážááá·áºáá«á á€áá¯ááºáá±á¬ááºá áá¬ááá¯áááºáž ááááºáá¬ážááá¯ááºáááº-
---
- name: Simple playbook
hosts: all
remote_user: root
become: true
gather_facts: no
ááá±ážá
á¬á¡á¯ááºááᯠáááºá
ááºážááŒá®áž áá»áááºáááºááŸá¯ á¡áá¯ááºáá¯ááºááŒá±á¬ááºáž áá±áá»á¬áá«á
á±á (áááºááẠroot á¡áá¯á¶ážááŒá¯áá°ááá¯áááºááŸááºáá«áá ááŒáá·áºáá¬ážáá±á¬á¡ááœáá·áºá¡áá±ážáá»á¬ážáááŸááááºá¡ááá¯á·ááŸá¬ ááŒá
áºáá¬áááº- á
á
áºááŸááºáá±á¬áááºážááœáŸááºáá»ááºááá¯áááºáž áááºááŸááºááẠááá¯á¡ááºáááºá á
á¬ááœááºá
á¬áááºážááœáẠáá±ážáá¬ážááá·áºá¡ááá¯ááºáž- become set to âtrueâ/âyesâ to activate privilege escalation.
áá¬ááŒá±á¬áá·áºáá²ááá¯áᬠááŸááºážááŸááºážáááºážáááºáž áááááá±ááá·áº)á
ansible ááẠPython á áá¬ážááŒááºááᯠááá¯á¶ážááŒááºááá¯ááºááŒááºážááŒá±á¬áá·áº ááŒá áºáá±á«áºáá¬áá±á¬ á¡ááŸá¬ážá¡ááœááºážáá áºáá¯ááᯠáááºáááºáá¶áááŸááááá·áºáááºááŒá áºááá¯ááºáááºá ááá¯á·áá±á¬áẠáááºážááᯠáááºááá¯ááºááá¯áẠáááºááŸááºááá¯ááºáááº-
ansible_python_interpreter: /usr/bin/python3
command ááŒáá·áº ááá·áºááœáẠpython ááŸáááá·áºáá±áá¬ááᯠááŸá¬ááœá±ááá¯ááºáááºá whereis python
.
á áá áºáááºáá±á·ááºá»áá»á¬áž ááá·áºááœááºážááŒááºážá
Ansible á á
á¶ááŒáá·áºááŒá°ážááŸá¯ááœáẠá¡áá»áá¯ážáá»áá¯ážáá±á¬ á
áá
áºáááºáá±á·áá»áºáá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºáááºá¡ááœáẠáá±á¬áºáá»á°ážáá»á¬ážá
áœá¬ áá«áááºáá±á¬ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠáááºááá·áºá¡ááŒá±á¬ááºážááŒá±á¬áá·áº bash script áá»á¬ážááᯠáá±ážáá¬ážááẠáááá¯á¡ááºáá«á ááᯠáá»áœááºá¯ááºááá¯á·ááẠá
áá
áºá¡á¬áž á¡ááºááááºáá¯ááºááŒá®áž á
áá
áºáááºáá±á·áá»áºáá»á¬ážááᯠááá·áºááœááºážááẠဠmodule áá»á¬ážáá²á០áá
áºáá¯ááᯠááá¯á¡ááºáá«áááºá áá»áœááºá¯ááºá VPS ááœáẠUbuntu Linux ááŸááááºá ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºá¡áá¯á¶ážááŒá¯áá±á¬ packages áá»á¬ážááᯠááá·áºááœááºážááẠapt-get
О
áá»áœááºá¯ááºááá¯á·á playbook ááᯠááááá¬áááºáá»á¬ážááŒáá·áº ááŒáá·áºá áœááºááŒáá«á áá¯á·á
---
- 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
Task ááẠáá±ážáá¶áá±á«ááºáá®áá±á¬áá¬áá¬áá»á¬ážááœáẠAnsible áá¯ááºáá±á¬ááºáááá·áºáá¬áááºá¡ááá¡áá»ááŒá
áºáááºá ááŸááºáááºážááœáẠáááºážááá¯ááºáá±á¬ááºááŸá¯ááᯠááŒá±áá¬áá¶ááá¯ááºá
á±ááẠáá»áœááºá¯ááºááá¯á·ááẠá¡áá¯ááºá¡á¬áž á¡áááºáá±ážáááºá áááá»áá±á¬ module áá
áºáá¯á syntax ááá¯á¡áá¯á¶ážááŒá¯á áááºážáááºáá¯ááºáá±á¬ááºáááá·áºá¡áá¬áá»á¬ážááá¯áá±á¬áºááŒáá«áááºá áá«ááá¯ááẠapt: update_cache=yes
- apt module ááá¯á¡áá¯á¶ážááŒá¯á system packages áá»á¬ážááᯠupdate áá¯ááºáááºááŒá±á¬ááẠáá¯ááá command á áááºážáááºážááá¯ááŸá¯ááºááœá±ážáá«áááºá áá»áœááºá¯ááºááá¯á·ááẠapt module ááá¯á· áááºáá±á·áá»áºáá»á¬ážá
á¬áááºážááᯠáá±ážááá¯á·ááŒá®áž áááºážááá¯á·ááŒá
áºááŒá±á¬ááºáž ááŒá±á¬áá«áááºá state
ááŒá
áºáá¬ááá·áºáááºá present
ááá¯ááá¯áááºááŸá¬á á€á¡áá¯ááºáá»á¬ážááᯠinstall áá¯ááºáááºáá»áœááºá¯ááºááá¯á·ááŒá±á¬ááá¯ááºáááºá á¡áá¬ážáá°áááºážááŒáá·áº áááºážááá¯á·ááᯠáá»ááºáááºá ááá¯á·ááá¯áẠááŒá±á¬ááºážáá²ááŒááºážááŒáá·áº áááºážááá¯á·ááᯠá¡ááºááááºáá¯ááºááẠáááºážááá¯á·ááᯠáá»áœááºá¯ááºááá¯á· ááŒá±á¬ááá¯ááºáááºá state
. ááá¬ážáááºážáá»á¬ážááẠpostgresql ááŸáá·áºá¡áá¯ááºáá¯ááºáááºá¡ááœáẠááá¯áá»áœááºá¯ááºááá¯á·ááá·áºááœááºážáá±ááá·áº postgresql-contrib áááºáá±á·áá»áºááá¯á¡ááºáá«áááºá áá
áºááẠáááºááẠá€á¡áá¬ááᯠááááŒá®áž áá»áá·áºááẠááá¯á¡ááºááẠá áááºážááᯠááááááá¯ááºááá¯ááºá á€ááá¯á· ááŒá¯áá¯ááºáááá·áºááẠááá¯ááºáá±á
ááá±ážá á¬á¡á¯ááºááᯠáááºáá¶á¡áá¯á¶ážááŒá¯ááŒá®áž áááºáá±á·áá»áºáá»á¬áž ááá·áºááœááºážáá¬ážááŒá±á¬ááºáž á á áºáá±ážááŒáá·áºáá«á
á¡áá¯á¶ážááŒá¯áá°á¡áá áºáá»á¬ážáááºáá®ážááŒááºážá
á¡áá¯á¶ážááŒá¯áá°áá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºáááºá Ansible ááœáẠá¡áá¯á¶ážááŒá¯áá° module áá áºáá¯áááºáž ááŸááááºá áá±á¬ááºáááºáá¯ááºáá±á¬ááºá áá¬áá áºáᯠáááºááá·áºááá¯ááºáá¡á±á¬áẠ(á¡áá»áááºááá¯ááºáž á¡áá»áááºááá¯ááºáž áá±á¬áºáá®áá°ážáá°ááŒááºážáááŒá¯ááá á±áááºá¡ááœáẠááá±ážá á¬á¡á¯ááºá ááááŒá®ážáá¬ážá¡ááá¯ááºážáá»á¬ážááᯠááŸááºáá»ááºáá»á¬ážáá±á¬ááºááœáẠááŸááºáá¬ážáááº)á
---
- name: Simple playbook
# ...
tasks:
# ...
- name: Add a new user
user:
name: my_user
shell: /bin/bash
password: "{{ 123qweasd | password_hash('sha512') }}"
áá»áœááºá¯ááºááá¯á·ááẠá¡áá¯á¶ážááŒá¯áá°á¡áá áºááᯠáááºáá®ážááŒá®ážá áááºážá¡ááœáẠá¡á á®á¡á ááºáá áºáá¯ááŸáá·áº á áá¬ážááŸááºááᯠáááºááŸááºáá«á ááŒá®ážáá±á¬á· ááŒá¿áá¬áá±á«ááºážáá»á¬ážá áœá¬ááᯠááŒá¯á¶ááááºá ááá°áá®áá±á¬ host áá»á¬ážá¡ááœáẠá¡áá¯á¶ážááŒá¯áá°á¡áááºáá»á¬áž ááœá²ááŒá¬ážááẠááá¯á¡ááºáá«á áááºááá¯á·áááºážá á áá¬ážááŸááºááᯠplaybook ááœááºááŸááºážáááºážáá±á¬á á¬áá¬ážááŒáá·áºááááºážáááºážááŒááºážáááºá¡ááœááºááá¯ážááœá¬ážáá±á¬á¡ááŒá¶á¥á¬ááºááŒá áºáááºá á áááºáááºá á¡áá¯á¶ážááŒá¯áá°á¡áááºááŸáá·áº á áá¬ážááŸááºááᯠááááºážááŸááºáá»á¬ážá¡ááŒá Ạáá¬ážááŸáááŒáá«á áá¯á·á áá±á¬ááºážáá«ážáá¡áá¯á¶ážááœáẠá áá¬ážááŸááºááᯠáá¯ááºááŸááºáááºážááᯠááŒááá«áááºá
---
- 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) ááŒá
áºááŒá®áž áááºážááá¯á·ááẠhost á¡á¬ážáá¯á¶áž (á¡á¬ážáá¯á¶áž) ááŸáá·áº áááºááá¯ááºáááºáᯠáááºážáááá¯áááºá
áá®ááá¯ááºážááááºáž á
áááºáááºá
á¬ážá
áá¬áá«á "{{ user_password | password_hash('sha512') }}"
. á¡áá±ážááŒá®ážáá¬á ansible ááááá·áº user ááᯠinstall ááá¯ááºáá«áá°ážá user_add
áááºááá¯ááºááá¯ááºáá¯ááºáááá¯áá«áá²á áááºážááẠdata á¡á¬ážáá¯á¶ážááá¯ááá¯ááºááá¯ááºááááºážáááºážáááºá ááá¯á·ááŒá±á¬áá·áºáá»áœááºá¯ááºááá¯á·áááºá
áá¬ážááŸááºááᯠ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 ááŸáá·áºá¡ááœááºáááºáá°áá±á¬ syntax áá
áºáá¯áá«ááŸááá±á¬á¡á¯ááºá
á¯áá»á¬ážááá¯áááºáá®ážáááºá¡ááœááºá¡á¯ááºá
ᯠmodule áá
áºáá¯ááŸááááºá ááá¯á·áá±á¬áẠá€á¡ááœá²á·ááᯠá¡áá¯á¶ážááŒá¯áá°áᶠá
á¬áááºážááœááºážááẠáá¯á¶áá±á¬ááºáá«áááºá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 ááá¯ááá·áºááœááºážáá¬ážááŒá®ážááŒá áºááá·áºáááºá áááºážááᯠconfigure áá¯ááºááŒá®áž run áááºááá¯á¡ááºáááºá á¡áááºážááá¹áááŸá¬ áá»ááºáá»ááºážáá¯ááºááŒáá¡á±á¬ááºá ááá¯ááºááœá²á·á ááºážáá¯á¶áá áºáá¯áááºáá®ážááŒáá«á áá¯á·á
- ansible
- roles
- nginx
- files
- tasks
- main.yml
- templates
ááᯠáá»áœááºá¯ááºááá¯á·ááẠááá¯ááºáá»á¬ážááŸáá·áº ááá°áá¬áá»á¬áž ááá¯á¡ááºáá«áááºá áááºážááá¯á·ááŒá¬ážá ááœá¬ááŒá¬ážáá»ááºááŸá¬ ansible ááẠááá¯ááºáá»á¬ážááᯠááá¯ááºááá¯ááºáá°ážáá°ááŒááºáž ááŒá áºáááºá ááŸáá·áº template áá»á¬ážááœáẠj2 extension ááŸáááááºááŒá áºááŒá®áž áááºážááá¯á·ááẠáá°áá®áá±á¬ double curly braces áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á ááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ áááºááá¯ážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
nginx ááᯠááœáá·áºááŒáá·áºáá¡á±á¬áẠmain.yml
ááá¯ááºá á€á¡áá¬á¡ááœáẠáá»áœááºá¯ááºááá¯á·ááœáẠsystemd module áá
áºáá¯ááŸááááºá
# Copy nginx configs and start it
- name: enable service nginx and start
systemd:
name: nginx
state: started
enabled: yes
á€áá±áá¬ááœáẠáá»áœááºá¯ááºááá¯á·ááẠnginx ááá¯á
áááºááááºáá¯ááŒá±á¬áá¯á¶áá¬áá (ááá¯ááá¯áááºááŸá¬ áá»áœááºá¯ááºááá¯á·á áááºážááá¯ááœáá·áºááŒááºážááŒá
áºáááº)á ááá¯á·áá±á¬áºáááºážááá¯ááœáá·áºáá¬ážááááºáá¯áá»ááºáá»ááºážááŒá±á¬áá«áááºá
ááᯠconfiguration ááá¯ááºáá»á¬ážááᯠáá°ážáá°ááŒáá«á
áá¯á·á
# 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 directory ááŸá áá»áœááºá¯ááºááá¯á·á application á¡ááœáẠconfiguration file (áááºážááẠáááá¯á¡ááºáá±á¬áºáááºáž á¡áá¯á¶ážáááºáááº)á áááááá
á¹á
ááœááºá áá»áœááºá¯ááºááá¯á·ááẠááá¯ááºáá»á¬ážááá¯áá°ážáá°ááẠáááá¹áá° module ááá¯á¡áá¯á¶ážááŒá¯ááẠ(ááá¯ááºáá²ááœááºááŸáááááºá /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 áááºááá¯ážáá»á¬ážááᯠáá°ážáá°ááŒááºážáááŒá¯áá® ááá°áá¬áá¯á¶á
á¶ááá¯á· á¡á
á¬ážááá¯ážááá·áº ááááºážááŸááºáá»á¬ážááŒá
áºáááºá ááá°áá®áá±á¬ host á¡á¯ááºá
á¯áá»á¬ážá¡ááœáẠplaybook ááá¯á¡áá¯á¶ážááŒá¯áá«á áááºážááẠá¡áá¯á¶ážáááºáá«áááºá á¥ááá¬á¡á¬ážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·á á
á¬áááºážááá¯ááºááᯠááá·áºááá¯ááºáááº-
[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
áá»áœááºá¯ááºááá¯á·á ááá±ážá
á¬á¡á¯ááºááᯠááá¯ááœáá·áºáá«áá áááºážááẠhost ááŸá
áºáá¯áá¯á¶ážá¡ááœáẠáááºááŸááºáá¬ážáá±á¬ áá¯ááºáá±á¬ááºá
áá¬áá»á¬ážááᯠáá¯ááºáá±á¬ááºáá±ážáááá·áºáááºá ááá¯á·áá±á¬áºáá
áºáá»áááºáááºážááŸá¬áááºá áá¬ááºá¡áááºáááºááŒááºážá¡ááœááºá variable áá»á¬ážááẠáá¯ááºáá¯ááºááá·áºá¡áá¬áá»á¬ážááŸáá·áº ááœá²ááŒá¬ážáááºááŒá
áºááŒá®ážá á¡áááºážááá¹ááá»á¬ážááŸáá·áº playbooks áá»á¬ážááœááºáá¬áá nginx configs ááœááºáááºáž ááœá²ááŒá¬ážáááºááŒá
áºáááºá {{ inventory_hostname }}
inventory file ááœáẠáááºááŸááºáá¬ážááẠáááá¯á¡ááºáá«á
áááºáá¶áá°á¡áá»á¬ážá¡ááŒá¬ážá¡ááœáẠá
á¬áááºážááá¯ááºáá
áºáá¯ááŸáááá¯áá«áá á¡á¯ááºá
á¯áá
áºá
á¯á¡ááœááºáᬠáá¯ááºáá±á¬ááºááá¯áá«áá áááºážááᯠá¡á±á¬ááºáá« command ááŒáá·áº áá¯ááºáá±á¬ááºááá¯ááºáááº-
ansible-playbook -i inventory ./playbook.yml -l "staging"
á¡ááŒá¬ážááœá±ážáá»ááºá áá¬ááŸá¬ ááá°áá®áá±á¬á¡á¯ááºá á¯áá»á¬ážá¡ááœáẠáá®ážááŒá¬ážá á¬áááºážááá¯ááºáá»á¬ážáá¬ážááŸááááºááŒá áºáááºá ááá¯á·ááá¯áẠááá·áºááœáẠááá°áá®áá±á¬ host áá»á¬ážá áœá¬ááŸááá»áŸáẠáááºážáááºážááŸá áºáá¯ááᯠáá±á«ááºážá ááºááá¯ááºáááºá
nginx á áá áºááá·áºááœááºážááŒááºážááá¯á· ááŒááºááœá¬ážááŒáá«á áá¯á·á ááœá²á·á ááºážááŸá¯áá¯á¶á á¶ááá¯ááºáá»á¬ážááᯠáá°ážáá°ááŒá®ážáá±á¬ááºá sites_available á០my_app.conf ááá¯á· sitest_enabled to my_app.conf ááœáẠsymlink áá áºáá¯áááºáá®ážááẠááá¯á¡ááºáá«áááºá ááŸáá·áº 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
á¡áá¬á¡á¬ážáá¯á¶ážááẠá€áá±áá¬ááœáẠááá¯ážááŸááºážáá«ááẠ- áá»áŸáá»áŸááá á¶áá¬ážáá±á¬ á¡áá¬ážá¡ááá¯áá»á¬ážáá«ááŸááá±á¬ ansible modules áá»á¬ážáá±á¬ááºááááºá áá«áá±ááá·áº á¡áá»ááºáá áºáá¯áá±á¬á· ááŸááááºá nginx ááᯠá¡áá»áááºááá¯ááºáž ááŒááºáááºá áááºááẠááá á¹á áááŸááá«á "á€áá²á·ááá¯á·áá¯ááºáá«" áá²á·ááá¯á·áá±á¬ command áá»á¬ážááá±ážáááºááᯠáááááŒá¯áááá«ááá¬ážá syntax ááẠ" this must have this state" ááŸáá·áº ááá¯áá°áá«áááºá á¡áá»á¬ážá á¯ááá±á¬á· áá«áᬠansible á¡áá¯ááºáá¯ááºáá¯á¶ á¡ááá¡áá»áá«áá²á á¡ááœá²á·ááŸáááŸáá·áºááŒá®ážáá¬áž ááá¯á·ááá¯áẠá áá áºáááºáá±á·áá»áºááᯠááá·áºááœááºážááŒá®ážááŒá áºáá«áá áááºážááᯠansible á០á á áºáá±ážááŒá®áž áá¯ááºáá±á¬ááºá áá¬ááᯠáá»á±á¬áºááœá¬ážáá«áááºá ááá¯á·á¡ááŒááºá áááºážááá¯á·ááẠáá¬áá¬áá±á«áºááœáẠááŸáááŒá®ážáá¬ážá¡áá¬áá»á¬ážááŸáá·áº áá¯á¶ážáááá¯ááºáá®áá«á ááá¯ááºáá»á¬ážááᯠáá°ážáá°áááºááá¯ááºáá«á configuration ááá¯ááºáá»á¬ážááᯠááŒá±á¬ááºážáá²ááŒá®ážááŸáᬠáááºážááᯠá¡ááœáá·áºáá±á¬ááºážáá°ááŒá®áž 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 ááᯠáááºááŸááºááŒááºážá
áá»áœááºá¯ááºááá¯á·ááẠnginx ááŒáá·áºáá¯ááºáá±á¬ááºááá·áºá¡ááá¯ááºáž systemd ááá¯á¡áá¯á¶ážááŒá¯á postgresql ááá¯ááœáá·áºáááºááá¯á¡ááºááŒá®áž database ááŸáá·áº database ááá¯ááºááá¯ááºáááºáá±á¬ááºáááºá¡áá¯á¶ážááŒá¯ááá·áºá¡áá¯á¶ážááŒá¯áá°ááá¯áááºážáááºáá®ážáááºááá¯á¡ááºáááºá
á¡áááºážááá¹ááá
áºáá¯áááºáá®ážááŒáá«á
áá¯á· /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 modules á syntax áá»á¬ážááŒá
áºáááºá á
á¬ááœááºá
á¬áááºážáá»á¬ážááœáẠááá¯ááá¯ááááŸáááá¯ááºááẠá á€áá±áá¬ááœáẠá
áááºáááºá
á¬ážá
áá¬á¡áá±á¬ááºážáá¯á¶áž áááºážááœáŸááºáá»ááºááŒá
áºáááºá become_user: postgres
. á¡ááŸááºááŸá¬ áá¯á¶ááŸááºá¡á¬ážááŒáá·áºá postgres á¡áá¯á¶ážááŒá¯áá°áá¬áá»áŸáẠpostgresql áá±áá¬áá±á·á
áºááá¯á· áááºáá±á¬ááºááá¯ááºááŒá®áž ááŒááºááœááºážááᬠááŒá
áºáááºá á€ááœáŸááºááŒá¬ážáá»ááºááẠáá»áœááºá¯ááºááá¯á·á¡á¬áž á€á¡áá¯á¶ážááŒá¯áá°ááá¯ááºá
á¬áž á¡áááá·áºáá±ážáá»ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºááá¯ááºá
á±ááẠ(áá»áœááºá¯ááºááá¯á·áááºáá±á¬ááºááœáá·áºááŸááá»áŸáẠáá¯ááºáá«áááº)á
ááá¯á·á¡ááŒááºá áááºááẠáá±áá¬áá±á·á
áºááá¯á· á¡áá¯á¶ážááŒá¯áá°á¡áá
áºáááºáá±á¬ááºááœáá·áºááᯠááœáá·áºááŒá¯ááẠpg_hba.conf ááá¯á· ááá¯ááºážáá
áºáá¯ááá·áºááá±áááºá áááºážááᯠáá»áœááºá¯ááºááá¯á· nginx config ááá¯ááŒá±á¬ááºážááŒá®áž á¡áá¬ážáá°áááºážáááºážááŒáá·áº áá¯ááºáá±á¬ááºááá¯ááºáááºá
ááá¯á·á¡ááŒááºá áááºááẠáááºáááœáá·áºá á¬á¡á¯ááºááœáẠpostgresql á¡áááºážááá¹áááᯠááá·áºááœááºážááẠááá¯á¡ááºáá«áááºá
rbenv ááŸáá áºááá·áº ááá¹áááŒá¬ážááᯠáááºáááºááŒááºážá
Ansible ááœáẠrbenv ááŸáá·áºá¡áá¯ááºáá¯ááºááẠmodule áá»á¬ážááá«áááºáá±á¬áºáááºáž git repository ááá¯ááœá¬ážááŒááºážááŒáá·áºááá·áºááœááºážáá¬ážáááºá ááá¯á·ááŒá±á¬áá·áº á€ááŒá¿áá¬ááẠá
á¶ááá®áá¯á¶áž ááŒá¿áá¬ááŒá
áºáá¬áááºá áá°áá¡ááœáẠá¡áááºážááá¹ááá
áºáᯠáááºáá®ážááŒáá«á
áá¯á· /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
á€áááºááœááºáá»ááºáá»á¬ážá¡ááœáẠáá»áœááºá¯ááºááá¯á·áááºáá®ážáá¬ážáá±á¬ á¡áá¯á¶ážááŒá¯áá°á¡á±á¬ááºááœáẠá¡áá¯ááºáá¯ááºááẠbe_user ááœáŸááºááŒá¬ážáá»ááºááᯠáá»áœááºá¯ááºááá¯á· áááºáá¶á¡áá¯á¶ážááŒá¯áá«áááºá rbenv ááᯠáááºážá home directory ááœáẠááá·áºááœááºážáá¬ážáá±á¬ááŒá±á¬áá·áº ááá¹áá¬ááŸáá·áºáááá¯ááºáá«á ááá¯á·á¡ááŒáẠrepo ááŸáá·áº dest ááá¯áááºááŸááºááŒááºážááŒáá·áº repository ááá¯ááœá¬ážááẠgit module ááá¯á¡áá¯á¶ážááŒá¯áááºá
ááá¯á·áá±á¬ááºá áá»áœááºá¯ááºááá¯á·ááẠrbenv init ááᯠbashrc ááœáẠá á¬áááºážááœááºážááŒá®áž PATH ááœáẠrbenv ááá¯ááá·áºááẠááá¯á¡ááºáááºá áááºážá¡ááœáẠáá»áœááºá¯ááºááá¯á·ááœáẠlineinfile module ááŸááááºá
- 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 ááẠcommands áá»á¬ážááá¯ááá¯ááºáá±á¬ááºáá® bashrc ááœááºáá«ááŸááá±á¬áá¯ááºááá¯ááááºáááºááá¯ááºáá°áá±á¬á¡áá»ááºááá¯áá»áœááºá¯ááºááá¯á·ááœá±á·áá¬ááááºá ááá¯ááá¯áááºááŸá¬ rbenv ááᯠáá°áá®áá±á¬ script ááœáẠááá¯ááºááá¯áẠáááºááŸááºááááºááŒá áºáá«áááºá
áá±á¬ááºááŒá¿áá¬ááŸá¬ shell command ááẠansible ááŸá¯áá±á¬áá·áºá០state áááŸááá±á¬ááŒá±á¬áá·áºááŒá áºáááºá ááá¯ááá¯áááºááŸá¬á á€ááá¹áááŒá¬ážáá¬ážááŸááºážááᯠáááºáááºáá¬ážááŒááºáž ááŸáá áááŸá á¡ááá¯á¡áá»á±á¬áẠá á áºáá±ážáááºááá¯ááºáá«á áá»áœááºá¯ááºááá¯á·ááá¯ááºááá¯áẠá€á¡áá¬ááᯠáá¯ááºáá±á¬ááºááá¯ááºáááº-
- 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 ááᯠrun ááá¯á·ááŒá
áºááŒá®ážá áááºážááẠcode ááá¯ááá¯ááºááá¯ááºáá°ážáá°á ááá¯á¡ááºáá±á¬áááºážááœáŸááºáá»á¬ážááá¯áááºáá®ážááŒá®áž application ááá¯á
áááºáááá·áºááẠ(á¡áá¬á¡á¬ážáá¯á¶ážááŸááºáááºá
áœá¬ááŒááºáááºáá¬ážáá»áŸááº) á ááá¯á·áá±á¬áºá 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 ááẠááááá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬ááºáááºáá®ážáá±ážáááºááŒá áºáááºá
Ansible Vault
ááááºážááŸááºáá»á¬ážááœáẠá¡áá¯á¶ážááŒá¯áá°á á
áá¬ážááŸááºáá²á·ááá¯á·áá±á¬ áá»áŸáá¯á·ááŸááºáá±áá¬áá»á¬áž áá«áááºááá¯ááºáááºááᯠáá»áœááºá¯ááºááá¯á· ááœá±á·ááŸááá¬ážááŒá®ážááŒá
áºáááºá áááºáá®ážááŒá®ážááŒá®ááá¯ááẠ.env
áá»áŸá±á¬ááºááœáŸá¬á¡ááœááºááá¯ááºá ááŸáá·áº database.yml
á¡á²áá®á¡áá«ááŸá¬ áá®ááᯠá¡áá±ážááŒá®ážáá²á· á¡áá»ááºá¡áááºááœá± ááá¯ááŸáááááºá á
á°ážá
á°ážáá²áá² áá»ááºáá¯á¶ážááœá±ááá± áá¯á¶ážááœááºáá¬ážááá¯ááºáᬠáá±á¬ááºážáááá·áºáááºá á€áááºááœááºáá»ááºá¡ááœááºáááºážááá¯á¡áá¯á¶ážááŒá¯áááºá
variable ááœá±á¡ááœáẠááá¯ááºáá
áºáá¯áááºáá®ážááŒáá·áºáá¡á±á¬áẠ/ansible/vars/all.yml
(á€áá±áá¬ááœáẠáááºááẠá
á¬áááºážá¡ááºážááá¯ááºááœááºáá²á·ááá¯á·ááẠááá°áá®áá±á¬ host á¡á¯ááºá
á¯áá»á¬ážá¡ááœáẠááá°áá®áá±á¬ááá¯ááºáá»á¬ážááᯠáááºáá®ážááá¯ááºáááº- production.yml, staging.yml, etc)á
áá¯ááºááŸááºáá¬ážáááá·áº ááááºážááŸááºá¡á¬ážáá¯á¶ážááẠá
ᶠ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 ááẠá
áá¬ážááŸááºááá¯áá±á¬ááºážáááºá ááááºážááŸááºáá»á¬ážááᯠááŒááºáááºááá°ááŒá®áž á¡áá¯ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáááºááŒá
áºáááºá áá±áá¬á¡á¬ážáá¯á¶ážááᯠáá¯ááºááŸááºáá¬ážáá«áááºá
host á¡á¯ááºá á¯áá»á¬ážá áœá¬ááŸáá·áº ansible vault á¡ááœáẠááŒá®ážááŒáá·áºá á¯á¶áá±á¬ command ááẠá€áá²á·ááá¯á·áá±á¬áá¯á¶áá±á«áºáá«áááº-
ansible-playbook -i inventory ./playbook.yml -l "staging" --ask-vault-pass
áá«áá±ááá·áº ááŒáá¬ááºá á¬á¡á¯ááºááœá±áá²á· á¡áááºážááá¹áááœá±áá²á· á á¬áá¬ážá¡ááŒáá·áºá¡á á¯á¶ááᯠáá«ááá±ážáá°ážá ááá¯ááºááá¯ááºáá±ážáá«á ansible ááẠááá¯áá²á·ááá¯á·ááŒá áºáá±á¬ááŒá±á¬áá·áº - áááºáá¯ááºáá±á¬ááºáááá·áºá¡áá¬ááᯠáá¬ážááááºáá«áá áááºážááẠááá·áºá¡ááœáẠáá¯ááºáá±á¬ááºáááºááá¯ááºáá«á
source: www.habr.com