From 5cdfb812db45481bb38d3e1a4687983f62397a94 Mon Sep 17 00:00:00 2001
From: ilyamak04 <makilya04@gmail.com>
Date: Fri, 4 Oct 2024 20:40:56 +0300
Subject: [PATCH] summary ansible:   :)

---
 ansible/ANSIBLE.MD | 148 ++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 147 insertions(+), 1 deletion(-)

diff --git a/ansible/ANSIBLE.MD b/ansible/ANSIBLE.MD
index 4c9469b..e47ceb1 100644
--- a/ansible/ANSIBLE.MD
+++ b/ansible/ANSIBLE.MD
@@ -645,7 +645,153 @@ server {
 - `ansible-vault decrypt secret.yml` - расшифровка файла
 - `ansible-vault view secret.yml` - cat для зашифрованного файла 
 - `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-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`:
+- Когда требуется динамическое выполнение в зависимости от условий.
+- Когда необходимо передать переменные или использовать цикл для включения.
\ No newline at end of file