LF
Yesterday

S1E00, S1E01, S1E02, S1E03

Цель:

  1. Сделать 2 сервера - Prod и Stage
  2. Прописать на серверах production и stage для пользователя root, свой ssh ключ. Чтобы к серверам можно было подключаться по ssh без пароля.
  3. Если поднимал Vbox, убедись что на серверах есть интернет.
  4. Узнай IP адреса серверов. Тебе же надо как-то к ним подключаться.
  5. Отключи возможность входа на сервера по паролю.
  6. Разреши подключаться к серверам под рутом.

Предварительные таски:

Для виртуалок у меня две железки на 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