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 . Важливо пам’ятати, що є певний баг: якщо в назві папок або файлів, при виставленні прав ми використовуємо цифри – перед назвою повинен стояти «0», або ж назву потрібно включити в лапки “”
Модуль 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