From 6c205e0818c0000d29b0656127a45be3a83fbd6b Mon Sep 17 00:00:00 2001 From: ilyamak04 Date: Sun, 29 Sep 2024 21:19:23 +0300 Subject: [PATCH] summary ansible: second day --- ansible/ANSIBLE.MD | 177 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 173 insertions(+), 4 deletions(-) diff --git a/ansible/ANSIBLE.MD b/ansible/ANSIBLE.MD index 908c3f7..3b8c355 100644 --- a/ansible/ANSIBLE.MD +++ b/ansible/ANSIBLE.MD @@ -1,3 +1,4 @@ +### Quick start - Устанавливаем ansible на машину ```bash # Для Ubuntu @@ -11,7 +12,7 @@ sudo apt install ansible [web_servers] archers ansible_host=176.119.89.45 ansible_user=archer ansible_private_key=/home/ilyamak04/.ssh/archers ``` -#### Про инвентарный файл (что можно делать?) +### Про инвентарный файл (что можно делать?) - Разбивать сервера на группы ```ini [dev_servers] @@ -51,7 +52,7 @@ db_servers > По умолчанию любой сервер входит в 2 группы: 1) all 2) ungrouped или пользовательская группа -#### Про конфигурационный файл `ansible.cfg` +### Про конфигурационный файл `ansible.cfg` - Ansible ищет конфигурационный файл в нескольких местах, в следующем порядке при запуске: 1. В текущем каталоге — если существует файл ansible.cfg в директории, из которой запускается Ansible. @@ -62,7 +63,7 @@ Ansible будет использовать первый найденный ко Файл ansible.cfg лучше хранить в проекте, инфраструктуру когорого менеджерит ansible, а вот инвентарный файл hosts.ini можно хранить где угодно на Ansible-Master хосте, главное в .cfg задать путь к hosts.ini -#### Основные секции `ansible.cfg` +### Основные секции `ansible.cfg` - [defaults] - Это основная секция для установки параметров по умолчанию ```ini [defaults] @@ -108,9 +109,177 @@ log_path = /var/log/ansible.log ### Ad-Hoc команды `ansible [опции] <группа-хостов> -m <модуль> -a <аргументы>` - структура Ad-Hoc команд -- `ansible -i hosts.ini all -m setup` - выводит подробную информацию про конфигурацию хостов. +- `ansible -i hosts.ini all -m setup` - модуль, который собирает детальную информацию о системе каждого хоста (например, информацию о процессоре, операционной системе, памяти, сетевых интерфейсах и т.д.). Эта информация затем может быть использована в плейбуках или для отладки. - `ansible -i hosts.ini all -m ping` - проверка доступности хостов. - `ansible -i hosts.ini all -m shell -a "rm -rf /"` - запускает команду в кавычках на хостах, выводит вывод команды со всех хостов в консоль. - `ansible -i hosts.ini all -m command -a "rm -rf /"` - Команда(ы) не будут обрабатываться через shell, поэтому переменные типа $HOSTNAME и операции типа "*", "<", ">", "|", ";" и "&" не будут работать. Используйте модуль ansible.builtin.shell, если вам нужны эти функции. То есть command более секьюрная. - `ansible -i hosts.ini all -m copy -a "src=filename.txt dest=/home mode=777" -b` - ну тут понятно что команда делает, флаг `-b` - это выполнить от суперпользователя +Про модуль `file` - С помощью этого модуля можно изменять права доступа, владельцев, группы, создавать или удалять файлы и директории, а также устанавливать символические ссылки. + +Вот основные параметры, которые можно использовать с модулем file: + +- `path`: путь к файлу или директории, с которыми нужно работать. +- `state`: определяет, что должно быть сделано с файлом или директорией. Возможные значения: + - `touch`: создать пустой файл, если он не существует, или обновить время доступа и модификации, если файл уже существует. + - `absent`: удалить файл или директорию. + - `directory`: создать директорию. + - `file`: создать файл. + - `link`: создать символическую ссылку. + - `hard`: создать жесткую ссылку. +- `owner`: владелец файла или директории. +- `group`: группа файла или директории. +- `mode`: права доступа к файлу или директории, указанные в виде числового значения (например, 0644). +- `recurse`: рекурсивно изменяет права, владельцев или группы для директорий и их содержимого (поддиректорий и файлов). + +- `ansible -i hosts.ini all -m file -a "path=/home/privet.txt state=absent" -b` - удаляет файл +- `ansible -i hosts.ini all -m get_url -a "url=https://link/on/download/file dest=/home" -b` - скачивает файл из интернета +- `ansible -i hosts.ini all -m apt -a "name=nginx state=present" --become` - устанаваливает пакет на Ubuntu/Debian (-b и --become эквивалентны) +- `ansible -i hosts.ini all -m uri -a "url=https://www.content.ru return_content=yes"` - Модуль uri в Ansible используется для взаимодействия с веб-сервисами через HTTP или HTTPS. Этот модуль позволяет выполнять запросы к REST API, загружать данные, отправлять данные на удалённый сервер и проверять доступность веб-сервисов. + +Модуль `service` в Ansible используется для управления системными сервисами на удалённых хостах. Он позволяет запускать, останавливать, перезапускать и изменять состояние сервисов, а также управлять их включением при загрузке системы. + +- `name`: Название сервиса, который нужно управлять. Например, apache2, nginx, ssh, и т. д. +- `state`: Указывает желаемое состояние сервиса. Возможные значения: + - `started`: Запустить сервис. + - `stopped`: Остановить сервис. + - `restarted`: Перезапустить сервис. + - `reloaded`: Перезагрузить конфигурацию сервиса без остановки. + - `enabled`: Включить сервис при загрузке системы. + - `disabled`: Отключить сервис от автозагрузки. +- `enabled`: Указывает, должен ли сервис автоматически запускаться при загрузке системы. Значения могут быть true или false. +- `ansible -i hosts.ini all -m service -a "name=nginx state=started enabled=yes" -b` +> Все демоны могут считаться сервисами, но не все сервисы являются демонами + +### group_vars +Директория `group_vars` должна находиться в директории с инвентарным файлом. +```css +├── ansible.cfg +├── inventory/ +│ ├── hosts +├── group_vars/ +│ ├── all.yml +│ ├── web_servers.yml +│ └── db_servers.yml +└── playbook.yml +``` +Внутри директории group_vars могут находиться файлы с именами групп из инвентаря. Эти файлы содержат переменные, которые будут применяться ко всем хостам, принадлежащим к соответствующей группе. + +- Файл web_servers.yml содержит переменные, которые будут применяться ко всем серверам группы web_servers. + +- Файл all.yml содержит переменные для всех хостов, независимо от группы. + +#### Основные моменты +- **Приоритеты**: Если переменные определены в нескольких местах, например, в файлах group_vars, host_vars или playbook, Ansible применяет переменные в следующем порядке: + + 1. Переменные, определённые внутри задач в плейбуке (самый высокий приоритет). + + 2. Переменные, указанные для конкретных хостов (host_vars). + + 3. Переменные из группы хостов (group_vars). + + 4. Переменные для всех хостов (например, файл group_vars/all.yml). + + 5. Значения по умолчанию. + +- **Наследование переменных**: Переменные, определённые в файле для всех хостов (например, `group_vars/all.yml`), могут быть переопределены переменными, определёнными в группе конкретных хостов (например, `group_vars/web_servers.yml`). + +- **Формат файлов**: Файлы в директории `group_vars` могут быть в формате YAML или INI, хотя YAML используется чаще. + +### Флаги +- `-b` - от суперюзера +- `-k` - `--ask-pass`: ask for connection password +- `-K` - `--ask-become-pass`: ask for privilege escalation password +- `-v`, `-vv`, `-vvv`, `-vvvv` - подробный вывод для дебага + +### Плейбуки + +Ansible playbook — это файл в формате YAML, который описывает последовательность действий для настройки хостов (серверов). Playbooks позволяют автоматизировать задачи, такие как установка программ, управление конфигурациями, деплой приложений и многое другое. Они состоят из набора инструкций, называемых tasks (задачи), которые выполняются на удалённых хостах, указанных в инвентаре. (определение chat gpt, на мой взгляд неплохое) + +- **Hosts (хосты)** - это часть плейбука, которая указывает, на каких серверах выполнять задачи + - `all` означает, что команды будут выполняться на всех хостах из инвентаря. + + - Также можно указывать конкретные группы или отдельные хосты. +```yml +- hosts: web_servers # Выполнить задачи на всех хостах группы 'web_servers' +``` +- **Tasks (задачи)** - Каждая задача в плейбуке представляет собой отдельное действие (например, установка пакета, редактирование файла, запуск сервиса). Задачи выполняются по порядку, сверху вниз. +```yml +tasks: + - name: Установить Apache + ansible.builtin.apt: + name: apache2 + state: present +``` +- **Vars (переменные)** - Можно использовать переменные для хранения данных, таких как имена пользователей, порты, пути к файлам и так далее. +```yml +- hosts: web_servers + become: true + + vars: + http_port: 8080 + document_root: /var/www/html + + tasks: + - name: Установить Apache + ansible.builtin.apt: + name: apache2 + state: present + + - name: Настроить Apache на нужный порт + ansible.builtin.lineinfile: + path: /etc/apache2/ports.conf + regexp: '^Listen' + line: "Listen {{ http_port }}" # Использование переменной + + - name: Создать директорию DocumentRoot + ansible.builtin.file: + path: "{{ document_root }}" # Использование переменной + state: directory +``` +- **Handlers (обработчики)** - это специальные задачи, которые выполняются **только в случае, если их вызвали**. Их часто используют для таких задач, как перезагрузка сервиса после изменения конфигурационного файла. +```yml +tasks: + - name: Изменить конфигурацию Apache + ansible.builtin.template: + src: templates/apache.conf.j2 + dest: /etc/apache2/apache2.conf + notify: + - Перезапустить Apache + +handlers: + - name: Перезапустить Apache + ansible.builtin.service: + name: apache2 + state: restarted +``` +- **Become (повышение привилегий)** - Некоторые команды требуют прав администратора (sudo). Для этого используется `become`. +```yml +tasks: + - name: Установить Apache + ansible.builtin.apt: + name: apache2 + state: present + become: true # Повышение привилегий до sudo +``` +- **Loops (циклы)** - Ansible поддерживает выполнение задач в цикле +```yml +tasks: + - name: Установить список пакетов + ansible.builtin.apt: + name: "{{ item }}" + state: present + loop: + - apache2 + - mysql-server + - php +``` +- **Conditions (условия)** - Ansible позволяет выполнять задачи только при выполнении определённых условий с помощью `when`. +```yml +tasks: + - name: Установить Apache только на Ubuntu + ansible.builtin.apt: + name: apache2 + state: present + when: ansible_facts['os_family'] == "Debian" +``` \ No newline at end of file