Оптимізація рутинних операцій через Ansible.

ansible logo
На минулій, гори вона в пеклі, роботі все збирався систематизувати гору скриптів зліплених з batch, powershell, sysinternals suite, zenity, гівна і палок у вигляді чогось єдиноподібного. А точніше обєднати все ansibl-ом. Да все якось руки не доходили і от невелика систематизація уже зробленого і зауваження по тому як робити не треба.

Отже, як каже wikipedia:

Ansible — програмне забезпечення, що надає засоби для управління конфігурацією, оркестровки, централізованої установки застосунків і паралельного виконання типових завдань на групі систем.

Ну і по суті на цьому можна було б завершити. Для некосмічного масштабу задач все максимально чітко, логічно, з прекрасною документацією й, за великим рахунком, час розгортання готової до використання системи залежить від кількості задач що автоматизуються і від наявності уже готових заготовок для playbook-ів.

Серверна частина

Етап перший - установка. Можливі 3 варіанти:

  1. Windows/Cygwin ;
  2. Windows/WSL ;
  3. Linux .

Перший варіант не підходить. Да даний момент версія ansible там 2.8.4, не буде можливості встановити і використовувати модуль win_chocolatey, для якого треба мінімум 2.9, да і були моменти з установкою всіх необхідних модулів пітона. Варіанти 2-3 виглядають рівнозначно. Тому:

sudo apt install ansible python3 python-is-python3 python3-apt python3-pip

І доставляємо модуль для chocolatey:

ansible-galaxy collection install chocolatey.chocolatey

В результаті отримуємо в директорії /etc/ansible 2 файли:

-rw-r--r-- 1 root root 19985 Mar  5  2020 ansible.cfg
-rw-r--r-- 1 root root  1209 Feb 22 11:06 hosts

Файл конфігурації самого ansible та файл з групами хостів, для початку все закоментовано. У файл з групами хостів н.п. додаємо 2 категорії, для windows-pc та для linux-pc:

[winpc]
10.0.0.3

[winpc:vars]
ansible_user=admin
ansible_password=adminpassword
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore

[linpc]
10.0.0.2

[linpc:vars]
ansible_connection=ssh
ansible_ssh_user=ansible
ansible_ssh_pass=password

Тут у нас логін/пароль лежить у відкритому вигляді, можна, при бажанні, трохи підшифруватися.

  1. Створюємо файл
sudo ansible-vault create winpassword_vars.yml

з наступним вмістом

ansible_user: admin
ansible_password: adminpassword
  1. Плейбук виконуємо так
ansible-playbook --ask-vault-pass -e @winpassword_vars.yml myplaybook.yml

Для тесту пропінгуємо хости з групи winpc:

ansible winpc -i hosts -e @winpassword_vars.yml -m win_ping --ask-vault-pass
[sudo] password for deimos: **********
Vault password: **********
10.0.0.3 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

З шифруванням паролів якраз трохи можна заплутатися, в офіційній документації трохи коротко, а в інтернетах графомани копіпастять мануали 10-річної давності, на форумах буває 1 адекватний на 100 відповідей проскочить - “так правильно що не працює, це застаріло ще в 1.х :D”. Так що може можна якось простіше, поки обдумую.
Коли є групи хостів незмінні і такі що часто міняються, логічніше тримати їх у різних файлах інвентаризації і ці файли також можуть бути у форматі yaml. Наприклад 2 типи хостів з приведеного вище файлу hosts можуть бути розділені на 2 yml-файли:

winpc:
  hosts:
    10.0.0.3
  vars:
    ansible_connection: winrm
    ansible_winrm_server_cert_validation: ignore

та

linpc:
  hosts:
    10.0.0.2
  vars:
    ansible_connection: ssh

Тепер при виконанні плейбука треба явно вказувати файл інвентаризації де описані хости, інакше шукатиме в hosts . В результаті мабуть ще розумно зробити для довгих команд з купою параметрів аліаси і можна використовувати.

Цікавий модуль для візуалізації інформації про хости з інвенторі - ansible-cmdb.

ansible-cmdb

Можна використовувати теги, для виконання певник операцій, а не всього плейбука, на прикладі шаблону win_chocolatey_full_with_tags.yml.

---
- name: Install packages
  hosts: winpc

  tasks:
    - name: Ensure Chocolatey itself is installed
      win_chocolatey:
        name: chocolatey
        #source: http://someserver/chocolatey
      tags: choco_check

    - name: Install Chocolatey
      win_chocolatey:
        name: "{{ item }}"
        state: present
      loop:
      - chocolatey
      - chocolatey-core.extension
      tags: choco_present

    - name: Install Programs
      win_chocolatey:
        name: "{{ item }}"
        state: present
        #proxy_url: http://proxy-server:8080/
        #proxy_username: joe
        #proxy_password: p@ssw0rd
        #source: https://someserver/api/v2/
      loop:
      - 7zip.install
      - adobereader
      - anydesk.install
      - doublecmd
      - firefox
      - googlechrome
      - greenshot
      - libreoffice-fresh
      - microsoft-teams.install
      - notepadplusplus
      - office365business
      - paint.net
      - phonerlite
      - powerbi
      - sysinternals
      - vlc
      - vivaldi
      - xmind
      tags: choco_install

    - name: Choco Updater
      win_chocolatey:
        name: all
        state: latest
      tags: choco_upgrade
  

Тоді плейбук виконується з ключем --tags.

Налаштування Windows-клієнтів

Повинно бути виконано кілька умов:

  1. PowerShell >=3.0;
  2. .Net >=4.0;
  3. Ввімкнена служба WinRM;

Дві перші умови виконуються автоматично для Windows 10+.
Перевірити роботу служби:

WinRM enumerate winrm/config/listener

Увімкнути службу можна 2 способами:

  1. З прямим доступом до ПК де це вмикається:
 winrm quickconfig -q
 winrm set winrm/config/winrs @{MaxMemoryPerShellMB="300"}
 winrm set winrm/config @{MaxTimeoutms="1800000"}
 winrm set winrm/config/service @{AllowUnencrypted="true"}
 winrm set winrm/config/service/auth @{Basic="true"}
 sc config WinRM start=auto

або дозволити виконання PS-скриптів, що і так треба б зробити

@echo off
cls
color FC
net session >nul 2>&1
if %errorLevel% == 0 (powershell Set-ExecutionPolicy -Force -ExecutionPolicy Unrestricted) else (echo "Run as Administrator please...")
pause

і виконити скрипт з github

$url = "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"
$file = "$env:temp\ConfigureRemotingForAnsible.ps1"
(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
powershell.exe -ExecutionPolicy ByPass -File $file
  1. Через групові політики, якщо робити по нормальному: Інструкція.
    У двох словах:
    • Консоль Group Policy Management editor, перейти у розділ Computer Configuration/Policies/Windows Components/Windows Remote Management (WinRM) і активувати параметри Allow automatic configuration of listeners та Allow Basic Authentication, при цьому у пункті IPv4 filter задаємо значення *
    • Далі у розділі Computer Configuration/Policies/Windows Components/Windows Remote Shell активуємо пункт Allow Remote Shell Access
    • І прописуємо автозапуск у розділі Computer Configuration/Windows Settings/Security Settings/System Services

Тепер ще й можемо віддалено запускати програми, наприклад

winrs –r:remote-pc cmd

запустить у нас консоль віддаленого ПК де ми зможемо працювати так ніби це наш локальний ПК.

Налаштування Linux-клієнтів

Для доступу по паролю:

  1. Має стояти ssh на клієнті;
  2. Бути розкоментовано HOST_KEY_CHECKING = False у ansible.cfg на сервері.
ansible-playbook playbooks/lin_install.yml -l 10.0.0.8 -u ansible --ask-become-pass