Инструменты пользователя

Инструменты сайта


ansible:over

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
ansible:over [2023/08/05 05:09]
admin создано
ansible:over [2024/11/20 09:51] (текущий)
admin
Строка 1: Строка 1:
-<details> 
-<summary> :!: Концепция </summary> 
-Управление хостами, по сети, через ssh подключение, нужен беспарольный доступ с хоста ансибла на целевой хост\\ 
-При запуске плейбука из консоли, используется авторизованный пользователь, в файле **ansible.cfg** можно указать другого в параметре "remote_user"\\ 
- 
-В командах мы описываем желаемое состояние системы, при выполнении софт проверяет так ли это, если нет, то выполняет необходимые действия\\ 
-Команды можно выполнять одиночно из cli, либо объединять в файлы конфигурации т.н. плейбуки **"playbooks"**, описание в формате **yaml**\\ 
- 
-<details> 
-<summary> :!: Пример плейбука </summary> 
-Описано две задачи, сначала установка nginx, затем копирование файла 
- 
-<code yaml>  
-- hosts: web-servers 
-  tasks: 
-    - name: Installs nginx web server 
-      apt: pkg=nginx state=installed update_cache=true 
-    - name: Push future default virtual host configuration 
-      copy: src=files/site.conf dest=/etc/nginx/sites-enabled/ mode=0640 
-</code> 
-</details> 
- 
- 
-**Inventory** файл в котором хранится перечень целевых хостов, с которыми ведется работа. Так же здесь могут хранится переменные.\\ 
-По умолчанию **/etc/ansible/inventory/hosts**, можно задавать другое расположение через конфиг. Расширение добавлять не нужно\\ 
-Хосты могут объединяться в группы, с-но при выполнении можно указывать эти группы\\ 
- 
-<details> 
-<summary> :!: Пример файла инвертори </summary> 
-./inventory/hosts.yaml 
-<code yaml> 
-all: 
-  children: 
-    myGroup: 
-      vars: 
-        myVariable1: value 
-        myVariable2: value 
-        myVariable3: value 
-      hosts: 
-        alias1:  
-          ansible_host: 0.0.0.0 
-        alias2:  
-          ansible_host: 1.1.1.1 
-        alias3:  
-          ansible_host: 2.2.2.2 
-</code> 
-Непонятки с организацией этого инвентаря, полезная команда "ansible-inventory -i hosts.yaml --list" для отладки\\ 
- 
-Далее в коде доступны эти хосты и набор переменных к каждому 
-./test.yaml 
-<code yaml> 
-... 
-with_items: "{{ groups['myGroup'] }}" # Применить таску ко всем хостам из группы 
- 
-"{{ hostvars[item] }}" # Элемент группы, хост 
-"{{ hostvars[item][myVariable1-4] }}" # Во вложенном массиве доступна вся инфа о хосте, в т.ч. набор переменных из инвентори, персонализированный получается 
-</code> 
-</details> 
- 
- 
-**Roles**, роли используются для разделения плейбука на части, и организации файлов. Для роли создается каталог,  технически структура файлов может быть любой, но есть соглашение об конкретной организации файлов, что добавляет универсальности и порядка.\\ 
-Создание происходит автоматически, командой **$ ansible-galaxy init role-name**\\ 
-Особенность в том что роли могут быть вложенными т.е. составлять цепочку выполнения\\ 
-{{:ansible_roles.png?direct&300 |}} 
- 
- 
-Все переменные в ансибл **глобальные**, но есть замороченная **система уровней**, которая как то работает, и есть **куча нюансов**, так что с именованием нужно быть аккуратнее\\ 
-Хороший путь ансибл это максимально **простое и линейное описание** последовательного процесса, по возможности стоит максимально **исключить условия, циклы** и прочую логику из конфигов, лучше написать 10 тривиальных строк вместо одной "кучерявой"\\ 
-**Шаблоны** нечто иное как использование переменных типа **{ { inventory_hostname } }** (двойные скобки вместе), это собсна и есть "jinja2"- система шаблонов для python\\ 
-**notify** обработчик, который будет вызван в случае успешного выполнения задачи\\ 
-**handlers** описание обработчика, который может быть вызван по имени\\ 
-**ansible.cfg** основной конфиг\\ 
- 
-<details> 
-<summary> :!: Пример</summary> 
-[[https://riptutorial.com/ansible/example/21992/ansible-cfg|Тут есть более полное описание]] 
-<code yaml> 
-[defaults] 
-# Используемый инвентори 
-inventory = ./myhosts 
- 
-# Чтобы убрать предупреждение об автопоиске питона 
-interpreter_python = auto_silent 
- 
-# Подключаемый пользователь 
-remote_user = anuser 
- 
-# Отключение подтверждения нового ssh ключа 
-host_key_checking = False 
- 
-# Отключение сбора фактов 
-gathering = explicit 
-</code> 
-</details> 
-</details> 
- 
  
 ===== Использование ===== ===== Использование =====
Строка 253: Строка 157:
 Ключ для запроса в cmd: --ask-vault-pass Ключ для запроса в cmd: --ask-vault-pass
 Ключ для указания в  cmd: --vault-password-file Ключ для указания в  cmd: --vault-password-file
 +
 +
 +# ask password
 +--ask-vault-password, --ask-vault-pass
 +
 +# создать, сохранится зашифрованный
 +ansible-vault create new_file
 +
 +# расшифровать
 +ansible-vault decrypt file.txt --output file.txt_open
 +
 +# открыть для редактирования, при закрытии снова зашифруется
 +ansible-vault edit 
 +
 +ansible-vault view
 </code> </code>
 +
 +
 +<details>
 +<summary>:!: Пример расшифровки в консоли</summary>
 +
 +<code bash>
 +export chiphertext='$ANSIBLE_VAULT;1.1;AES256
 + 63363161346637313765383762356535366637653435313436623435666166326338346163303232
 + 6432313962643561306631303363613334303664666536350a653561613564343236313766646336
 + 66336363396339353734643732343833333135336662613038326435633831613935326434633865
 + 6631626366386234620a386332633965613436386337613138353762623566623461353034653832
 + 62306266396439656533636430643261376331616436656334376430386264656532'
 +
 +printf "%s\n" $chiphertext | ansible-vault decrypt
 +</code>
 +</details>
 +
 +
  
  
Строка 605: Строка 542:
 </code> </code>
 </details> </details>
 +
 +
 +<code yml>
 +  # become для винды
 +  become: yes
 +  become_method: runas
 +  become_user: "{{ admin_user }}"
 +</code>
 +
 +
 +<details>
 +<summary> :!: Запуск процессов Windows</summary>
 +Есть проблемы с синхронным/ассинхронным выполнением на хостах, бывает что ансиблом запускаешь процесс, все норм он запускается но завершается вместе с плейбуком т.к. плейбук по умолчанию работает в синхронном режиме, надо запускать в ассинхронном\\
 +<code yml>
 +- name: "test"
 +  win_shell: |
 +    cd {{ my_path }}
 +    ./myScript.ps1
 +  async: 15
 +  ignore_errors: yes
 +  register: start_app
 +  failed_when: start_app.started != 1
 +
 +
 +# Еще примеры запуска скриптов/процессов
 +- name: "Старт приложения"
 +  win_shell: |
 +    cd {{ my_path }}
 +    ./myScript.ps1
 +
 +
 +- name: "Старт приложения"
 +  win_shell: |
 +    cd {{ my_path }}
 +    (Start-Process java -ArgumentList "-Xmx4096m -Dapplication.env=PROD Main" -passthru).ID > myScript.pid
 +
 +# Рестарт
 +Stop-Process -Id $(cat myScript.pid)
 +./myScript.ps1
 +</code>
 +
 +
 +Переменная с результатом содержит примерно такой вывод, при условии что консоль продолжила работать\\
 +(и started и finished == 1)\\
 +Если консоль сразу же корректно завершилась то вывод не отличается, тобишь здесь можно отследить проблему именно при физическом запуске доп процесса, типа если pShell не сможет его запустить, а вот если приложение упадет после запуска, это уже надо другими способами проверять, хотя бы ПИД как минимум\\
 +<code bash>
 +ok: [host_mes_mds_prod] => {
 +    "msg": {
 +        "ansible_async_watchdog_pid": 1516,
 +        "ansible_job_id": "41177545019.4340",
 +        "changed": true,
 +        "cmd": "cd C:\\test_mds\\\n./startMDS2.ps1",
 +        "delta": "0:00:00.437520",
 +        "end": "2023-12-04 12:59:59.234763",
 +        "failed": false,
 +        "failed_when_result": false,
 +        "finished": 1,
 +        "rc": 0,
 +        "results_file": "C:\\Users\\ansible\\.ansible_async\\41177545019.4340",
 +        "start": "2023-12-04 12:59:58.797243",
 +        "started": 1,
 +        "stderr": "",
 +        "stderr_lines": [],
 +        "stdout": "",
 +        "stdout_lines": []
 +    }
 +}
 +</code>
 +</details>
 +
 +
 +
 +<details>
 +<summary> :!: Динамические группы инвентори</summary>
 +Смысл в том что можно в рантайме сформировать группу хостов, на основе каких то данных в нем, например факты или хостовые переменные\\
 +
 +Динамические группы формируются на все попадаемые значения, указанной переменной, содержатся только в памяти и к сожалению похоже нельзя вывести весь список, что усложняет работу с ними\\
 +
 +Так же использовать можно только в текущем плейбуке, "не отходя от кассы" что называется\\
 +Например:
 +<code yaml>
 +# Выполняем на всех хостах, группируем по знаяениям в хостовой переменной
 +- hosts: all
 +  gather_facts: no
 +  tasks:
 +    - name: Set 'appgrp_mgaimports'
 +      group_by:
 +        key: "{{ variable_in_host }}"
 +
 +# Далее запускаем плейбуки с определенными параметрами только для нужной группы
 +- hosts: value_1
 +  gather_facts: false
 +  roles:
 +    - my_role_for_1
 +
 +- hosts: value_2
 +  gather_facts: false
 +  roles:
 +    - my_role_for_2
 +
 +</code>
 +</details>
 +
 +
 +
 +=== Command & shell ===
 +**command** - работает чуть быстрее но запускается не через оболочку ("bin/sh"), поэтому в нем не доступны переменные окружения и прочие плюшки шелла, типа конвейеров, перенаправления вывода и проч\\
 +
 +
 +
 +
 +
 +<details>
 +<summary>:!: Результат команды в переменную</summary>
 +<code yaml>
 +- name: "Получаем имя из конфига"
 +  ansible.builtin.shell: "yq '.profile' {{ workdir }}{{ profile_config }}"
 +  register: try_name
 +
 +- name: "msg"
 +  debug:
 +    msg: "{{ try_name }}"
 +</code>
 +
 +
 +<code bash>
 +ok: [localhost] => {
 +    "msg": {
 +        "changed": true,
 +        "cmd": "yq '.profile' /home/path/my-file.yml",
 +        "delta": "0:00:00.121520",
 +        "end": "2024-11-20 12:35:49.242621",
 +        "failed": false,
 +        "failed_when_result": false,
 +        "rc": 0,
 +        "start": "2024-11-20 12:35:49.121101",
 +        "stderr": "",
 +        "stderr_lines": [],
 +        "stdout": "my-super-name",
 +        "stdout_lines": [
 +            "my-super-name"
 +        ]
 +    }
 +}
 +</code>
 +</details>
 +
 +
 +
 +<details>
 +<summary> :!: </summary>
 +<code yaml>
 +</code>
 +</details>
 +
ansible/over.1691212177.txt.gz · Последнее изменение: 2023/08/05 05:09 — admin