Що таке Ansible. Приклад простого playbook-а.

Ansible – це програмне рішення для віддаленого управління конфігураціями. Воно дозволяє налаштовувати віддалені машини. Головна його відмінність від інших подібних систем в тому, що Ansible використовує існуючу інфраструктуру SSH, в той час як інші (chef, puppet, та ін.) вимагають установки спеціального PKI-оточення.

Ansible написаний на python, і для його роботи необхідні наступні Python-модулі:

- python-yaml 
- python-jinja2

Установка Ansible дуже проста.

sudo apt-add-repository ppa: ansible / ansible 
sudo apt update 
sudo apt install ansible

Перше що нам потрібно зробити після установки, налаштувати файл hosts для Ansible який знаходиться в /etc/ansible/hosts . Туди повинні бути занесені всі наші хости, з якими ми будемо працювати. Можна додавати в групу. Для прикладу додамо локальний хост:

[localhost] 
localhost ansible_connection = local

Пора перейти до написання нашого першого playbook`а. 
Playbook – це сценарій, в якому ви вказуєте дії, які повинен виконати Ansible на наших хостах.

Наприклад, створимо файл example.yml і запишемо туди наступне:

--- 
- hosts: localhost 
vars_files: 
- flores.yml 
become: yes 
become_user: root 
tasks: 
- name: Create DIRECTORY 
become: true 
file: path=/home/{{item.name}}/{{item.id}} state=directory owner=nick group=nick mode=0777 
with_items: 
- "{{flores}}" 
- "{{users}}"

Збережемо файл. І тут же створимо файл flores.yml наступного змісту:

--- 
flores: 
- {name: test1, id: "001"} 
- {name: test2, id: "002"}

Це дуже простий приклад. Розпишемо все по порядку: 
 – всі плейбуки повинні починатися з трьох тире. Тобто, Ansible вважає це початком сценарію. 
– host: localhost – вказуємо, що працювати будемо з хостом localhost. 
vars_files: – це модуль змінних. Тобто, ми вказали файл зі змінними flores.yml , які нам будуть потрібні для подальшої роботи сценарію. 
become: yes – дозволяємо виконання сценарію з рута. 
become_user: root – вказуємо користувача, з під якого буде виконуватися сценарій. 
– name: – назви дії. 
Далі почнеться одразу найцікавіше. У Ansible є купа модулів, в нашому випадку ми використовуємо file, За допомогою якого створимо теку в директорії /home/ :

file: path =/home/{{item.name}}/{{item.id}} state=directory owner=nick group=nick mode=0777

with_items: – «{{flores}}» state=directory – це параметр, в якому вказується що потрібно створити директорію.
owner=nick – призначаємо власника директорії користувача nick 
group=nick – призначаємо директорії групу nick
mode=0777 – і ставимо права на директорію 777 . Важливо пам’ятати, що є певний баг: якщо в назві папок або файлів, при виставленні прав ми використовуємо цифри – перед назвою повинен стояти «, або ж назву потрібно включити в лапки “”
Модуль with_items дозволяє вказати змінні які хочемо використовувати. У нашому випадку використовується файл flores.yml , в якому ви записали змінну flores .
Змінні можна вказати і для кожної групи окремо, то це виглядало б ось так:

file: path=/home/{{item.name}}/{{item.id}} state=directory owner=nick group=nick mode=0777 
with_items: 
- {name: test1, id: "001"} 
- { name: test2, id: "002"}

Це тільки маленький і найпростіший приклад. У Ansible є купа модулів, якими можна використовувати для роботи з установкою пакетів і закінчуючи створенням баз даних. 
До речі, приклад  для створення бази даних та користувача MySQL виглядає так:

- name: Create MySQL BD 
mysql_db: 
name: "name_base" 
state: present 

- name: Create MySQL user 
mysql_user: 
login_user: root 
login_password: "password" 
name: "username" 
password: "password" 
priv: "name_base. *: ALL " 
host:" 127.0.0.1 "

А для PostgreSQL:

- name: Create db PostgreSQL 
become: yes 
become_user: postgres 
postgresql_db: 
name: "name_base" 
encoding: UTF-8 
template: template0 
state: present 

- name: Create user PostgreSQL 
become: yes 
become_user: postgres 
postgresql_user: 
name: "username" 
password : "password" 
db: "name_base" 
priv: ALL 
state: present 
encrypted: no 

- name: Ensure user does not have unnecessary privilege 
become: yes 
become_user: postgres 
postgresql_user: 
name: "username" 
role_attr_flags: "NOSUPERUSER, NOCREATEDB"

- name: Ensure no other user can access the database 
become: yes 
become_user: postgres 
postgresql_privs: 
db: "name_base" 
role: PUBLIC 
type: database 
priv: ALL 
state: absent

Goodhoster.NET
Додати коментар