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