Что такое 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. Важно помнить, что есть некоторый баг: если в названии папок или файлов, выставлении прав мы используем цифры — перед названием должен стоять «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

Goodhoster.NET
Добавить комментарий