Являясь большим фанатом данной системы виртуализации, решил поделиться несколько иным способом установки.

Если кратко, то Proxmox это система виртуализации на KVM, которая ещё умеет управляться с контейнерами LXC. Также имеется возможность кластеризации(для некоммерческой версии ограничение около 8 нод). Умеет работать с Ceph, ZFS. Если подробно, то советую почитать вики или посмотреть ютуб.

Варианты установки


Дело в том, что ProxmoxVE можно установить при помощи образа, который предоставляется на скачивание, но тогда вам вряд ли будут доступны варинты разбивки с использованием soft-raid для Linux и прочие извращения(если что-то некритичное по производительности — почему нет?). Отдельное спасибо товарищу @merlin_vrn за знакомство с Proxmox, и Alex Filimonov за помощь с Ansible.

Существует вариант, когда вы сами ставите Debian актуальной версии именно так как вы хотите, а уже дальше устанавливаете ProxmoxVE как некую надстройку, которая вам заменяет ядро, linux-firmware, lvm, устанавливает свой репозиторий и уже отчасти перестаёт быть Debian. В этом случае у вас гораздо больше пространства для свободы(к примеру, недавно я ставил по сети Debian через liveusb Archlinux используя debootstrap).

Процедура установки Proxmox описана в вики.

Ещё один плюс Proxmox в том, что после установки вы получите отличную, а главное актульную документацию на том же веб-сервере, что и сама управлялка. Доступна документация по ссылке

https://ip_or_domain/pve-docs/pve-admin-guide.html

Сначала я думал написать статью с использованием Preseed, который бы использовался для изначальной установки Debian, но поразмыслив я понял, что вариантов установки может быть огромная масса и установить Debian уж всем по силам. Итак, полагаем, что сам Debian Stretch(stable на данный момент) у вас уже установлен, сеть настроена статикой, работает sshd и вы уже прокинули ключ через ssh-copy-id. Так же, представим, что у вас уже есть некий опыт работы с Ansible.

Использование Ansible


В Ansible имеется ansible-galaxy, в котором достаточно просто найти уже готовые роли под ваши нужны, или же просто почитать как и что пишут другие люди. В Ansible-galaxy можно выполнять вход через github-аккаунт и далее уже шарить определённые репозитории. Подробнее о том, как это делать написано тут.

Я создал роль и пошарил её в ansible-galaxy. Теперь мы её можем легко установить, используя команду:

ansible-galaxy install tenhishadow.pve_on_debian

Соответственно теперь мы можем пользоваться этой ролью:

# ls -l /etc/ansible/roles/tenhishadow.pve_on_debian/
итого 68
drwxr-xr-x. 2 root root  4096 ноя 16 22:46 defaults
drwxr-xr-x. 2 root root  4096 ноя 16 22:46 handlers
-rw-rw-r--. 1 root root 35147 ноя 16 22:45 LICENSE
drwxr-xr-x. 2 root root  4096 ноя 16 22:46 meta
-rw-rw-r--. 1 root root  1916 ноя 16 22:45 README.md
drwxr-xr-x. 2 root root  4096 ноя 16 22:46 tasks
drwxr-xr-x. 2 root root  4096 ноя 16 22:46 templates
drwxr-xr-x. 2 root root  4096 ноя 16 22:46 tests
drwxr-xr-x. 2 root root  4096 ноя 16 22:46 vars

Создадим файл hosts для Ansible, который будет нашим Inventory:

[proxmox_target]
192.168.102.51

Теперь можем запускать:

# ansible-playbook -i hosts testplaybook.yml 

Результат:

PLAY [proxmox_target] *

TASK [Gathering Facts] *
ok: [192.168.102.51]

TASK [tenhishadow.pve_on_debian : set hostname for the system] *
changed: [192.168.102.51]

TASK [tenhishadow.pve_on_debian : modify /etc/hosts] *
changed: [192.168.102.51]

TASK [tenhishadow.pve_on_debian : check standart repos] *
changed: [192.168.102.51] => (item=deb http://security.debian.org/ stretch/updates main contrib non-free)
changed: [192.168.102.51] => (item=deb-src http://security.debian.org/ stretch/updates main contrib non-free)
changed: [192.168.102.51] => (item=deb http://mirror.yandex.ru/debian/ stretch main contrib non-free)
changed: [192.168.102.51] => (item=deb-src http://mirror.yandex.ru/debian/ stretch main contrib non-free)
changed: [192.168.102.51] => (item=deb http://mirror.yandex.ru/debian/ stretch-updates main contrib non-free)
changed: [192.168.102.51] => (item=deb-src http://mirror.yandex.ru/debian/ stretch-updates main contrib non-free)

TASK [tenhishadow.pve_on_debian : add pve repository key] *
changed: [192.168.102.51]

TASK [tenhishadow.pve_on_debian : add pve-no-subscription repo] *
changed: [192.168.102.51]

TASK [tenhishadow.pve_on_debian : update system] *
changed: [192.168.102.51]

TASK [tenhishadow.pve_on_debian : install proxmox packages] *
changed: [192.168.102.51] => (item=[u'proxmox-ve', u'postfix', u'bridge-utils'])

TASK [tenhishadow.pve_on_debian : remove os prober to prevent injuring VMs] *
changed: [192.168.102.51] => (item=[u'os-prober'])

TASK [tenhishadow.pve_on_debian : search for standard kernels] *
changed: [192.168.102.51]

TASK [tenhishadow.pve_on_debian : remove standart kernels] *
changed: [192.168.102.51] => (item=[u'linux-image-4.9.0-4-amd64', u'linux-image-amd64'])

TASK [tenhishadow.pve_on_debian : configure network from template] *
changed: [192.168.102.51]

TASK [tenhishadow.pve_on_debian : rebooting the server] *
changed: [192.168.102.51]

TASK [tenhishadow.pve_on_debian : waiting for server to come back] *
k: [192.168.102.51 -> localhost]

TASK [tenhishadow.pve_on_debian : remove enterprise repo] *
changed: [192.168.102.51]

TASK [tenhishadow.pve_on_debian : install several packages] *
changed: [192.168.102.51] => (item=chrony)
changed: [192.168.102.51] => (item=htop)
ok: [192.168.102.51] => (item=telnet)
changed: [192.168.102.51] => (item=nmap)
changed: [192.168.102.51] => (item=screen)
changed: [192.168.102.51] => (item=tcpdump)
changed: [192.168.102.51] => (item=iptraf)
changed: [192.168.102.51] => (item=sudo)
ok: [192.168.102.51] => (item=bridge-utils)

TASK [tenhishadow.pve_on_debian : set timezone] *
changed: [192.168.102.51]

TASK [tenhishadow.pve_on_debian : generate locales] *
ok: [192.168.102.51] => (item=en_US.UTF-8)
changed: [192.168.102.51] => (item=ru_RU.UTF-8)

TASK [tenhishadow.pve_on_debian : configure chrony] *
changed: [192.168.102.51]

TASK [tenhishadow.pve_on_debian : start and enable chrony] *
ok: [192.168.102.51]

TASK [tenhishadow.pve_on_debian : configure journald] *
changed: [192.168.102.51]

RUNNING HANDLER [tenhishadow.pve_on_debian : restart networking] *
changed: [192.168.102.51]

RUNNING HANDLER [tenhishadow.pve_on_debian : restart chrony] *
changed: [192.168.102.51]

RUNNING HANDLER [tenhishadow.pve_on_debian : restart journald] *
changed: [192.168.102.51]

PLAY RECAP *
192.168.102.51             : ok=24   changed=21   unreachable=0    failed=0

Если кратенько, то плейбук делает всё тоже самое, что описано в вики, но не ставит openiscsi(он много ошибок пишет, если не настроен). + конфигурирует сеть, используя bridge-utils(для старта хватит, вы можете легко переопределить на openvswitch, если надо). Так же удаляются стандартные ядра и ребутается сервер.

Из интересного меня немного застопорило то, как удалить старые ядра и перезагрузить сервер, но покопавшись в документации dpkg и Ansible я нашёл выход:

- name: search for standard kernels
  shell: "$( which dpkg ) --get-selections linux-image* | $( which grep ) -i install | $(which awk) '{print $1}'"
  args:
    executable: /bin/bash
  register: standart_kernels_installed

- name: remove standart kernels
  apt:
    name: "{{ item }}"
    state: absent
  with_items: "{{ standart_kernels_installed.stdout_lines|default([]) }}"

- name: rebooting the server
  shell: nohup bash -c "sleep 2s && reboot" &
  async: 0
  poll: 0
  ignore_errors: yes
  register: reboot
  tags: reboot

- name: waiting for server to come back
  local_action: wait_for host={{ proxmox_ip }} state=started
  when: reboot.changed
  async: 2400
  poll: 10
  tags: reboot

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

Где-то в середине плейбука target-хост будет перезагружен, Ansible дождётся (будет ждать 2400 секунд, проверяя каждые 10 доступность) когда нода опять будет жива, и потом сконфигурирует journald и chrony. Далее установит пару утилит и на этом всё, вас будет ждать готовый Proxmox.

Комментарии (8)


  1. Rathil
    17.11.2017 03:06

    Вот на днях тоже игрался. Настраивал шард, так и не вышло.
    Система забавная и удобная, однако нужны прямые руки (которых, по всей видимости, у меня нет)


  1. tankistua
    17.11.2017 09:29

    Вряд ли, возможно — ну прям статья для админов.
    Проксмокс уже полностью смотрит в сторону зфс, raidz разного уровня уже используются по-умолчанию. С официального образа можно установить как душе угодно.


    1. tenhi_shadow Автор
      17.11.2017 10:05

      это да. Но с официального я ставил только один раз, когда ещё был pve 3


    1. tenhi_shadow Автор
      17.11.2017 10:16

      админы неплохие люди. Я там вон сверху написал, «хочу поделиться вариантом установки». Ещё вопросы? Я не думаю, что можно автоматизировать установку с офф дистрибутива, скажем сразу на 80 нод, а тут можно.


  1. VGusev2007
    17.11.2017 12:07

    Благодарю.
    Разберу по кусочкам, сейчас интересен код:

    — name: modify /etc/hosts
    lineinfile:
    path: /etc/hosts
    line: "{{ proxmox_ip }} {{ ansible_hostname }} {{ ansible_fqdn }} pvelocalhost"

    Когда добавляешь ноду, задолбало это делать руками.


    1. tenhi_shadow Автор
      17.11.2017 12:19

      а что конкретно интересует?)
      proxmox_ip задаётся в плейбуке
      ansible_hostname берётся из фактов о системе
      ansible_fqdn из плейбука

      Используется Jinja
      Посмотреть можно тут:
      docs.ansible.com/ansible/latest/playbooks_templating.html

      Этот код применим для первоначальной установки и там и должна быть одна нода

      Вас интересует добавление ноды в кластер и изменение /etc/hosts соответственно?


      1. VGusev2007
        17.11.2017 12:52

        Вас интересует добавление ноды в кластер и изменение /etc/hosts соответственно?


        Верно. Когда в кластере больше пяти нод, процесс добавления начинает утомлять.


        1. tenhi_shadow Автор
          17.11.2017 13:09

          ну если по-бырому и неаккуратно, то за 3 минуты накидал такой плейбук:
          Inventory:

          [testcluster]
          192.168.168.10
          192.168.168.11
          192.168.168.12
          192.168.168.13
          192.168.168.14
          


          Playbook:
          ---
          - hosts: testcluster
            gather_facts: false
            tasks:
             - name: set hosts
                 path: /etc/hosts
                 backup: yes
                 create: no
                 line: "{{ item }}"
                 owner: root
                 group: root
                 mode: u=rw,g=r,o=r
                 state: present
               with_items:
                 - "192.168.168.10 proxmox01.testlab.lan proxmox01" 
                 - "192.168.168.11 proxmox02.testlab.lan proxmox02"
                 - "192.168.168.12 proxmox03.testlab.lan proxmox03"
                 - "192.168.168.13 proxmox04.testlab.lan proxmox04"
                 - "192.168.168.14 proxmox05.testlab.lan proxmox05"
          ...
          


          Это создаст на всех нодах примерно такое:
          ::1     localhost ip6-localhost ip6-loopback
          ff02::1 ip6-allnodes
          ff02::2 ip6-allrouters
          192.168.168.10 proxmox01.testlab.lan proxmox01 pvelocalhost
          
          192.168.168.10 proxmox01.testlab.lan proxmox01 
          192.168.168.11 proxmox02.testlab.lan proxmox02
          192.168.168.12 proxmox03.testlab.lan proxmox03
          192.168.168.13 proxmox04.testlab.lan proxmox04
          192.168.168.14 proxmox05.testlab.lan proxmox05
          
          


          Как видите, немного костыльно в том плане, что есть запись с pvelocalhost и без pvelocalhost. Но это по-бырому(вроде будет работать и так :) ). А так вы вполне можете задуматься над использованием фактов(что более правильно). И потом уже через template сбацать это дело.