25 апреля 2011 в 16:01

Настройка виндового веб-сервера без RDP

Совсем недавно понадобилось настроить очередной веб-сервер. Как раз в это время у меня было весеннее обострение PowerShell. В общем, в качестве небольшой разминки, я решил настроить веб-сервер без RDP.

Итак задача: есть машина с Windows 2008 R2, которая находится где-то в Англии, нужно установить IIS, .NET 4.0 и настроить пару веб-сайтов. Есть несколько вариантов как это сделать удаленно и из командной строки, но сегодня спонсором будет PowerShell Remoting. Для того, чтобы быль стала явью, надо совсем немного, собственно, включить PowerShell Remoting.

Настройка PowerShell Remoting на сервере


Вот как раз тут первый фейл. Сложно включать удаленный доступ, когда самого удаленного доступа нет. В общем, тут прийдется воспользоваться RDP. В консоле PowerShell (далее просто консоль), под администратором, надо выполнить:

Enable-PsRemoting -Confirm

Если все хорошо, то теперь на машине всегда будет PowerShell Remoting. На этом месте RDP можно выключать. Этот рудимент графических интерфейсов нам больше не понадобится. Следующий шаг — это настройка клиента.

Настройка PowerShell Remoting на клиенте


Как по мне, так PowerShell писали параноики. Запрещено все что можно и не можно. Вот и подключаться к серверам тоже запрещено. Это я конечно немного утрирую. Если все находится в одном домене, то все будет прозрачно. Но в моей ситуации машина вне домена и даже не в одной сети. В общем, я решил что буду аккуратным и разрешу любые внебрачные связи.

set-item wsman:localhost\client\trustedhosts -value * -force
restart-service WinRm


Вот и подошли к самому интересному. Подключаемся к серверу.

enter-pssession -ComputerName 192.0.32.10 -Credential "WS0114\Administrator"

Вы себе представить не можете как я ждал этого момента. Нервничал, ночи не спал. А тут бац, и без барабанного боя я уже в командной строке на машине где-то на другом конце земли. В целом да. Самый нервный этап мы прошли. Мы на удаленной машине. И осталось совсем немного.

Инсталляция IIS


Тут все просто:

Import-Module ServerManager
Add-WindowsFeature Web-Server


Это правда поставит кучу всякого ненужного, поэтому я бы посоветовал выполнить Get-WindowsFeature, и поставить только нужные фитчи.

Инсталляция .NET 4.0


А вот тут фейл номер два. Простой команды чтобы установить .NET 4.0 пока что нет. Зато есть несколько непростых. Свой вариант я опишу чуть ниже, а для отчетности, вкратце расскажу про наверное более правильный. У Microsoft существует с десяток всяких «центральных» репозитариев. Так и для веб-серверов есть Web Platform Installer. И у этой штуки есть Command Line интерфейс. Если не задаваться вопросом инсталляции WebPi Command Line, то установка .NET 4.0 выглядела бы как:

WebpiCmdline /Products: NETFX4RTM /AcceptEula

Но вернемся лучше к моему варианту. Если решать задачу в лоб, то это два простых шага. Скачать инсталлятор и запустить его из командной строки. Основная проблема с первым шагом. В PowerShell нет нормальных средств для скачивания файлов. Поэтому я написал маленький модуль который оборачивает .NET WebClient. Правда, меня поджидала новая проблема. Для того что-бы установить PsUrl, его надо скачать. Круг замкнулся. Но меня было уже не остановить(обострение). Почувствовав в себе силы создать еще один велосипед, я решил что неплохо было бы иметь инсталлятор модулей. Бумс и интернеты пополнились еще одним проектом.

Теперь вопрос скачивания решается так:

# Устанавливаем PsGet
(new-object Net.WebClient).DownloadString("https://github.com/chaliy/psget/raw/master/GetPsGet.ps1")  | Invoke-Expression
# Устанавливаем PsUrl
install-module https://github.com/chaliy/psurl/raw/master/PsUrl/PsUrl.psm1
# Скачиваем .NET 4.0
get-url http://download.microsoft.com/download/9/5/A/95A9616B-7A37-4AF6-BC36-D6EA96C8DAAE/dotNetFx40_Full_x86_x64.exe -ToFile dotNetFx40_Full_x86_x64.exe
# Устанавливаем .NET 4.0
start-process .\dotNetFx40_Full_x86_x64.exe -ArgumentList "/q /norestart" -Wait


Тут следует заметить, что PsGet и PsUrl теперь у вас в модулях, но при этом они не импортируются при старте профиля.

Настраиваем сайты


Импортнем все что надо:
Import-Module WebAdministration
На этом сервере все приложения будут под .NET 4.0, поэтому:

Set-WebConfigurationProperty /system.applicationHost/applicationPools/applicationPoolDefaults -name managedRuntimeVersion -value v4.0

Поднимем тестовый сайт:

New-Item "C:\inetpub\example" -ItemType Directory
New-WebSite Example -Port:8080 -PhysicalPath:"C:\inetpub\example"
Get-Url http://example.com -ToFile "C:\inetpub\example\index.html"
Get-Url http://localhost:8080/


Вот собственно и все.

Exit-PsSession

Если что, можно все одним скриптом. В целом меня процес более или менее удовлетворил. Фейлов не так и много. «Подводные камни» удалось обойти. Кстати, о «подводных камнях». Их достаточно много, я не стал их описывать в этом топике, но если возникнут проблемы, спрашивайте.

P.S. Весеннее обострение продолжается.

[Upadate]

Оказалось что я немого соврал. Простите. Скачивание файлов в PowerShell есть. Причем с плюшками: докачиванием, асинхронным скачиванием, менджером скачиваний и тп. Собственно использует компонент Винды — BITS. Микрософт традиционно лажанул с названием поэтому модуль называется BitsTransfer.

Import-Module BitsTransfer
# Скачиваем .NET 4.0
Start-BitsTransfer http://download.microsoft.com/download/9/5/A/95A9616B-7A37-4AF6-BC36-D6EA96C8DAAE/dotNetFx40_Full_x86_x64.exe
# Устанавливаем .NET 4.0
start-process .\dotNetFx40_Full_x86_x64.exe -ArgumentList "/q /norestart" -Wait
Mike Chaliy @chaliy
карма
0,0
рейтинг 0,0
Похожие публикации
Самое читаемое Администрирование

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

  • +2
    Мама, мама, я научился писать стоя!!!
    • +7
      Реально ничего интересного?
      • +8
        Мне было интересно, спасибо.
      • 0
        Было увлекательно, спасибо!
      • +2
        Интересно, но от этого шутка dkr6 менее смешной не становится ;)))))))))))
      • +16
        Интересно?
        Та меня чуть не стошнило от команд, вводимых «НеРовНым ПоЧерком»…

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

        Спасибо огромное.

        И, это…
        Пишите еще ;)
        • –1
          «НеРовНым ПоЧерком» это повершельные названия команд. Так уж повелось. Релально у большенства всех есть более нормальные алиасы. В том числе и линуксовые. Тоесть Get-ChildItems можно записывать и dir и ls. Ну и их можно писать любыми буквами. Он не чувствительно к регистру.
          • 0
            … и gci регистр наверное введен tab completionом
            • +1
              У меня была мысль использовать алиасы. Но потом я решил что так будет читабельней. Хз. Хотя наверное стоило писать в одном стиле или маленькими или КамелКейсом…
        • +1
          не является ли признаком некоторой ограниченности, когда тошнит от непривычного? ;)
          • +1
            Не… Не является…
            Ибо оно на столько уже привычное, что аж тошнотворное…
            Но вот встречный вопрос: Не является ли признаком патологической ограниченности тот факт, что кое кто по сей день тупо считает, что FileName.txt и filename.TXT являются одним и тем же файлом.

            КО скажет, что это не так и файлы разные, на самом деле.
            Но как это вдолбить производителям ОСи?
            • +2
              Вы серьезно считаете, что «WebClient» тошнотворнее, чем «web_client»? Для меня например, второе кажется не очень эффективным, т.к. идентификатор разбивается на два визуально, это смущает. И поверьте, не только для меня :)

              Вы рассказали всем, какой вы молодец, вовремя почуяли, как тошнотворно работать на .NET и Java?)) Все за вас очень порадовались, поверьте :)
              • +2
                Мистер, не путайте теплое с мягким…
                Я говорю о том, что «WebClient» и «webclient» — две большие разницы.

                А когда я осознал эту простую (для меня) истину, про .NET и Java еще ни кто не задумывался в принципе.

                А для того, чтобы удаленно управлять сервером, нет нужды изучать .NET или что-либо подобное. Достаточно shell…

                Все уже украдено^wпридумано, до нас…
                • 0
                  Я говорю о том, что «WebClient» и «webclient» — две большие разницы.


                  В чем разница? Я понимаю вы это осознали уже очень давно. Объясните пожалуйста и мне. Мож я тоже осознаю.
                  • +2
                    Разница в том (нет, КО — это не я), что у буковок в нижнем и верхнем регистрах разные коды, как минимум.
                    Это _разные_ буквы…
                    Следовательно, и файлы с именами в нижнем и в верхнем регистрах будут разными…
                    Это справедливо и для имен переменных и функций.

                    Если кто-то сделал продукт, позволяющий забить на эту разницу, то мне жалко (честно, по-человечески жалко) поколение программистов/сисадминов/пользователей, которые про эту разницу забыли.

                    Поверьте, что поколение, воспитанное в свете строгого различия между File.TxT и file.txt ни когда не попадет в ситуацию, из которой, матерясь и отплевываясь, будут с гордостью выплывать остальные.

                    Dixi
                    • 0
                      Фишка в том, что я не первый год програмлю и пока проблем не было. Мне кажется что тут что-то немного притянуто за уши.
                    • 0
                      Поверьте, что поколение, воспитанное в свете строгого различия между File.TxT и file.txt ни когда не попадет в ситуацию, из которой, матерясь и отплевываясь, будут с гордостью выплывать остальные.


                      Как и наоборот :) так можно сказать про любое отличие
                      • 0
                        Ой, не скажите…
                        Совсем недавно наблюдал в рассылке обсуждение проблемы, когда человек не мог к себе на Win-машинку слить каталог с FTP, в котором были файлы с именами вида File.TxT и file.txt…
                        Сервер с той стороны *nix-совый, файлы туда сливали с разных источников. И файлы по содержимому крайне разные…
                        А у него проблемы…
                        И жалко его, и помочь ему нечем.

                        Ну да ладно…
                        Это из серии GUI == TUI == CLI…
                        Намедни обсуждалось…
                        • 0
                          Может быть. Ни разу с таким не сталкивался. Наверняка есть какой-то линуксоид, который не знает, куда девать потоки NTFS или что-нибудь еще в этом роде.
      • +1
        Почти 50 добавлений в избранное(на данный момент), как бы намекает, что не так уж все и плохо.
  • +3
    Познавательно. Но, fail, конечно. Сразу становится очевидной GUI-направленность MS. Чтобы включить консольный доступ и админить через него, нужно сальто с переподвывертом сделать.
    • +1
      Ну если сравнивать с SSH то чтобы настроить на сервере, что-то там, что там надо выполнить одну команду. Если говорить про клиент, то SSH клиент, если вы подключаетесь к недоверенному серверу, спросит добавить ли сервер в доверенные, а PS клиент требует что-бы в доверенные занесли до подключения. Я думаю это не супер критическая разница.

      Кстати, я думаю не проработанное юзабилити работы со списком доверенных серверов, получилось из-за того что у Майкров более приоритетна работа в домене. А там уже никаких вопросов.
    • +1
      по моему достаточно сильно сказывается отсутствие того же posix, в консоли linux все достаточно просто, так как все есть файл и в принципе логика работы с консолью понятна и стандартна, после этого или даже после обычной виндого cmd, PowerShell смотрится как какой то супермегазвездалет, там где нужен просто кукурузник…
      • 0
        только никому, Windows NT поддерживает POSIX :)
        • +1
          POSIX POSIXу рознь. Я думаю имелось ввиду POSIX.2, Shell and Utilities (IEEE Std 1003.2-1992), а я думаю что встроенные в винду утилиты и PS командлеты это все не потдерживают.
          • +1
            В венде с 2к на уровне сервисов все реализовано. Для всего остального есть костыли, который позволяют и bash запускать и zsh.
            • 0
              совсем по секрету: они позволяют не только запускать bash, но и ставить Gentoo и XFCE.
  • 0
    Очень интересно.
    А какие порты пооткрывать надо?
    • +3
      Если используется виндовый фаервол, то Enable-PsRemoting сам откроет нужные порты. Если руками то 5985 и 5986.

      Походу порты по умолчанию поменялись, в PowerShell 1.0 оно слушало на 80м.

      Ну и все порты всегда можно поменять или посмотреть:

      get-childitem WSMan:\localhost\Service\DefaultPorts
  • +3
    >> Как по мне, так PowerShell писали параноики

    очень, очень хорошо
  • +1
    Кстати чтобы смог запускать скрипты на своем удаленном сервере мне понадобилось выполнить еще такую команду

    Set-ExecutionPolicy remotesigned

    была пожестче политика. Можно сделать через удаленный PowerShell :-)
    • –1
      Да вы правы. Собсно на клиенте ее тоже надо установить.
  • +6
    Автор решил на какое–то время почувствовать себя линуксоидом и, похоже, ему это понравилось :)
    • +6
      следующий шаг — переход на Linux
  • 0
    Интересная статья. Полезно узнать насколько отстаешь от жизни. ;)

    Хотя как то привычнее на win2003 серверах ииспользовать установленный Cygwin + SSH+ Rsync+Zabbix agent+Bacula.

    regedit отлично запускается, перезагрузка тоже…
  • 0
    Remote Server Administration Tools? Нет?
    • 0
      Зависит от задач. Например, насколько я знаю, установить .NET 4.0 пока что не получится.
  • +4
    Сравните
    (new-object Net.WebClient).DownloadString("https://github.com/chaliy/psget/raw/master/GetPsGet.ps1") | Invoke-Expression
    и
    wget some.site.com/somefile.tgz

    какую команду проще запомнить и набрать не набирая ВоТ ТаКИЕ сиМвоЛы
    • +1
      1) В PowerShell нет встроенных средств для скачивания. Поэтому для того чтобы не просить устанавливать дополнительный бинарник wget, я воспользовался тем что можно использовать .NET. Тоесть пример который вы привели, это не пример PowerShell команды, а пример того как в PowerShell можно использовать .NET
      2) Чтобы исправить положение со скачиванием я написал небольшой враппер. Скачивание теперь может выглядеть как:

      get-url some.site.com/somefile.tgz

      Я еще раздумываю о том какие алиасы лучше сделать. Сейчас в PowerShell еще нет устойчивых гаидлайнов по именованию алиасов. Но можно сделать:

      get some.site.com/somefile.tgz
      download some.site.com/somefile.tgz
      wget some.site.com/somefile.tgz

      Тут уже зависит от того, будет ли кто-то еще пользоваться моим враппером.

      3) На самом то деле, никаких проблем не вызывает установить wget и получить нужный синтаксис.
      4) PowerShell еще относительно молодой, поэтому проблем там достаточно. Они конешно же потихоньку будут решаться. В общем то, все зависит от тех кто собирается им пользоваться.
      • 0
        чем слово 'обертка' хуже враппера (который на самом деле рапер)?
    • +2
      — Обе команды можно набрать без использования регистра
      — они делают разное
      poshcode.org/2498
      — если есть готовый wget из posh он вызыватся так же
      • +1
        Блин, что за боязнь регистра-то непонятная?) *Не нужно* ничего вводит с регистром, PS Не зависит от регистра, можете писать все в нижнем. Просто так гораздо эстетичнее, вот и все.
    • 0
      Стравнил. Результаты разные.
      Кстати, как Вы скачаете wget? Он далеко не везде есть по умолчанию.
  • 0
    все прекрасно, только где найти клиента под линуксом? единственный, который я видел не работал =)
    • 0
      это вы про pash? Я даже поставить его не смог ;).
      • 0
        у меня что-то ставилось, но при попытке подключения выдавало ошибки. может чуть позже еще раз попробую, если заработает сделаю ebuild/exheres-0.
  • –1
    Ужасно. Это чистый, незамутненный рак мозга. Еще раз убеждаюсь, что у Microsoft как не было так и нет нормальной консоли. И похоже что не будет.
    Нахрена нужна такая консоль, если в ней нельзя без танцев с бубном сделать элементарнейшее и нужнейшее действие — скачивание файла по хттп. Лучше бы мелкомягкие не позорились, а взяли консоль и утилиты от BSD, тогда на это можно было бы смотреть без содрогания.
    • 0
      Вас че хто-то заставляет? Или Cygwin уже забанили?
      • +2
        Только он и спасает. Первым делом ставлю его на виндовые сервера.
    • +1
      notepad $profile
      iexplore poshcode.org/?lang=&q=get-webpage
      Ctrl+C
      Ctrl+V
    • +2
      Я судя по всему всех прокинул. Щас заапдейчу статью.

      Import-Module BitsTransfer
      Start-BitsTransfer http://download.microsoft.com/download/9/5/A/95A9616B-7A37-4AF6-BC36-D6EA96C8DAAE/dotNetFx40_Full_x
      86_x64.exe


      Скачивание есть. С докачками, асинхронными режимами и прочим. Мне надо было меньше на ветрянные мельницы ходить.
  • +2
    Чего только ни придумают, лишь бы Линукс не ставить :-)
  • +1
    «Настройка виндового веб-сервера почти без RDP» :)
    спасибо за статью, познавательно
  • +2
    Неожиданно интересно. Нужно будет все таки как то с powershell поближе познакомиться.

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