Оптимізація сервера керування¶
У цьому розділі ми розглянемо параметри конфігурації, які можуть бути цікавими для оптимізації нашого сервера керування Ansible.
Файл конфігурації ansible.cfg
¶
Кілька цікавих параметрів конфігурації для коментарів:
-
forks
: за умовчанням 5, це кількість процесів, які Ansible запускатиме паралельно для зв’язку з віддаленими хостами. Чим вище це число, тим більшою кількістю клієнтів Ansible зможе керувати одночасно, і таким чином пришвидшити обробку. Значення, яке ви можете встановити, залежить від обмежень CPU/RAM вашого сервера керування. Зауважте, що значення за замовчуванням,5
, дуже мале, у документації Ansible зазначено, що багато користувачів встановлюють його на 50, навіть 500 або більше. -
gathering
: ця змінна змінює політику збору фактів. За замовчуванням значення єimplicit
, що означає, що факти збиратимуться систематично. Перемикання цієї змінної наsmart
дозволяє отримувати факти збору лише тоді, коли вони ще не зібрані. У поєднанні з кешем фактів (див. нижче) ця опція може значно підвищити продуктивність. -
host_key_checking
: Будьте обережні з безпекою свого сервера! Однак, якщо ви контролюєте своє середовище, може бути цікаво вимкнути керування ключами віддалених серверів і заощадити час на підключенні. Ви також можете на віддалених серверах вимкнути використання DNS сервера SSH (у/etc/ssh/sshd_config
, параметрUseDNS no
), цей параметр витрачає час під час з’єднання та найчастіше використовується лише в журналах з’єднань. -
ansible_managed
: ця змінна, яка за умовчанням міститьAnsible managed
, зазвичай використовується в шаблонах файлів, які розгортаються на віддалених серверах. Це дозволяє вказати адміністратору, що файл керується автоматично та що будь-які зміни, які вони вносять до нього, потенційно будуть втрачені. Може бути цікаво надати адміністраторам більш повне повідомлення. Будьте обережні, якщо ви зміните цю змінну, це може спричинити перезапуск демонів (через обробники, пов’язані з шаблонами). -
ssh_args = -C -o ControlMaster=auto -o ControlPersist=300s -o PreferredAuthentications=publickey
: вказує параметри підключення ssh. Вимкнувши всі методи автентифікації, окрім відкритого ключа, можна заощадити багато часу. Ви також можете збільшитиControlPersist
, щоб покращити продуктивність (документація припускає, що значення, еквівалентне 30 хвилинам, може бути відповідним). З’єднання з клієнтом залишатиметься відкритим довше та може бути повторно використано при повторному підключенні до того самого сервера, що значно економить час. -
control_path_dir
: вказує шлях до сокетів підключення. Якщо цей шлях занадто довгий, це може спричинити проблеми. Спробуйте змінити його на щось коротке, наприклад/tmp/.cp
. -
pipelining
: встановлення цього значення наTrue
підвищує продуктивність, зменшуючи кількість підключень SSH, необхідних під час запуску віддалених модулів. Ви повинні спочатку переконатися, що параметрrequiretty
вимкнено в параметрахsudoers
(див. документацію).
Кешування фактів¶
Збір фактів – процес, який може зайняти деякий час. Може бути цікаво вимкнути це збирання для playbooks, яким воно не потрібно (через параметр gather_facts
) або зберігати ці факти в пам’яті в кеші протягом певного періоду часу (наприклад, 24 години).
Ці факти можна легко зберегти в базі даних redis
:
sudo yum install redis
sudo systemctl start redis
sudo systemctl enable redis
sudo pip3 install redis
Не забудьте змінити конфігурацію ansible:
fact_caching = redis
fact_caching_timeout = 86400
fact_caching_connection = localhost:6379:0
Щоб перевірити правильність роботи, достатньо запитати сервер redis
:
redis-cli
127.0.0.1:6379> keys *
127.0.0.1:6379> get ansible_facts_SERVERNAME
Використання Vault¶
Різноманітні паролі та секрети не можна зберігати у вигляді відкритого тексту з вихідним кодом Ansible ні локально на сервері керування, ні в можливому менеджері вихідного коду.
Ansible пропонує використовувати менеджер шифрування: ansible-vault
.
Принцип полягає в шифруванні змінної або цілого файлу за допомогою команди ansible-vault
.
Ansible зможе розшифрувати цей файл під час виконання, отримавши ключ шифрування з файлу (наприклад) /etc/ansible/ansible.cfg
. Останній також може бути сценарієм python або іншим.
Відредагуйте файл /etc/ansible/ansible.cfg
:
#vault_password_file = /path/to/vault_password_file
vault_password_file = /etc/ansible/vault_pass
Збережіть пароль у цьому файлі /etc/ansible/vault_pass
і призначте необхідні обмежувальні права:
mysecretpassword
Потім ви можете зашифрувати файли за допомогою команди:
ansible-vault encrypt myfile.yml
Файл, зашифрований ansible-vault
, можна легко розпізнати за його заголовком:
$ANSIBLE_VAULT;1.1;AES256
35376532343663353330613133663834626136316234323964333735363333396136613266383966
6664322261633261356566383438393738386165333966660a343032663233343762633936313630
34373230124561663766306134656235386233323964336239336661653433663036633334366661
6434656630306261650a313364636261393931313739363931336664386536333766326264633330
6334
Після того, як файл зашифровано, його все ще можна редагувати за допомогою команди:
ansible-vault edit myfile.yml
Ви також можете перенести своє зберігання паролів у будь-який менеджер паролів.
Наприклад, щоб отримати пароль, який зберігатиметься в сховищі rundeck:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib.request
import io
import ssl
def get_password():
'''
:return: Vault password
:return_type: str
'''
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
url = 'https://rundeck.rockylinux.org/api/11/storage/keys/ansible/vault'
req = urllib.request.Request(url, headers={
'Accept': '*/*',
'X-Rundeck-Auth-Token': '****token-rundeck****'
})
response = urllib.request.urlopen(req, context=ctx)
return response.read().decode('utf-8')
if __name__ == '__main__':
print(get_password())
Робота з серверами Windows¶
Необхідно буде встановити на сервер управління кілька пакетів:
- Через менеджер пакетів:
sudo dnf install python38-devel krb5-devel krb5-libs krb5-workstation
і налаштуйте файл /etc/krb5.conf
, щоб указати правильні realms
:
[realms]
ROCKYLINUX.ORG = {
kdc = dc1.rockylinux.org
kdc = dc2.rockylinux.org
}
[domain_realm]
.rockylinux.org = ROCKYLINUX.ORG
- Через менеджер пакетів python:
pip3 install pywinrm
pip3 install pywinrm[credssp]
pip3 install kerberos requests-kerberos
Робота з IP модулями¶
Для мережевих модулів зазвичай потрібен модуль python netaddr
:
sudo pip3 install netaddr
Створення CMDB¶
Інструмент ansible-cmdb
був розроблений для створення CMDB з ansible.
pip3 install ansible-cmdb
Факти повинні бути експортовані ansible за допомогою наступної команди:
ansible --become --become-user=root -o -m setup --tree /var/www/ansible/cmdb/out/
Потім ви можете створити глобальний файл json
:
ansible-cmdb -t json /var/www/ansible/cmdb/out/linux > /var/www/ansible/cmdb/cmdb-linux.json
Якщо ви віддаєте перевагу веб-інтерфейсу:
ansible-cmdb -t html_fancy_split /var/www/ansible/cmdb/out/
Author: Antoine Le Morvan
Contributors: Steven Spencer, Ganna Zhyrnova