5 min read

Настройка Debian для PR2100

Так как ранее я поставил Debian то будем его настраивать через ансибл.
На NASе установлена редакция minimal, а значит нет ниего лишнего. Нужно только установить необходимые пакеты и чуть поправить конфиги для совместимости с Cloud OS5.


[nas]
hub.local ansible_host=172.19.0.5 ansible_ssh_user=root ansible_ssh_pass=r00tme host_key_checking=False

прописываем хост в hosts, чтоб ансибл знал куда подключаться

По идеи все можно описать в одном плейбуке, но предположим что серверов у нас много и у каждого будет своя роль. Сначала подготовим структуру каталогов:

mkdir -p host_vars playbooks roles
mkdir -p roles/nas/{files, tasks, temlates}
mkdir -p roles/nas/files/root/wd
mkdir -p roles/nas/files/etc/{default, network, ssh}

У нас будет playbooks/nas.yml с таким содержимым:

- name: apply config to node
  hosts: nas
  remote_user: root
  gather_facts: no

  roles:
    - nas

gather_facts: no указывает ансиблу не собирать информацию о ноде. В нашем случае это ускорит выполнение плейбука.

В самом плейбуке никаких тасков нет, я их перенес в отдельную роль и указал на нее. В роли можно сразу перечислять таски:

- name: install packages
  apt:
    name:
      - hd-idle
      - mc
      - net-tools
      - git
      - sudo
      - python3
      - python3-serial
      - python3-smbus
      - docker
      - docker-compose
      - nfs-common
      - nfs-kernel-server 
    update_cache: yes

apt обновит кэш и установит все перечисленные пакеты

Настройка вентиятора

wdhwd как следует из названия это wd hardware daemon, он управляет вентилятором и кнопками. Сам по себе debian не умеет взаимодействовать с сенсорами, даже при наличии пакета lm_sensors, для этого комьюнити и написало wdhwd. Предварительно клонируем репозиторий с гита в files/root/wd.

- name: create wdhwd app directory
  file:
    path: /usr/local/lib/wdhwd
    state: directory
    mode: 0755

- name: copy wdhwd app
  copy:
    src: root/wd/
    dest: /usr/local/lib/wdhwd/
    owner: root
    group: root
    mode: 0755 

создаем на сервере каталог и копируем туда само приложение

- name: copy wdhwd config
  copy: 
    src: root/wd/tools/wdhwd.conf
    dest: /etc/wdhwd.conf
    owner: root
    group: root
    mode: 0664

- name: copy wdhwd service
  copy:
    src: root/wd/tools/wdhwd.service
    dest: /lib/systemd/system/wdhwd.service
    owner: root
    group: root
    mode: 0664
    
- name: create wdhwd log directory 
  file:
    path: /var/log/wdhwd
    state: directory
    mode: 0775

приносим конфиг, сервис и создаем каталог для логов

- name: reload systemd
  systemd:
    daemon_reload: true

- name: enable wdhwd service
  systemd:
    name: wdhwd.service
    enabled: true
    state: started

перечитываем список сервисов, включаем и стартуем wdhwd

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

fstab

Монтировать диски мы будем в каталоги volume1 и volume2 путем добавления записей в fstab. Сами записи однотипные и отличается только точкой монтирования и partuuid. Т.к. дисков у нас 3, а смонтировать надо 2 нужно сначала определить интересующие нас диски и разделы, а потом добавить записи в fstab. Ансибл умеет регистрировать переменные которые можно использовать в дальнейшем.

- name: create mnt directory 
  file:
    path: /mnt/{{ item }}
    state: directory
    mode: 0666
  with_items:
  - volume1
  - volume2

- name: create nfs directory
  file:
    path: /nfs/{{ item }}    
    state: directory
    mode: 0666
  with_items:
  - Public    
  - Public_2

создаем каталоги для монтирования

- name: search volume 1
  shell: for i in `lsblk |grep -E "T.*part" |awk '{print $1}' |awk -F"-" '{print $2}'`;do ls -l /dev/disk/by-partuuid/ |grep $i | awk '{print $9} ';done | head -n 1
  register: part1

- name: search volume 2 
  shell: for i in `lsblk |grep -E "T.*part" |awk '{print $1}' |awk -F"-" '{print $2}'`;do ls -l /dev/disk/by-partuuid/ |grep $i | awk '{print $9}';done |tail -n 1
  register: part2

- name: fix volume 1 mount
  lineinfile:
    path: /etc/fstab
    regexp: '^PARTUUID=([[:alnum:]]{1,8})-([[:alnum:]]{1,4})-([[:alnum:]]{1,4)-([[:alnum:]]{1,4})-([[:alnum:]]{1,12}) {{ part1.stdout }}'
    line: "PARTUUID={{ part1.stdout }}	/mnt/volume1               ext4    errors=remount-ro 0       1"

- name:fix volume 2 mount
  lineinfile:
    path: /etc/fstab
    regexp: '^PARTUUID=([[:alnum:]]{1,8})-([[:alnum:]]{1,4})-([[:alnum:]]{1,4)-([[:alnum:]]{1,4})-([[:alnum:]]{1,12}) {{ part2.stdout }}'
    line: "PARTUUID={{ part2.stdout }}  /mnt/volume2               ext4    errors=remount-ro 0       1"

ищем нужные partuuid и добавляем записи в fstab

- name: fix volume1 nfs mount
  lineinfile:
    path: /etc/fstab
    regexp: '^(/mnt/volume1) (/mnt/volume1)'
    line: '/mnt/volume1 /nfs/Public auto  defaults,nofail,nobootwait,bind 0 1'

- name: fix volume2 nfs mount
  lineinfile:
    path: /etc/fstab  
    regexp: '^(/mnt/volume2) (/mnt/volume2)'
    line: '/mnt/volume2 /nfs/Public_2 auto  defaults,nofail,nobootwait,bind 0 1'

- name: mount all
  shell: mount -a

монтируем каталог для NFS шары

Таким образом какие бы диски у нас ни были, в любом случае у нас все будет смонтировано в нужный каталог, дополнительно монитруем каталоги для nfs шары, чтоб не сломались маунты.

ssh

Так как у нас только один пользователь и это root, то оставлять ему возможность заходить по ssh не самая лушая идея, для этого создадим нового пользователя и группу

- name: Create ssh group
  group:
    name: ssh
    state: present

- name: Create ssh user
  user:
    name: ssh
    groups:
      - sudo
      - ssh
    home: /home/ssh
    shell: /bin/bash

- name: ssh directory
  file:
    path: /home/ansible/.ssh
    state: directory
    mode: 0700
    owner: ssh
    group: ssh

Мы добавили пользователя ssh в группу sudo, но для того чтоб он мог пользоваться sudo без пароля надо добавить в /etc/sudoers такую строку:

%sudo ALL=(ALL) NOPASSWD: ALL

Тут есть 2 варианта: можно добавить строку, но если нужно добавить больше 1-2 строк то имеет смысл принести файл целиком.

- name: fix sudo permissions
  lineinfile:
    path: /etc/sudoers        
    regexp: '^(%sudo) (%sudo)'
    insertafter: '^%sudo '
    line: '%sudo ALL=(ALL) NOPASSWD: ALL'

в теории должно работать

- name: copy sudoers
  copy: 
    src: etc/sudoers 
    dest: /etc/sudoers 
    owner: root 
    group: root 
    mode : 0440

Теперь можно заходить с логином ssh и пользоваться sudo, для полной секурности выключим пароль у рута и доступ по ссш по паролю предварительно закинув свой ссш ключ

- name: disable root password
  user:
    name: 'root'
    password: '!!'
    
- name: authorized key for ssh
  authorized_key:
    user: ssh
    key: "{{ lookup('file', 'authorized_keys') }}"
    
- name: sshd config
  copy:
    src: etc/ssh/sshd_config
    dest: /etc/ssh/sshd_config

Первоначальная настройка закончена

Docker

С докером вышла засада, я пытался запустить его таким образом чтоб он увидел все контейнеры созданные через приложение докера в OS5, в итоге все поломалось и пришлось переустанавливать все контейнеры, включая сам портейнер. В этом случае останется просто установить portainer и настраивать все "заново"

- name: install portainer
  shell: docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

Доп. софт и настройки

Тут можно побаловаться различными настройками, но мне сильно много не нужно.

- name: fix hd-idle conf
  lineinfile:
    path: /etc/default/hd-idle
    regexp: '^HD_IDLE_OPTS HD_IDLE_OPTS'
    line: 'HD_IDLE_OPTS="-i 1200 -l /var/log/hd-idle.log"'

Для начала научим диски засыпать

- name: enable volume1 share
  lineinfile:
    path: /etc/exports
    regexp: '^(/nfs/Public) (/nfs/Public)'
    line: '/nfs/Public 172.19.0.0/24(rw,async,no_subtree_check)'

- name: enable volume2 share
  lineinfile:
    path: /etc/exports
    regexp: '^(/nfs/Public_2) (/nfs/Public_2)'
    line: '/nfs/Public_2 172.19.0.0/24(rw,async,no_subtree_check)'

настраиваем nfs шары

- name: fix hostname
  hostname:
    name: hub

- name: fix hosts
  lineinfile:
    path: /etc/hosts
    regexp: '^(127.0.0.1        hub) (127.0.0.1 hub)'
    line: '127.0.0.1    hub'

- name: copy network config
  copy:
    src: etc/network/interfaces
    dest: /etc/network/interfaces
    owner: root
    group: root
    mode: 0644

меняем хостнейм и настраиваем сеть

- name: restart hd-idle
  service:
   state: restarted
   name: hd-idle.service

- name: restart nfs
  service:
   state: restarted
   name: nfs-kernel-server.service

- name: restart ssh
  service:
   state: restarted
   name: sshd.service

- name: restart network
  service:
   state: restarted
   name: networking.service

перезапускаем все затронутые сервисы и готово

В результате после запуска такого плейбука мы имеем настроенный сервер с минимальной потерей функциональности.