S1E00, S1E01, S1E02, S1E03
Цель:
- Сделать 2 сервера - Prod и Stage
- Прописать на серверах production и stage для пользователя root, свой ssh ключ. Чтобы к серверам можно было подключаться по ssh без пароля.
- Если поднимал Vbox, убедись что на серверах есть интернет.
- Узнай IP адреса серверов. Тебе же надо как-то к ним подключаться.
- Отключи возможность входа на сервера по паролю.
- Разреши подключаться к серверам под рутом.
Предварительные таски:
Для виртуалок у меня две железки на Celeron J3455 по 4 ядра и 16 оперы - Thin и Storage. На обеих Oracle Linux 9.8. Собрал новый стенд пободрее, но никак не могу ввести в эксплуатацию.
Создавать буду две виртуалки на Thin. Виртуалки создаю с помощью Cockpit. Ранее в консоли повозился, чтобы это работало, но уже не помню, что делал и как.
Для начала обнаружил, что у меня время не синхронизируется. (Can't synchronise: no selectable sources (8 unreachable sources))
Пошел в консоль, глянул, что там в chrony.config - ntp.tpu.ru. Очевидно, что он помер или перестал быть публичным. Вписал в конфиг
pool ntp.msk-ix.ru pool ru.pool.ntp.org
Рестартанул и проверил (chronyc tracking) - все заработало.1
1. Создал две ВМ на Oracle Linux 9.8 из minimal ISO.
2. Ключики прописал для рута. Убедился в успешном входе
3. Установил MC, тем самым проверив интернет. Все ок
4. Настроил на микроте выдачу адресов для ВМок: Prod1 - 192.168.1.51, Stage1 - 192.168.1.61
5. и 6. Запретил вход для рута по паролю. Отключил парольный вход.
PermitRootLogin prohibit-password PasswordAuthentication no
S101 - Ansible
На стенде Storage установлен Ansible. Проблем не помню, потому не стал заново ставить. Проверил под юзером и создал структуру.
[lgc@storage ~]$ ansible --version ansible [core 2.14.18] config file = /etc/ansible/ansible.cfg configured module search path = ['/home/lgc/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.9/site-packages/ansible ansible collection location = /home/lgc/.ansible/collections:/usr/share/ansible/collections executable location = /usr/bin/ansible python version = 3.9.25 (main, Apr 27 2026, 00:00:00) [GCC 11.5.0 20240719 (Red Hat 11.5.0-11.0.2)] (/usr/bin/python3) jinja version = 3.1.2 libyaml = True
[lgc@storage ~]# mkdir -p lf/{group_vars|inventory|roles|templates}
[lgc@storage ~]# touch lf/{ansible.cfg,production.yml,stage.yml}Сгенерил ключик для юзера lgc и разнес по сервакам
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
До кучи добавил серваки в конфиг ssh, чтоб цепляться было проще.
[lgc@storage ~]$ cat .ssh/config Host stage1 Hostname 192.168.1.61 User root IdentityFile ~/.ssh/id_ed25519 Host prod1 Hostname 192.168.1.51 User root IdentityFile ~/.ssh/id_ed25519
Конфиг ансиблы маленько помучал:
[lgc@storage lf]$ cat ansible.cfg [defaults] host_key_checking = false fact_caching = jsonfile fact_caching_connection = /tmp/facts_cache gather_facts = true gather_subset = network, hardware interpreter_python = auto remote_user = root private_key_file = ~/.ssh/id_ed25519 log_path = /var/log/ansible.log [connection] pipelining = True [ssh_connection] pipelining = True
Итого:
Ансибл планирую запускать из-под юзера lgc. В следующих сериях перенастрою конфиг и ансибл будет не от рута ходить, а от специально созданного юзера
Код скинул (не скриншоты, а копипаста со своих серваков. Могу и скрины).
Параметры для конфига погуглил.
Путь до своего ssh ключа прописал.
Путь к файлу логов прописал.
S1E02
Для начала исправил косячок: перенес структуру из lf в lf/infra
[lgc@storage infra]$ cat inventory/stage.ini [web] lf-srv1 ansible_host=192.168.1.61 ansible_user=root [lgc@storage infra]$ cat inventory/prod.ini [web] lf-srv1 ansible_host=192.168.1.51 ansible_user=root
[WARNING]: log file at /var/log/ansible.log is not writeable and we cannot create it, aborting
После чего поправил в ansible.cfg путь до логов - ~/ansible.log. Наверное не самый хороший путь, но пока так.
[DEPRECATION WARNING]: DEFAULT_GATHER_SUBSET option, the module_defaults keyword is a more generic version and can apply to all calls to the M(ansible.builtin.gather_facts) or M(ansible.builtin.setup) actions, use module_defaults instead. This feature will be removed from ansible-core in version 2.18. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg
Нагуглил механизм — module_defaults,который добавляется в плейбук. Позже поизучаю
S1E03
В процессе выполнения с помощью -vvvv нашел косяк - вместо "ansible_host" у меня было "ansible-host"
В остальном без проблемов. К одинаковым именам серваков добавил хвостик ".среда" и поехали.
[lgc@storage infra]$ cat ansible.cfg | grep inv
inventory = ./hosts
[lgc@storage infra]$ cat hosts
lf-srv1.prod ansible_host=192.168.1.51 ansible_user=root
lf-srv1.stage ansible_host=192.168.1.61 ansible_user=root
[lgc@storage infra]$ ansible all -m ping
[DEPRECATION WARNING]: DEFAULT_GATHER_SUBSET option, the module_defaults keyword is a more generic version and can apply to all calls to the
M(ansible.builtin.gather_facts) or M(ansible.builtin.setup) actions, use module_defaults instead. This feature will be removed from ansible-core in version 2.18.
Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
lf-srv1.prod | SUCCESS => {
"changed": false,
"ping": "pong"
}
lf-srv1.stage | SUCCESS => {
"changed": false,
"ping": "pong"
}
[lgc@storage infra]$ ansible all -m ping --limit lf-srv1.stage
[DEPRECATION WARNING]: DEFAULT_GATHER_SUBSET option, the module_defaults keyword is a more generic version and can apply to all calls to the
M(ansible.builtin.gather_facts) or M(ansible.builtin.setup) actions, use module_defaults instead. This feature will be removed from ansible-core in version 2.18.
Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
lf-srv1.stage | SUCCESS => {
"changed": false,
"ping": "pong"
}Сообщения про deprecated можно отключить в ansible.cfg
[defaults] deprecation_warnings = False