Базовая настройка сервера с помощью Ansible

26/04/2020


Если раньше при установке любого сервера приходилось делать достаточно много рутинной работы по базовой настройке ручками. Теперь с помощью ролей Ansible или похожих инструментов эти задачи сводятся к минимуму с точки зрения затрат времени и усилий. Многие считают, что использование Ansible — это прерогатива DevOps инженеров. С моей точки зрения, на сегодняшний день это базовый инструмент, который должен быть в арсенале любого IT специалиста. Как установить нужные пакеты в операционной системе Linux, а также как сделать базовые настройки в ней с помощью Ansible покажу на примере, который я постоянно использую в реальной жизни. Сама роль из данного примера предельно простая. Этот код может служить в том числе и для учебных целей. С помощью нее можно начать создавать свои собственные конструкции в процессе обучения системе управления конфигурациями Ansible.

В своем блоге уже несколько раз поднимал тему Ansible. Это были статьи — Разворачиваем Django с Ansible, а также Тестируем Ansible роли с Molecule. В них мы рассмотрели практические аспекты использования Ansible, а также его вспомогательные инструменты. Автоматизация задач по администрированию и развертыванию настолько плотно входит в работу ITшников, что использование функционала Ansible становится рутинной процедурой. Давно уже сам для себя решил, что буду выкладывать в общий доступ на GitHub свои личные наработки. Начну с этой Ansible роли, которая доступна по ссылке — https://github.com/andreyuzb/ansiblerole-linux-common. Дальше по тексту мы разберем ее функционал, а также то, как работает сам Ansible при этом.

Реальная Ansible роль

Для того, чтобы скопировать роль к себе на компьютер достаточно выполнить команду — git clone https://github.com/andreyuzb/ansiblerole-linux-common. В результате мы получим все файлы из репозитария GitHub к себе локально.

Давайте поссмотрим на содержание файла /tasks/main.yml

---
- name: Install base packages
  apt: name={{ item }} state=installed
  with_items:
    - vim
    - tree
    - ntpdate
    - htop
    - git
    - wget
    - python-pip
    - python3-pip
    - openssl

- name: Place ntpdate cron file in cron.d
  template:
    src: ntpdate.j2
    dest: /etc/cron.d/ntpdate
    owner: root
    group: root
    mode: 0644

- name: Disable IPv6 default in sysctl
  sysctl:
    name: net.ipv6.conf.default.disable_ipv6
    value: '1'
    state: present
    reload: yes

- name: Disable IPv6 on all interfaces in sysctl
  sysctl:
    name: net.ipv6.conf.all.disable_ipv6
    value: '1'
    state: present
    reload: yes

- name: Disable IPv4 redirects accept in sysctl
  sysctl:
    name: net.ipv4.conf.all.accept_redirects
    value: '0'
    state: present
    reload: yes

- name: Disable IPv4 redirects send in sysctl
  sysctl:
    name: net.ipv4.conf.all.send_redirects
    value: '0'
    state: present
    reload: yes

В этом файле у нас сосредоточены основные действия, которые будут проводиться с вновь установленной операционной системой. Первым делом мы устанавливаем пакеты, которые необходимы в дальнейшем для работы. У каждого специалиста этот список разный и может сильно варьироваться. Это делается с помощью следующего набора команд.

- name: Install base packages
  apt: name={{ item }} state=installed
  with_items:
    - vim
    - tree
    - ntpdate
    - htop
    - git
    - wget
    - python-pip
    - python3-pip
    - openssl

Далее, я считаю крайне важным поддерживать корректное время в операционной системе. Это позволяет логам системы и приложений содержать достоверную информацию, а также облегчает мониторинг и траублшутинг. Для этого мы будем использовать утилиту ntpdate. В папке /templates нашей роли находится файлик ntpdate.j2. Этот файл в процессе выполнения роли копируется на сервер как /etc/cron.d/ntpdate. Данный процесс осуществляется с помощью модуля template, который постоянно применяется для создания тех или иных файлов на целевых серверах из шаблона на станции управления.

- name: Place ntpdate cron file in cron.d
  template:
    src: ntpdate.j2
    dest: /etc/cron.d/ntpdate
    owner: root
    group: root
    mode: 0644

Отдельно хочется сказать про установку ряда переменных в файле systcl.conf. Переменные из этого файла влияют на глобальную работу всей операционной системы. К примеру, я предпочитаю отключать IPv6 и IP redirect на серверах, потому что в 95 процентов случаях этот функционал не нужен, при этом он открывает хакерам лишние возможности для атак. Настройки переменной в файле sysctl.conf с помощью модуля sysctl Ansible показаны ниже.

- name: Disable IPv6 default in sysctl
  sysctl:
    name: net.ipv6.conf.default.disable_ipv6
    value: '1'
    state: present
    reload: yes

Как настроены остальные элементы этой роли, мои читатели могут узнать самостоятельно просмотрев соответствующие конфигурационные файлы. В этой статье не буду на них заострять внимание.

Заключение

Подводя итог данной статье, хочется сказать, что с одной стороны хотелось показать методику базовой настройки операционной системы при развертывании, а с другой стороны в статье приведены конкретные настройки, которые я часто использую в реальной жизни. Для специфичных настроек безопасности SSH, я оформляю отдельную Ansible роль. Также использую отдельные роли для IPTABLES и ряда параметров безопасности серверов. Постараюсь в ближайшем будущем про них также написать статьи в этом блоге. А какие методики Вы используете для первоначальной настройки операционных систем? Какие параметры и приложения устанавливаете? Пишите в комментариях!

Добавить комментарий

Ваш адрес email не будет опубликован.