RU | EN | DE

Пишем первый код (“Hello World”) 📝

Давай прикажем Паппету создать файл. Не вручную, а через код.

  1. Перейди в папку с “манифестами” (это инструкции для Puppet):
cd /etc/puppetlabs/code/environments/production/manifests
  1. Создай главный файл site.pp:
sudo nano site.pp
  1. Вставь туда этот код (это язык Puppet DSL):
file { '/tmp/hello_vitaliy.txt':
  ensure  => present,
  content => "Привет! Это мой первый файл, созданный через Puppet.\n",
  mode    => '0644',
}

(Мы говорим: “Я хочу, чтобы файл /tmp/hello_vitaliy.txt существовал, с таким-то текстом”).

  1. Сохрани (Ctrl+O, Enter, Ctrl+X).

  2. Примени магию: Запусти агента:

sudo puppet agent -t

Если ты увидишь Notice: /Stage[main]/Main/File[/tmp/hello_vitaliy.txt]/ensure: created, значит Puppet сам создал файл! Можешь проверить: cat /tmp/hello_vitaliy.txt.

Пробуем применять на клиенте

1. Иди на Linux-сервер: Открой главный файл манифеста:

sudo nano /etc/puppetlabs/code/environments/production/manifests/site.pp

2. Добавь туда этот код: (Сотри старое, если есть, или добавь в конец).

node 'srv-dc01.vbo.local' {
  file { 'c:/hello_from_linux.txt':
    ensure  => present,
    content => "Привет, Windows! Я управляю тобой из Linux.\n",
  }
}

Важно: Имя srv-dc01.vbo.local. Оно должно точно совпадать с именем клиента.

3. Сохрани файл (Ctrl+O, Enter, Ctrl+X).

4. Иди на клиента и примени: В PowerShell снова введи:

puppet agent -t

Если увидишь File[c:/hello_from_linux.txt]/ensure: created, беги проверять диск C:\. Там должен появиться файл! 📄

Создаем пользователя👤

Создавать текстовые файлы — это для тренировки. Админы используют Puppet, чтобы управлять пользователями, устанавливать программы и запускать службы. Давай прикажем Паппету создать нового пользователя на твоем клиенте и дать ему права.

1. На Linux-сервере: Снова открой site.pp:

sudo nano /etc/puppetlabs/code/environments/production/manifests/site.pp

2. Измени код: Можешь удалить старый блок file или просто добавить новый ниже. Впиши это (обрати внимание на пароль — Windows требует, чтобы он был сложным!):

node 'srv-dc01.vbo.local' {
 
  user { 'pup_admin':
    ensure   => present,
    password => 'SuperSecretPass123!',
    groups   => ['Administrators'],
    comment  => 'Админ, созданный через Puppet',
    managehome => true,
  }
 
}

(Этот код говорит: “Хочу пользователя pup_admin с таким-то паролем, и чтобы он был в группе Администраторы”).

3. Сохрани (Ctrl+O, Enter, Ctrl+X).

4. На Windows Server: Запускай команду применения:

puppet agent -t

Установка софта (Делаем из Windows веб-сервер) 🌐

Создавать пользователей скучно. Давай установим настоящий сервис. Мы превратим твой Windows Server 2022 в веб-сервер (IIS), чтобы он мог показывать сайты. В Puppet для этого есть готовые “модули” (как плагины). Но чтобы не усложнять сейчас установкой модулей, мы сделаем это через команду PowerShell, обернутую в Puppet.

1. Чтобы Puppet научился работать с PowerShell, нужно скачать официальное расширение. Выполни на Linux-сервере:

sudo /opt/puppetlabs/bin/puppet module install puppetlabs-powershell

2. На Linux-сервере: Открой файл site.pp:

sudo nano /etc/puppetlabs/code/environments/production/manifests/site.pp

3. Добавь задачу установки IIS: Вставь этот блок внутрь node 'srv-dc01.vbo.local' { ... }. Внимание: Не удаляй старое, просто добавь это ниже создания пользователя, но до закрывающей скобки }.

  # Задача 3: Превращаем сервер в Веб-сервер (IIS)
  exec { 'Install-IIS':
    command   => 'Install-WindowsFeature -Name Web-Server -IncludeManagementTools',
    provider  => powershell,
    # Эта магия проверяет: "Если IIS уже стоит, то ничего не делать"
    onlyif    => 'if ((Get-WindowsFeature -Name Web-Server).InstallState -eq "Installed") { exit 1 } else { exit 0 }',
    logoutput => true,
  }

4. Сохрани и выходи.

5. На Windows: Запускай:

puppet agent -t

Подмена сайта 🎩🐇

Стандартная синяя картинка — это скучно. Давай докажем, что мы владеем этим сервером полностью. Мы заменим главную страницу сайта на свою собственную, не заходя на Windows.

1. На Linux-сервере: Открой site.pp:

sudo nano /etc/puppetlabs/code/environments/production/manifests/site.pp

2. Добавь новый код: Внутрь блока node 'srv-dc01.vbo.local', ниже установки IIS, добавь вот эти строки:

  # Задача 4: Удаляем стандартную заставку IIS
  file { 'c:/inetpub/wwwroot/iisstart.htm':
    ensure => absent,
  }
 
  # Задача 5: Создаем свой сайт
  file { 'c:/inetpub/wwwroot/index.html':
    ensure  => present,
    content => "<html>
                  <body style='background-color: black; color: green; font-family: monospace;'>
                    <h1>MISSION ACCOMPLISHED</h1>
                    <p>Этот сайт захвачен и управляется через Puppet!</p>
                    <p>Vitaliy + Gemi = Dream Team 🚀</p>
                  </body>
                </html>",
  }

3. Сохрани (Ctrl+O, Enter, Ctrl+X).

4. На Windows: Примени изменения:

puppet agent -t

Профессиональный стиль. ISS. (Modules) 🏗️

Мы установили IIS “грязным” способом — через команду PowerShell (exec). Это работает, но это не Puppet Way.

Шаг 1. Скачиваем “Драйвер” для IIS (На сервере Linux) 🧩

Нам нужен официальный модуль от PuppetLabs, который учит сервер управлять IIS. Введи на Linux:

sudo /opt/puppetlabs/bin/puppet module install puppetlabs-iis
sudo /opt/puppetlabs/bin/puppet module install puppetlabs-pwshlib

Ты должен увидеть: Notice: Installing -- do not interrupt ... И в конце: └─ puppetlabs-iis (v...).

Шаг 2. Переписываем код 📝

Теперь самое интересное. Мы удалим страшный кусок с PowerShell и заменим его на элегантный ресурс iis_feature. Заодно, как мы и договаривались, исправим опечатку в слове created.

  1. Открой файл:
sudo nano /etc/puppetlabs/code/environments/production/manifests/site.pp
  1. Полностью замени содержимое блока node на этот код:
node 'srv-dc01.vbo.local' {
 
  # --- Блок 1: Пользователь (Оставляем как было) ---
  user { 'pup_admin':
    ensure     => present,
    password   => 'SuperSecretPass123!',
    groups     => ['Administrators'],
    managehome => true,
  }
 
  # --- Блок 2: IIS (ПРОФЕССИОНАЛЬНЫЙ СТИЛЬ) ---
  # Вместо exec мы используем родной ресурс модуля
  iis_feature { 'Web-Server':
    ensure                   => present,
    include_management_tools => true,
  }
 
  # --- Блок 3: Сайт (С ИСПРАВЛЕНИЕМ ОПЕЧАТКИ) ---
  
  # Удаляем старую заглушку
  file { 'c:/inetpub/wwwroot/iisstart.htm':
    ensure => absent,
  }
 
  # Наш сайт (исправил creted -> created)
  file { 'c:/inetpub/wwwroot/index.html':
    ensure  => present,
    content => "<html>
                  <body style='background-color: black; color: green; font-family: monospace;'>
                    <h1>MISSION ACCOMPLISHED</h1>
                    <p>This site was created with Gemini and Puppet!</p>
                    <p>Vitaliy + Gemi = Dream Team 🚀</p>
                  </body>
                </html>",
  }
}
  1. Сохрани (Ctrl+O, Enter, Ctrl+X).

Шаг 3. Проверка на Windows 🧪

Сейчас произойдет важная вещь. IIS у тебя уже установлен.

  • Если бы это был глупый скрипт, он бы попытался установить его снова и выдал ошибку.
  • Умный модуль проверит: “Ага, Web-Server уже стоит. Инструменты управления тоже. Значит, я ничего не делаю”. Запускай на Windows:
puppet agent -t

Второй сайт на порту 8080 🏗️

Мы используем ресурсы iis_site и iis_application_pool. Это то, ради чего мы ставили модуль.

1. Выполняй на Linux-сервере:

sudo /opt/puppetlabs/bin/puppetserver gem install ruby-pwsh
sudo systemctl restart puppetserver

2. На Linux-сервере: Открой site.pp:

sudo nano /etc/puppetlabs/code/environments/production/manifests/site.pp

3. Добавь этот код ВНУТРЬ блока node: (Можешь добавить это в самый низ, перед закрывающей фигурной скобкой }).

  # --- Блок 4: Новый сайт "Secret Project" на порту 8080 ---
 
  # 1. Создаем папку для нового сайта
  file { 'c:/inetpub/secret_site':
    ensure => directory,
  }
 
  # 2. Кладем туда файл
  file { 'c:/inetpub/secret_site/index.html':
    ensure  => present,
    content => "<h1>SECRET AREA 51</h1><p>Доступ только для Виталия и Gemi.</p>",
  }
 
  # 3. Создаем Application Pool (для изоляции процессов - это Best Practice)
  iis_application_pool { 'SecretPool':
    ensure => present,
    state  => 'started',
  }
 
  # 4. Создаем сам Сайт и вешаем его на порт 8080
  iis_site { 'SecretSite':
    ensure          => started,
    physicalpath    => 'c:\\inetpub\\secret_site',
    applicationpool => 'SecretPool',
    bindings        => [
      {
        'protocol'           => 'http',
        'bindinginformation' => '*:8080:',
      }
    ],
    require         => File['c:/inetpub/secret_site'], # Сначала папка, потом сайт!
  }
 
  # 5. Открываем порт в Брандмауэре (иначе не зайти снаружи)
  exec { 'Open-Port-8080':
    command   => 'New-NetFirewallRule -DisplayName "Puppet-8080" -Direction Inbound -LocalPort 8080 -Protocol TCP -Action Allow',
    provider  => powershell,
    onlyif    => 'if (Get-NetFirewallRule -DisplayName "Puppet-8080" -ErrorAction SilentlyContinue) { exit 1 } else { exit 0 }',
  }

4. Сохрани и выходи.

5. На Windows: Запускай агента:

puppet agent -t