mirror of
https://github.com/ilyamak04/DevOps.git
synced 2025-04-05 23:34:50 +02:00
summary ansible: :)
This commit is contained in:
parent
336514b416
commit
5cdfb812db
@ -645,7 +645,153 @@ server {
|
|||||||
- `ansible-vault decrypt secret.yml` - расшифровка файла
|
- `ansible-vault decrypt secret.yml` - расшифровка файла
|
||||||
- `ansible-vault view secret.yml` - cat для зашифрованного файла
|
- `ansible-vault view secret.yml` - cat для зашифрованного файла
|
||||||
- `ansible-vault rekey secret.yml` - поменять пароль для зашифрованного файла
|
- `ansible-vault rekey secret.yml` - поменять пароль для зашифрованного файла
|
||||||
- `ansible-playbook playbook_vault.yml --vault-password-file mypassword.txt`
|
- `ansible-playbook playbook_vault.yml --vault-password-file mypassword.txt` - пароль для запуска плейбука берётся из файла
|
||||||
- **`ansible-playbook playbook.yml --ask-vault-pass`** - запуск плейбука с расшифровкой
|
- **`ansible-playbook playbook.yml --ask-vault-pass`** - запуск плейбука с расшифровкой
|
||||||
|
- `ansible-vault encrypt_string --stdin-name` "MyPassword" - зашифровать строку
|
||||||
|
- `echo -n "MyPassword" | ansible-vault encrypt_string` - зашифровать строку
|
||||||
|
---
|
||||||
|
- `ansible all -m ping -b --extra-vars '@vault.yml' --extra-vars "ansible_become_pass={{ vault_sudo_passwords[inventory_hostname] }}" --ask-vault-pass` - пинг хостов с разными паролями юзеров
|
||||||
|
|
||||||
|
### Роли
|
||||||
|
```bash
|
||||||
|
# init role
|
||||||
|
mkdir roles
|
||||||
|
cd roles
|
||||||
|
ansible-galaxy init first_role
|
||||||
|
```
|
||||||
|
```bash
|
||||||
|
# Структура роли
|
||||||
|
└── first_role
|
||||||
|
├── defaults
|
||||||
|
│ └── main.yml
|
||||||
|
├── files
|
||||||
|
├── handlers
|
||||||
|
│ └── main.yml
|
||||||
|
├── meta
|
||||||
|
│ └── main.yml
|
||||||
|
├── README.md
|
||||||
|
├── tasks
|
||||||
|
│ └── main.yml
|
||||||
|
├── templates
|
||||||
|
├── tests
|
||||||
|
│ ├── inventory
|
||||||
|
│ └── test.yml
|
||||||
|
└── vars
|
||||||
|
└── main.yml
|
||||||
|
```
|
||||||
|
`tasks/main.yml`: Здесь находятся задачи, которые выполняет роль. Это основной файл задач, аналогичный тем, что вы пишете в плейбуках. Можно разделить задачи по отдельным файлам и включать их в main.yml.
|
||||||
|
|
||||||
|
`handlers/main.yml`: Хендлеры, которые вызываются при изменении состояния задач. Они перезапускают сервисы, если это необходимо.
|
||||||
|
|
||||||
|
`files/`: В эту папку вы кладете файлы, которые должны быть скопированы на удаленные хосты с помощью модуля copy.
|
||||||
|
|
||||||
|
`templates/`: Здесь хранятся шаблоны Jinja2, которые можно использовать для создания динамических файлов конфигурации, применяя переменные.
|
||||||
|
|
||||||
|
`vars/main.yml`: Здесь определяются переменные для роли. Эти переменные имеют более высокий приоритет по сравнению с переменными из defaults.
|
||||||
|
|
||||||
|
`defaults/main.yml`: Здесь определяются переменные с наименьшим приоритетом. Они могут быть переопределены переменными из других файлов.
|
||||||
|
|
||||||
|
`meta/main.yml`: В этом файле содержатся метаданные роли, такие как ее зависимости от других ролей.
|
||||||
|
|
||||||
|
`tests/`: Папка для тестирования роли. Здесь можно хранить тестовые плейбуки и инвентарь.
|
||||||
|
|
||||||
|
**Приоритет переменных**
|
||||||
|
1. Переменные командной строки
|
||||||
|
2. Переменные в плейбуках
|
||||||
|
3. Переменные в `host_vars` или `group_vars`
|
||||||
|
4. Переменные роли из `vars/`
|
||||||
|
5. Переменные роли из `defaults/`
|
||||||
|
|
||||||
|
Зависимости можно указать в файле `meta/main.yml`. Например, если роль зависит от другой роли, то она будет автоматически вызвана:
|
||||||
|
```yml
|
||||||
|
dependencies:
|
||||||
|
- role: common
|
||||||
|
- role: security
|
||||||
|
```
|
||||||
|
|
||||||
|
Роль можно протестировать с помощью специального тестового плейбука. Например, в папке `tests/` может быть файл `test.yml`, который проверяет работу роли:
|
||||||
|
```yml
|
||||||
|
- hosts: localhost
|
||||||
|
roles:
|
||||||
|
- myrole
|
||||||
|
```
|
||||||
|
Для тестирования можно просто запустить этот плейбук:
|
||||||
|
```bash
|
||||||
|
ansible-playbook tests/test.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
**Разница между `defaults/` и `vars/`**
|
||||||
|
|
||||||
|
- `defaults/` может содержать такие переменные, как версии ПО, которые можно легко изменить для разных окружений.
|
||||||
|
|
||||||
|
- `vars/` будет содержать важные и фиксированные настройки, такие как адреса серверов или пути к файлам, которые редко меняются.
|
||||||
|
|
||||||
|
```yml
|
||||||
|
# Пример плейбука
|
||||||
|
- name: Playbook
|
||||||
|
hosts: all
|
||||||
|
become: yes
|
||||||
|
|
||||||
|
roles:
|
||||||
|
- { role: my_role, when: ansible_system == "Linux" }
|
||||||
|
```
|
||||||
|
В условии можно использовать логически операторы (`and`, `or` и `not (!=)`)
|
||||||
|
```yml
|
||||||
|
- { role: my_role, when: ansible_distribution == "Ubuntu" and ansible_distribution_version == "20.04" }
|
||||||
|
```
|
||||||
|
Если переменная может быть не определена, можем проверить её наличие
|
||||||
|
```yml
|
||||||
|
- { role: my_role, when: my_var is defined }
|
||||||
|
```
|
||||||
|
Можно проверять значения словаря в списках
|
||||||
|
```yml
|
||||||
|
- { role: my_role, when: my_dict.key == "value" }
|
||||||
|
```
|
||||||
|
### extra-vars
|
||||||
|
|
||||||
|
```yml
|
||||||
|
- name: Playbook
|
||||||
|
hosts: "{{ MYHOST }}"
|
||||||
|
become: yes
|
||||||
|
|
||||||
|
roles:
|
||||||
|
- my_role
|
||||||
|
```
|
||||||
|
**Как передать переменную в плейбук?**
|
||||||
|
```bash
|
||||||
|
ansible-playbook playbook.yml --extra-var "MYHOSTS=STAGING"
|
||||||
|
```
|
||||||
|
Можно писать:
|
||||||
|
- --extra-var
|
||||||
|
- --extra-vars
|
||||||
|
- -e
|
||||||
|
|
||||||
|
`extra-var` имеет наивысший приоритет и переопределяет все остальные переменные, т.к. это оп сути переменная внутри плейбука
|
||||||
|
|
||||||
|
### import и include
|
||||||
|
|
||||||
|
- `import_*` - загружает все задачи из указанного файла на этапе **разбора плейбука (parse time)**, то есть перед выполнением задач
|
||||||
|
- `include_*` - Загружает задачи динамически на этапе выполнения **(runtime)**
|
||||||
|
- `include_tasks`
|
||||||
|
```yml
|
||||||
|
- name: Include tasks dynamically
|
||||||
|
include_tasks: dynamic_tasks.yml
|
||||||
|
```
|
||||||
|
- `import_playbook` - загружает целый плейбук на этапе разбора **(parse time)**
|
||||||
|
- `include_playbook` - устарела
|
||||||
|
- `import_role`
|
||||||
|
```yml
|
||||||
|
- name: Import a role
|
||||||
|
import_role:
|
||||||
|
name: webserver
|
||||||
|
```
|
||||||
|
|
||||||
|
Когда использовать `import`, а когда `include`?
|
||||||
|
|
||||||
|
`import`:
|
||||||
|
- Когда нужно загрузить фиксированный набор задач, плейбуков или ролей.
|
||||||
|
- Когда условия и переменные известны на этапе разбора (parse time).
|
||||||
|
|
||||||
|
`include`:
|
||||||
|
- Когда требуется динамическое выполнение в зависимости от условий.
|
||||||
|
- Когда необходимо передать переменные или использовать цикл для включения.
|
Loading…
x
Reference in New Issue
Block a user