Настройка 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
перезапускаем все затронутые сервисы и готово
В результате после запуска такого плейбука мы имеем настроенный сервер с минимальной потерей функциональности.