Как установить Node.js на Astra Linux с использованием подходов Infrastructure as Code (IaC)?

«Как установить Node.js на Astra Linux с использованием подходов Infrastructure as Code (IaC)?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps установка ПО — это не ручная операция, а процесс, описанный кодом для обеспечения повторяемости и контроля версий. Для установки Node.js на серверы под управлением Astra Linux я бы использовал следующие подходы:

1. Использование системы управления конфигурацией (Ansible): Это наиболее гибкий способ, который позволяет описать состояние сервера декларативно.

Playbook nodejs.yml:

---
- name: Install Node.js on Astra Linux
  hosts: all
  become: yes
  vars:
    node_version: "18.x"
  tasks:
    - name: Install prerequisites (curl, gnupg)
      apt:
        name:
          - curl
          - gnupg2
        state: present
        update_cache: yes

    - name: Add NodeSource signing key
      apt_key:
        url: "https://deb.nodesource.com/gpgkey/nodesource.gpg.key"
        state: present

    - name: Add NodeSource repository
      apt_repository:
        repo: "deb https://deb.nodesource.com/node_{{ node_version }} {{ ansible_distribution_release }} main"
        state: present
        filename: "nodesource"
        # Для Astra может потребоваться указать аналог кодового имени Debian
        # Например, если Astra основана на Debian 10 (buster):
        # repo: "deb https://deb.nodesource.com/node_{{ node_version }} buster main"

    - name: Install Node.js and npm
      apt:
        name:
          - nodejs
        state: present
        update_cache: yes

    - name: Verify installation
      command: node --version
      register: node_version_result
    - debug:
        msg: "Node.js {{ node_version_result.stdout }} installed successfully."

Запуск: ansible-playbook -i inventory.ini nodejs.yml.

2. Создание кастомного Docker-образа (если работа в контейнерах): Если приложение будет запускаться в контейнерах, то создаю Dockerfile на основе официального образа Node.js или собираю свой с нуля.

Dockerfile для Astra-подобной базы:

# Используем минимальный базовый образ Astra или Debian
FROM debian:buster-slim

# Устанавливаем зависимости и Node.js
RUN apt-get update && apt-get install -y 
    curl 
    gnupg2 
    && curl -fsSL https://deb.nodesource.com/setup_18.x | bash - 
    && apt-get install -y nodejs 
    && apt-get clean 
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

COPY . .
CMD ["node", "index.js"]

Этот образ затем пушится в registry и разворачивается через Kubernetes или Docker Swarm.

3. Использование Packer для создания предварительно настроенных образов (Golden Images): Для виртуальных машин или контейнеров можно создать образ с уже установленным Node.js.

Шаблон Packer astra-nodejs.pkr.hcl:

source "qemu" "astra-nodejs" {
  iso_url      = "https://repo.astralinux.ru/astra/stable/1.7/iso/..."
  iso_checksum = "sha256:..."
  # ... другие параметры QEMU
}

build {
  sources = ["source.qemu.astra-nodejs"]

  provisioner "shell" {
    inline = [
      "apt-get update",
      "apt-get install -y curl gnupg2",
      "curl -fsSL https://deb.nodesource.com/setup_18.x | bash -",
      "apt-get install -y nodejs",
      "node --version"
    ]
  }
}

4. Альтернатива: Установка из бинарных архивов (если внешние репозитории недоступны): В строго изолированных средах (air-gapped) можно скачать бинарный tarball с nodejs.org и распространять его с помощью артефактов CI/CD или внутреннего репозитория.

Ansible задача для установки из tarball:

- name: Download Node.js binary archive
  get_url:
    url: "https://nodejs.org/dist/v18.17.1/node-v18.17.1-linux-x64.tar.xz"
    dest: "/tmp/node.tar.xz"
    checksum: "sha256:..."

- name: Extract archive to /usr/local
  unarchive:
    src: "/tmp/node.tar.xz"
    dest: "/usr/local"
    remote_src: yes
    creates: "/usr/local/node-v18.17.1-linux-x64"

- name: Create symlinks in /usr/bin
  file:
    src: "/usr/local/node-v18.17.1-linux-x64/bin/{{ item }}"
    dest: "/usr/local/bin/{{ item }}"
    state: link
    force: yes
  loop:
    - node
    - npm
    - npx

Ключевой вывод: В DevOps установка ПО — это код (Ansible, Dockerfile, Packer), который хранится в репозитории, проверяется через CI/CD и применяется единообразно ко всем серверам, что исключает дрейф конфигурации и человеческие ошибки.