На минулій, гори вона в пеклі, роботі все збирався систематизувати гору скриптів зліплених з batch, powershell, sysinternals suite, zenity, гівна і палок у вигляді чогось єдиноподібного. А точніше обєднати все ansibl-ом. Да все якось руки не доходили і от невелика систематизація уже зробленого і зауваження по тому як робити не треба.
Отже, як каже wikipedia:
Ansible — програмне забезпечення, що надає засоби для управління конфігурацією, оркестровки, централізованої установки застосунків і паралельного виконання типових завдань на групі систем.
Ну і по суті на цьому можна було б завершити. Для некосмічного масштабу задач все максимально чітко, логічно, з прекрасною документацією й, за великим рахунком, час розгортання готової до використання системи залежить від кількості задач що автоматизуються і від наявності уже готових заготовок для playbook-ів.
Етап перший - установка. Можливі 3 варіанти:
Перший варіант не підходить. Да даний момент версія 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
Тут у нас логін/пароль лежить у відкритому вигляді, можна, при бажанні, трохи підшифруватися.
sudo ansible-vault create winpassword_vars.yml
з наступним вмістом
ansible_user: admin
ansible_password: adminpassword
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.
Можна використовувати теги, для виконання певник операцій, а не всього плейбука, на прикладі шаблону 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 10+.
Перевірити роботу служби:
WinRM enumerate winrm/config/listener
Увімкнути службу можна 2 способами:
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
Тепер ще й можемо віддалено запускати програми, наприклад
winrs –r:remote-pc cmd
запустить у нас консоль віддаленого ПК де ми зможемо працювати так ніби це наш локальний ПК.
Для доступу по паролю:
ansible-playbook playbooks/lin_install.yml -l 10.0.0.8 -u ansible --ask-become-pass