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

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


ansible:playbooks

Различия

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

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

Следующая версия
Предыдущая версия
ansible:playbooks [2023/11/30 08:38]
admin создано
ansible:playbooks [2024/11/21 11:01] (текущий)
admin
Строка 1: Строка 1:
 ====== Разные примеры ====== ====== Разные примеры ======
  
 +<details>
 +<summary>:!: Inventory</summary>
 +hosts.yml
 +<code yaml>
 +all:
 +  children:
 +    app_myApp:
 +      hosts:
 +        host_myApp_master:
 +          ansible_host: 10.10.40.204
 +
 +</code>
 +
 +hosts/myApp
 +<code yaml>
 +---
 +myApp_path: "/tank/secure/test_myApp/"
 +myApp_appname: "test_myApp.jar"
 +
 +</code>
 +
 +
 +group/all.yml
 +<code yaml>
 +#ansible_connection: winrm
 +#ansible_port: 5985
 +#ansible_winrm_transport: basic
 +#ansible_winrm_server_cert_validation: ignore
 +
 +ansible_connection: ssh
 +ansible_ssh_port: 22
 +
 +ansible_user: ansible
 +ansible_password: !vault |
 +  $ANSIBLE_VAULT;1.1;AES256
 +  31323664336536.......
 +
 +nexus_base_url: 'https://mysite.ru/repository'
 +nexus_username: jenkins
 +nexus_password: !vault |
 +  $ANSIBLE_VAULT;1.1;AES256
 +  3534534534......
 +
 +</code>
 +</details>
  
  
Строка 81: Строка 126:
 <details> <details>
 <summary> :!: Вариант с откатом</summary> <summary> :!: Вариант с откатом</summary>
-Restart_and_check.yml+Restart_and_check.yml\\ 
 +При запуске скрипта лучше сменить директорию, потом запустить, т.к. могут быть вские косяки из за системного каталога\\
 <code yaml> <code yaml>
 --- ---
-- name: "Перезапускаем сервис myService+- name: "Рестарт приложения
-  systemd+  win_shell| 
-    name: myService +    cd {{ myapp_path }} 
-    state: restarted +    ./restartMyApp.ps1 
-    enabledtrue +  async5 
-    daemon_reload: yes +  ignore_errors: yes 
-  ignore_errorstrue+  register: start_app 
 +  failed_whenstart_app.started != 1
  
-- name: "Пауза перед проверкой состояния+- name: "Ожидаем 5 сек" 
-  ansible.builtin.pause:+  pause:
     seconds: 5     seconds: 5
  
-- name: "Инициализация переменной+- name: "Проверяем запущен ли процесс
-  set_factservice_is_ok=false+  win_shell: "Get-Process -Id $(cat {{ myapp_path }}MyApp.pid) -ErrorAction SilentlyContinue | Format-Table -Property ProcessName 
 +  register: check_pid 
 +  failed_whencheck_pid.rc < 0
  
-- name: "Проверяем запущен ли сервис+- block: 
-  shell: +    - name: "Процесс отсутствует, откат обновления
-    cmd: "systemctl is-active myService.service &>/dev/null" +      import_tasks70-rollback.yml
-  ignore_errors: true +
-  register: check_service+
  
-- name"Флаг работающего сервиса" +  whencheck_pid.stdout == ''
-  set_fact: service_is_ok=true +
-  when: check_service is not failed+
 </code> </code>
 +
 +
  
  
 <code yaml> <code yaml>
 --- ---
- 
 - name: "Восстановливаем из бекапа" - name: "Восстановливаем из бекапа"
   shell:   shell:
Строка 123: Строка 169:
 </code> </code>
 </details> </details>
- 
  
 Бекап на винде Бекап на винде
Строка 135: Строка 180:
 </details> </details>
  
 +
 +
 +<details>
 +<summary>:!: Виндовый пример</summary>
 +плейбук:
 +<code yaml>
 +---
 +- hosts: myapp_group
 +  gather_facts: no
 +  become: yes
 +  become_method: runas
 +  become_user: "{{ ansible_user }}"
 +  roles:
 +    - myapp_deploy
 +
 +</code>
 +
 +
 +main
 +<code yaml>
 +---
 +- name: "Подготовка окружения"
 +  import_tasks: 10-prepare_host.yml
 +
 +- name: "Создаем бекап"
 +  import_tasks: 20-backup.yml
 +
 +- name: "Скачиваем новый jar-файл"
 +  import_tasks: 30-download.yml
 +
 +- name: "Обновляем конфиги"
 +  import_tasks: 40-config.yml
 +
 +- name: "Перезапускаем приложения"
 +  import_tasks: 50-restart_and_check.yml
 +
 +- block:
 +    - name: "Разворачиваем бекап"
 +      win_shell: "Expand-Archive -Force -LiteralPath {{ myapp_path }}'backups\\prev_version.zip' -DestinationPath {{ myapp_path }}"
 +
 +    - name: "Перезапускаем приложения"
 +      import_tasks: 50-restart_and_check.yml
 +  when: not process_running
 +
 +</code>
 +
 +
 +prepare
 +<code yaml>
 +---
 +- name: "Создание директорий"
 +  win_file:
 +    path: '{{ item }}'
 +    state: directory
 +  loop:
 +    - '{{ myapp_path }}'
 +    - '{{ myapp_path }}logs'
 +    - '{{ myapp_path }}backups'
 +    - '{{ myapp_path }}conf'
 +
 +</code>
 +
 +
 +backup
 +<code yaml>
 +---
 +- name: "Создаем бекап"
 +  win_shell: "Get-ChildItem -Path {{ myapp_path }} -Exclude @('backups', 'logs') |
 +    Compress-Archive -Force -DestinationPath {{ myapp_path }}backups\\prev_version.zip"
 +
 +</code>
 +
 +
 +download
 +<code yaml>
 +---
 +
 +- name: "Скачиваем jar из Nexus"
 +  maven_artifact:
 +    group_id: 'ru.myapp'
 +    artifact_id: 'myapp_id'
 +    version: '{{ myapp_version | default(omit) }}'
 +    repository_url: '{{ "%s/myapp-snapshots" | format(nexs_base_url) }}'
 +    username: '{{ nexs_username }}'
 +    password: '{{ nexs_password }}'
 +    dest: '{{ myapp_name }}'
 +    verify_checksum: 'always'
 +  delegate_to: localhost
 +
 +- name: "Копируем на целевой хост"
 +  copy:
 +    src: '{{ myapp_name }}'
 +    dest: '{{ "%s/%s" | format(myapp_path, myapp_name) }}'
 +
 +</code>
 +
 +
 +configs
 +<code yaml>
 +---
 +- name: "Скрипты запуска"
 +  win_template:
 +    src: '{{ item }}.j2'
 +    dest: '{{ "%s%s" | format(myapp_path, item) }}'
 +  loop:
 +    - start.ps1
 +    - restart.ps1
 +
 +- name: "Конфигурация приложения"
 +  win_template:
 +    src: '{{ item }}.j2'
 +    dest: '{{ "%s\conf\%s" | format(myapp_path, item) }}'
 +  loop:
 +    - config.toml
 +
 +- name: "Сертификаты"
 +  win_copy:
 +    src: '{{ item }}'
 +    dest: '{{ "%s%s" | format(myapp_path, item) }}'
 +  loop:
 +    - cacerts
 +    - cert.jks
 +    - _certs
 +
 +</code>
 +
 +
 +restart and check
 +<code yaml>
 +---
 +- name: "Перезапускаем приложение"
 +  win_shell: "{{ myapp_path }}restartmyApp.ps1"
 +  async: 5
 +  register: start_app
 +  failed_when: start_app.started != 1
 +  ignore_errors: true
 +
 +- name: "Пауза перед проверкой состояния"
 +  pause:
 +    seconds: 10
 +
 +- name: "Инициализация переменной"
 +  set_fact: process_running=false
 +
 +- name: "Проверяем запущен ли процесс"
 +  win_shell: "Get-Process -Id $(cat {{ myapp_path }}myapp.pid) -ErrorAction SilentlyContinue | Format-Table -Property ProcessName"
 +  register: check_pid
 +  failed_when: check_pid.rc < 0
 +  ignore_errors: true
 +
 +- name: "Флаг работающего процесса"
 +  set_fact: process_running=true
 +  when: check_pid.stdout != ''
 +
 +</code>
 +
 +
 +start.ps1.j2
 +<code yaml>
 +cd {{ myApp_path}}
 +(Start-Process java -ArgumentList "-Xmx4096m -Dapplication.env=PROD -jar {{ myapp_name }}" -passthru).ID > myApp.pid
 +
 +</code>
 +</details>
  
  
  
 <details> <details>
-<summary> :!:  </summary>+<summary> :!: Работа с переменными в плейбуке</summary> 
 + 
 +Проверка существования\\ 
 +Встречал вариант "**when: item is not defined**", но он очевидно не работает, проверка спокойно проходит\\ 
 +Хотя "is not defined" довольно распространено, оно похоже в цикле не применимо, она проверяет существование "item" а не то что в нее передаем, точно\\ 
 +А вариант с "in vars" работает даже с экстра переменными\\
 <code yaml> <code yaml>
 +---
 +- name: "10-check_vars | Проверка переменных"
 +  ansible.builtin.fail:
 +    msg: "{{ item }} is not defined"
 +  when: item not in vars
 +  loop:
 +    - my_var1
 +    - my_var2
 +    - my_var3
 +</code>
  
 +Развертывание словаря в шаблоне джинджи\\
 +В инвентори например такой словарь, точнее это список словарей\\
 +<code yaml>
 +my_dict_dests:
 +  - name: "dest_1"
 +    destDir: "/mytank/DEST/dest_1"
 +    transferType: "sftp"
 +    host: "10.10.10.40"
 +    user: "---"
 +    pass: "---"
 +
 +  - name: "dest_2"
 +    destDir: "/mytank/DEST/dest_2"
 </code> </code>
 +
 +Перечисляем все имеющиеся параметры в файле шаблона j2\\
 +т.к. фактически это список словарей, поэтому нужен вложенный цикл\\
 +<code yaml>
 +{% for dest in my_dict_dests%}
 +[[DestDir]]
 +{% for item in dest.items() %}
 +    {{ item[0] }} = "{{ item[1] }}"
 +{% endfor %}
 +{% endfor %}
 +</code>
 +
 +
 +<code yaml>
 +</code>
 +
 </details> </details>
  
Строка 148: Строка 401:
  
 <details> <details>
-<summary> :!:  </summary>+<summary>:!: Плагины поиска </summary> 
 +[[https://docs.ansible.com/ansible/latest/plugins/lookup.html]]\\ 
 +[[https://github.com/morphje/ansible_pass_lookup/blob/master/README.md]]\\ 
 + 
 +Python скрипт нужно поместить в папку "lookup_plugins" в папку с ролью\\
 <code yaml> <code yaml>
 +- debug:
 +    msg: "{{ lookup('pass', 'example/test create=true length=42')}}"
  
 +- debug:
 +    msg: "{{ lookup('custom_var', 'my_variable')}}"
 </code> </code>
 </details> </details>
Строка 157: Строка 418:
  
 <details> <details>
-<summary> :!:  </summary>+<summary>:!: Поиск и перебор файлов в ОС </summary> 
 +[[https://www.dmosk.ru/miniinstruktions.php?mini=ansible-examples#files]] 
 + 
 +<code yaml> 
 +- name: "find files" 
 +  find: 
 +    path: "/my-folder/" 
 +    file_type: file 
 +    patterns: "*.yml,*.yaml" 
 +    recurse: true 
 +  register: list_files 
 + 
 +- name: "show list" 
 +  debug: 
 +    msg: "file: {{ item }}" 
 +  loop: "{{ list_files.files | map(attribute='path') | list }}" 
 +</code> 
 +</details> 
 + 
 + 
 + 
 + 
 +<details> 
 +<summary>:!:  </summary>
 <code yaml> <code yaml>
  
 </code> </code>
 </details> </details>
ansible/playbooks.1701333503.txt.gz · Последнее изменение: 2023/11/30 08:38 — admin