URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 88086
[ Назад ]

Исходное сообщение
"Раздел полезных советов: Почти автоматическое разворачивание..."

Отправлено auto_tips , 05-Янв-13 02:52 
В заметке рассказывается о решении задачи по автоматизации установки новых Linux систем и организации управления ими с помощью Active Directory.

++ Исходные данные:

*** Домен AD Domain.ru.
*** Дистрибутив CentOS, легально скачанный с сайта CentOS.org (у руководства сейчас пунктик о 100% легальности софта).
*** Очень странный софт спец назначения - 64-битный софт с 32-битным установщиком.


++ Процесс организации установки Linux по сети

++ 1. Готовим сервер установки.

1.1 На сервере виртуалок создаём сервер загрузок из того же CentOS-a с отдельным VLAN-ом и IP адресом 172.17.17.254/24 - основная сетка целиком на MS, лучше её не тревожить... Пока.
Сразу ставим туда демоны dhcpd, tftp, nfs, ntpd. Машины заливать будем по NFS - так привычнее.

1.2 Настраиваем на виртуальном сервере DHCP под сетевую загрузку Linux.

Правим /etc/dhcp/dhcpd.conf до примерно такого вида:


   option domain-name "centos";
   option domain-name-servers 172.17.17.254;
   default-lease-time 600;
   max-lease-time 7200;
   authoritative;
   log-facility local7;

   subnet 172.17.17.0 netmask 255.255.255.0 {
     range 172.17.17.100 172.17.17.199;
     option routers 172.17.17.254;
     filename "pxelinux.0";
     next-server 172.17.17.254;
   }

В общем - всё как обычно, кроме пары ключевых параметров: filename и next-server. next-server задаёт IP-адрес tftp-сервера, а filename - файл в папке загрузочных файлов (см следующий пункт).

включаем загрузку демона

   chkconfig dhcpd on

и запускаем его

   service dhcpd start


1.3 Настраиваем tftp

Правим файл /etc/xinetd.d/tftp. Точнее в строке disabled ставим значение "no" и в строке server_args ставим те значения, что нам привычны, или оставляем исходные, но запоминаем, куда они указывают. Мне, развлекающемуся с юнихами года так с 1989, привычнее там видеть "-s -vv /tftpboot", что собственно там и оказалось, после моих правок.

Создаём саму папку для загрузочных файлов (/tftpboot - из параметра server_args):

   mkdir /tftpboot


Ставим пакет syslinux-а

   yum install syslinux-4.02-7.el6.x86_64


И копируем PXE-шный загрузчкик в выбранное место:

   cp /usr/share/syslinux/pxelinux.0 /tftpboot

И включаем демон:

   chkconfig xinetd on
   service xinetd restart


1.4 Настраиваем NFS

Создаём папку для дистрибутива

   mkdir -p /pub/CentOS


Распаковываем туда дистрибутив

   mkdir -p /mnt/cdrom
   mount -o loop /путь-к-папке-с-изошником-CentOS/CentOS-6.3-x86_64-bin-DVD1.iso /mnt/cdrom
   cd /pub/CentOS
   cp -ra /mnt/cdrom/* .
   umount /mnt/cdrom
   mount -o loop /путь-к-папке-с-изошником-CentOS/CentOS-6.3-x86_64-bin-DVD2.iso /mnt/cdrom
   cp -ra /mnt/cdrom/* .
   umount /mnt/cdrom


Открываем к доступ к папке

   echo '/pub    *(ro,insecure,all_squash)' >> /etc/exports
   chkconfig nfs on
   service nfs restart


С общей подготовкой сервера - всё. Приступаем к специфичной части.


++ 2. CentOS-овский загрузчик.

CentOS, разумеется, для загрузки с CD и DVD использует загрузчик isolinux проекта Syslinux. А значит сделать файл конфигурации загрузки для pxelinux.0, другой загрузчик этого же проекта - не просто, а очень просто.

Создаём папку /tftpboot/pxelinux.cfg и папку для дополнительных файлов загрузчика.

   mkdir -p /tftpboot/pxelinux.cfg


Копируем туда под именем default файл конфигурации isolinux-а с дистрибутива CentOS...

   cd /pub/CentOS/isolinux/
   cp isolinux.cfg /tftpboot/pxelinux.cfg/default
   [
]

...и несколько файлов, используемых при загрузке.

   cp boot.cat  boot.msg  grub.conf  initrd.img  splash.jpg  TRANS.TBL  vesamenu.c32  vmlinuz /tftpboot


Добавляем ссылку на файл автоматической инсталяции в параметры ядра.
В строки append initrd=initrd.img надо дописать ks=nfs:172.17.17.254:/pub/CentOS-conf/desktop.cfg,
где nfs - протокол, по которому надо брать файл конфигурации, 172.17.17.254 - адрес сервера, /pub/CentOS-conf/desktop.cfg - полное имя файла.

Получается файл /tftpboot/pxelinux.cfg/default примерно такого вида:


   default vesamenu.c32
   #prompt 1
   timeout 80
  
   display boot.msg

   menu background splash.jpg
   menu title Welcome to CentOS 6.3!
   menu color border 0 #ffffffff #00000000
   menu color sel 7 #ffffffff #ff000000
   menu color title 0 #ffffffff #00000000
   menu color tabmsg 0 #ffffffff #00000000
   menu color unsel 0 #ffffffff #00000000
   menu color hotsel 0 #ff000000 #ffffffff
   menu color hotkey 7 #ffffffff #ff000000
   menu color scrollbar 0 #ffffffff #00000000

   label linux
     menu label ^Install or upgrade an existing system
     menu default
     kernel vmlinuz
     append initrd=initrd.img ks=nfs:172.17.17.254:/pub/CentOS-conf/desktop.cfg
   label vesa
     menu label Install system with ^basic video driver
     kernel vmlinuz
     append initrd=initrd.img xdriver=vesa nomodeset  ks=nfs:172.17.17.254:/pub/CentOS-conf/desktop.cfg
label rescue
     menu label ^Rescue installed system
     kernel vmlinuz
     append initrd=initrd.img rescue
   label local
     menu label Boot from ^local drive
     localboot 0xffff
   label memtest86
     menu label ^Memory test
     kernel memtest
     append -


++ 3. Проблема совместимости 64-битной ОС с 32-битными приложениями.

При наличии 32-битных библиотек у 64-битной ОС ни каких проблем совместимости нет. Но вот не задача: новый yum теперь 32-битные библиотеки ставить не будет. Дело всё в параметре multilib_policy - в 5-ом CentOSе он имел значение all, теперь - best. Как правильно побороть это на этапе установки - не знаю. В Интернете нашёл, как побороть это по-быстрому (http://lists.centos.org/pipermail/centos/2011-July/114513.html).

Вытаскиваем из архива файл yuminstall.py во временную папку

   mkdir /tmp/1
   cd /tmp/1
   rpm2cpio /pub/CentOS/Packages/anaconda-13.21.176-1.el6.centos.x86_64.rpm | cpio -id ./usr/lib/anaconda/yuminstall.py


Добавляем строку multilib_policy=all после строки [main], где-то 1252 строка файла. Можно применить такой патчик:

   cd usr/lib/anaconda/
   cat <<EOP > patch
   --- yuminstall.py.orig  2012-12-25 13:49:06.979604951 +0400
   +++ yuminstall.py       2012-12-25 13:51:15.433740741 +0400
   @@ -1250,6 +1250,7 @@

         buf = """
    [main]
   +multilib_policy=all
    installroot=%s
    cachedir=/var/cache/yum
    keepcache=0
   EOP

   patch < patch


Кладём подправленный файл в папку, откуда его точно заглотит инсталлятор:


   mkdir /pub/CentOS/RHupdates/
   cp yuminstall.py /pub/CentOS/RHupdates/


++ 4. Создание конфигурации Kickstart.

Теперь надо создать конфигурационный файл инсталлятора. Сделать это проще всего в графическом конфигураторе system-config-kickstart

   yum install system-config-kickstart
   system-config-kickstart


Запускается простой Х-овый интерфейс  выбора параметров. Заполняем его по своему усмотрению, ключевыми являются закладки "Метод установки" и "Сценарий после установки".
Т.к. я изначально решил устанавливать по NFS в методе установки указываем "Выполнить новую установку", "Установочный носитель" - NFS, "Сервер NFS" - 172.17.17.254 и "Каталог NFS" - /pub/CentOS. Содержимое закладки "Сценарий после установки" можно скопировать из примера конфигурационного файла, приведённого ниже, между полями %post и %end.

Пакеты выбираем по собственному вкусу, но для интеграции с Active Directory необходимы

    samba-winbind
    krb5-workstation
    openldap-clients

их можно выбрать в "Выбор пакетов" -> "Базовая система" -> "Клиент каталогов".
На всякий случай, мало ли на какой каталог придётся переползать, я ставлю вообще все пакеты этого подраздела.

Сохраняем файл конфигурации /pub/CentOS-conf/desktop.cfg - именно на него ссылаются параметры ks из п.2.

У меня файл /pub/CentOS-conf/desktop.cfg получился таким (он содержит комментарии на русском, их лучше удалить перед использованием - не хватало ещё глюков из-за кириллицы):

   #platform=x86, AMD64, or Intel EM64T
   #version=DEVEL
   # Firewall configuration - Внутри локалки firewall по большей части мешает.
   firewall --disabled
   # Install OS instead of upgrade
   install
   # Use NFS installation media
   nfs --server=172.17.17.254 --dir=/pub/CentOS
   # Root password
   rootpw --iscrypted <зашифрованный пароль>
   # System authorization information
   auth  --useshadow  --passalgo=md5 --enablecache
   # Use text mode install
   text
   # Run the Setup Agent on first boot
   firstboot --disable
   # System keyboard
   keyboard ru
   # System language
   lang ru_RU
   # SELinux configuration
   selinux --disabled
   # Installation logging level
   logging --level=info
   ## Turnoff power after installation
   # Удобно при большом кол-ве одновременно заливаемых компов - готовые выключены,
   # и хорошо заметно, который можно уносить. Кикстарт не понимает всей прелести такого
   # и этот параметр приходится дописывать руками.
   poweroff
   # System timezone
   timezone  Europe/Moscow
   # Network information
   network  --bootproto=dhcp --device=eth0 --onboot=on
   # System bootloader configuration
   bootloader --location=mbr
   # Clear the Master Boot Record
   zerombr
   # Partition clearing information
   clearpart --all --initlabel
   # Disk partitioning information.
   # диски на компьютерах сейчас просто огромные, место жалеть не    приходится
   part /boot --fstype="ext4" --size=1024
   part swap --fstype="swap" --recommended
   part / --fstype="ext4" --size=131072
   part /home --fstype="ext4" --grow --size=1

   #
   # А вот тут - самое основное
   # Скрипт выполняется после всех основных действий по установки, в том числе
   # после заливки софта, но chroot-нутым в подготовленную машину.
   #
   %post

   # Скрипт создаётся в папке /tmp настраиваемого компьютера. Незачем ему там храниться.
   rm -f $0

   # Говорим yum-у и впредь ставить 32-битные модули вместе с 64-битными.
   sed -i '/main/a multilib_policy=all' /etc/yum.conf

   # Делаем группу wheels истинно админской, чтобы даже пароль не спрашивала при sudo
   [ -d /etc/sudoers.d ] || mkdir /etc/sudoers.d
   echo '%root        ALL=(ALL)       NOPASSWD: ALL' >> /etc/sudoers.d/rootgrp
   chmod 0440 /etc/sudoers.d/rootgrp

   assureFileFolder() {
        local d=`dirname $1`;
        [ -d "$d" ] && return
        mkdir -p "$d"
   }

   # Конфигурация переключения раскладок клавиатуры в KDE
   kxkbrcFile=/etc/skel/.kde/share/config/kxkbrc
   assureFileFolder ${kxkbrcFile}
   cat <<EOKXKBRC > ${kxkbrcFile}
   [Layout]
   DisplayNames=us,ru
   LayoutList=us,ru
   LayoutLoopCount=-1
   Model=pc101
   Options=grp_led:scroll,grp:caps_toggle,grp:alt_shift_toggle,grp:shifts_toggle
   ResetOldOptions=true
   ShowFlag=true
   ShowLabel=true
   ShowLayoutIndicator=true
   ShowSingle=true
   SwitchMode=Window
   Use=true
   EOKXKBRC

   # Конфигурация локали KDE
   kdeglobFile=/etc/skel/.kde/share/config/kdeglobals
   assureFileFolder ${kdeglobFile}
   cat <<EOKGL > ${kdeglobFile}
   [Locale]
   Country=ru
   DateFormat=%A %d %B %Y
   Language=ru
   EOKGL
    
   # Конфигурация правописания KDE.
   kdespellCfg=/etc/skel/.kde/share/config/sonnetrc
   assureFileFolder ${kdespellCfg}
   cat <<EOKSPL > ${kdespellCfg}
   [Spelling]
   backgroundCheckerEnabled=true
   checkUppercase=true
   defaultClient=
   defaultLanguage=ru
   ignore_ru=
   skipRunTogether=true
   EOKSPL

   # Конфигурация переключения раскладок клавиатуры в GNOME.
   # Индикатор раскладок автоматически запускается только с GNOME    2.30,
   # а текущий гном в дистрибутиве Центоса - 2.28...
   # Так, что надо либо добавить сюда запуск индикатора, либо настраивать это руками...
   # Но оба этих упражнения - в другой раз.
   gnomekbdbase='/etc/skel/.gconf'
   gnomekbdfile='desktop/gnome/peripherals/keyboard/kbd/%gconf.xml'
   gkd=`dirname "${gnomekbdfile}"`
   mkdir -p "${gnomekbdbase}/${gkd}"
   d="${gkd}"; while [ "x${d}" != "x." ]; do touch ${gnomekbdbase}/$d/'%gconf.xml'; d=`dirname $d`; done

   sed 's/    /\t/g' <<EOGCONFKBD > ${gnomekbdbase}/${gnomekbdfile}
   <?xml version="1.0"?>
   <gconf>
       <entry name="options" mtime="1357150396" type="list"  ltype="string">
           <!-- li type="string">
                     <stringvalue>terminate    terminate:ctrl_alt_bksp</stringvalue>
           </li -->
           <li type="string">
                     <stringvalue>grp_led    grp_led:scroll</stringvalue>
           </li>
           <li type="string">
               <stringvalue>grp    grp:caps_toggle</stringvalue>
           </li>
           <li type="string">
                     <stringvalue>grp    grp:alt_shift_toggle</stringvalue>
           </li>
           <li type="string">
               <stringvalue>grp    grp:shifts_toggle</stringvalue>
           </li>
       </entry>
   </gconf>
   EOGCONFKBD

   chmod 0644 ${kxkbrcFile} ${kdeglobFile} ${kdespellCfg}    ${gnomekbdbase}/${gnomekbdfile}

   # Создаём учётные записи для великих гуру - пусть имеют возможность зайти на любой компьютер
   # Creation of admins
   for u in guru0 guru1; do
       useradd -m -p '*' -g wheel -G root $u
       mkdir /home/$u/.ssh
       touch /home/$u/.ssh/authorized_keys
       chown -R $u:wheel /home/$u/.ssh
       chmod -R go-rwx /home/$u/.ssh
   done

   # А сюда вставляем их публичные ключи SSH.
   cat <<EOAK0 >> /home/guru0/.ssh/authorized_keys
   EOAK0
   cat <<EOAK1 >> /home/guru1/.ssh/authorized_keys
   EOAK1

   #

   # У меня установка будет в текстовом режиме, а при этом система  получает 3 уровень запуска - исправляем на 5-й.
   sed -i 's/id:[3-5]:initdefault:/id:5:initdefault:/g' /etc/inittab

   # Монтируем раздел с дистрибутивом
   mkdir /tmp/pubDnld
   mount -o ro 172.17.17.254:/pub /tmp/pubDnld

   # Ставим дополнительные пакеты.
   rpm -ivh /tmp/pubDnld/Adobe/adobe-release-x86_64-1.0-1.noarch.rpm
   rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-adobe-linux
   rpm -i /tmp/pubDnld/Adobe/flash-plugin-11.2.202.258-release.x86_64.rpm

   # Удаляем ненужные мне глобальные серверы времени и включаем себя как резервный сервер.
   # Список серверов времени будем получать по DHCP.
   sed -i.instbak '/^server /s/^/#/;/server[[:space:]]*127/s/^#//;/fudge[[:space:]]*127/s/^#//' /etc/ntp.conf
   echo 'NTPSERVERARGS=iburst' >>  /etc/sysconfig/network

   # !!! А вот ради этого всё и затевается - ставим скрипт присоединения к домену
   cp /tmp/pubDnld/CentOS-conf/adsjoin /etc/init.d/
   chmod a+x /etc/init.d/adsjoin

   # Включаем нужные сервисы и выключаем не нужные.
   chkconfig kdump off
   chkconfig ntpd on
   chkconfig adsjoin on

   %end

   # Мой список устанавлеваемых пакетов. Создан system-config-kickstart-ом.
   #
   %packages
   @additional-devel
   @backup-client
   @base
   @basic-desktop
   @cifs-file-server
   @client-mgmt-tools
   @console-internet
   @core
   @debugging
   @desktop-debugging
   @desktop-platform
   @desktop-platform-devel
   @development
   @directory-client
   @directory-server
   @eclipse
   @fonts
   @general-desktop
   @graphical-admin-tools
   @graphics
   @hardware-monitoring
   @input-methods
   @internet-applications
   @internet-browser
   @java-platform
   @kde-desktop
   @large-systems
   @legacy-unix
   @mysql
   @mysql-client
   @network-file-system-client
   @nfs-file-server
   @office-suite
   @performance
   @perl-runtime
   @php
   @print-client
   @remote-desktop-clients
   @ruby-runtime
   @russian-support
   @scientific
   @server-platform-devel
   @system-admin-tools
   @technical-writing
   @x11
   ImageMagick
   SDL-devel
   cachefilesd
   cmake
   crypto-utils
   dcraw
   desktop-file-utils
   docbook-utils-pdf
   dump
   evolution-exchange
   expect
   expect
   gcc-java
   glade3
   glibc-utils
   gnome-common
   gnome-devel-docs
   gnutls-devel
   gtk2-devel-docs
   hesinfo
   hplip
   hplip-gui
   i2c-tools
   icedtea-web
   inkscape
   kdebase-devel
   kdebase-workspace-devel
   kdegraphics-devel
   kdelibs-apidocs
   kdelibs-devel
   kdemultimedia-devel
   kdenetwork-devel
   kdepim-devel
   kdepimlibs-devel
   kdesdk
   kdesdk-devel
   krb5-appl-clients
   krb5-pkinit-openssl
   krb5-workstation
   ldapjdk
   libXau-devel
   libXaw-devel
   libXinerama-devel
   libXmu-devel
   libXpm-devel
   libXrandr-devel
   libbonobo-devel
   libreoffice-base
   libreoffice-emailmerge
   libreoffice-headless
   libreoffice-javafilter
   libreoffice-ogltrans
   libreoffice-presentation-minimizer
   libreoffice-report-builder
   libreoffice-wiki-publisher
   libudev-devel
   libusb-devel
   libuuid-devel
   libxslt-devel
   lm_sensors
   mc
   memtest86+
   net-snmp-devel
   netpbm-progs
   nscd
   nss-pam-ldapd
   openldap-clients
   pam_krb5
   pam_ldap
   perl-Test-Pod
   perl-Test-Pod-Coverage
   perl-suidperl
   pexpect
   php-mysql
   planner
   qt-doc
   rpmdevtools
   rpmlint
   ruby-irb
   samba
   samba-winbind
   screen
   sox
   startup-notification-devel
   systemtap-grapher
   taskjuggler
   texinfo
   tftp
   thunderbird
   xchat
   xfig
   xmlto-tex
   xmltoman
   xorg-x11-proto-devel
   xrestop
   xz-devel
  
   %end


++ 5. Скрипт интеграции в Active Directory.

Собственно, это то, ради чего писалась вся статья. Скрипт достаточно прост, предназначен для использования теми, кто знает, что такое Active Directory и имеет соответствующее звание - Ад-мин. Проверки входных данных есть, но очень слабые.

Скрипт выполняет ряд важных действий:

*** Выполняет синхронизацию времени компьютера с доменом.    Адреса NTP сервера(-ов) берутся из DHCP. Если синхронизация по чему либо не срабатывает - скрипт запрашивает адрес NTP сервера.
*** Запрашивает имя компьютера и домена.
*** Прописывает эти значения в файлах конфигурации Самбы, Цербера и Лдапа.
*** Запрашивает имя админа и авторизуется им в Цербере.
*** Присоединяет комп к Active Directory.
*** Выполняет ряд дополнительных настроек компьютера.

Скрипт /pub/CentOS-conf/adsjoin

   #!/bin/bash
   # c#hkconfig: 345 98 1
   ### BEGIN INIT INFO
   # Provides: adsjoin
   # Default-Start: 3 4 5
   # Default-Stop: 0 1 2 6
   # Required-Start:
   # Should-Start: $network
   # Short-Description: Requests ADS data and joins domain
   # Description: Asks user to enter ADS domain name, admin account and password.
   #        Configures system to use ADS and joins it.
   ### END INIT INFO


   # Source function library.
   . /etc/init.d/functions

   FILENAME=/etc/sysconfig/adsjoin

   [ -z "$HOME" ] && export HOME=/

   usage() {
       echo $"Usage: $0 {start|stop}"
   }

   prepareConfig() {
    # Fix system hostname
    fhn="${HOSTNAME,,}.${DOMAINNAME_FULL,,}"
    sed -i.adsjoinbak '/^HOSTNAME=/s/=.*/='$fhn'/' /etc/sysconfig/network
    hostname ${fhn}
    
    # add this name to work
    echo 127.0.0.1 ${fhn} ${fhn/.*}  >> /etc/hosts


    cat <<EOSMB >> /etc/samba/smb.conf
   [global]
    winbind refresh tickets = true
    kerberos method = secrets and keytab
   EOSMB

   cat <<EOPWB >> /etc/security/pam_winbind.conf
   krb5_auth = yes
   cached_login = yes
   krb5_ccache_type = FILE
   EOPWB

    #    --winbindtemplateprimarygroup=users \
    basedn=$(echo ${DOMAINNAME_FULL,,} | sed 's/^\.*/dc=/;s/\.*$//;s/\.\.*/,dc=/g')

    authconfig --update \
        --enablelocauthorize --enablecache \
        --enablekrb5realmdns --enablekrb5kdcdns \
        --ldapserver=ldap://${DOMAINNAME_FULL,,}/ --ldapbasedn=${basedn} \
        --enablemkhomedir --winbindtemplatehomedir=/home/%U --winbindtemplateshell=/bin/bash \
        --enablewinbindusedefaultdomain --enablewinbindauth --enablewinbind --enablewinbindoffline \
        --smbsecurity=ads --smbrealm=${DOMAINNAME_FULL} --smbworkgroup=${DOMAINNAME_SHORT} --smbservers='*'


    cat <<EOKRB > /etc/krb5.conf
   [logging]
    default = FILE:/var/log/krb5libs.log
    kdc = FILE:/var/log/krb5kdc.log
    admin_server = FILE:/var/log/kadmind.log

   [libdefaults]
    default_realm = ${DOMAINNAME_FULL}
    dns_lookup_realm = true
    dns_lookup_kdc = true
    ticket_lifetime = 24h
    renew_lifetime = 7d
    forwardable = true

   [domain_realm]
    .${DOMAINNAME_FULL,,} = ${DOMAINNAME_FULL}
    ${DOMAINNAME_FULL,,} = ${DOMAINNAME_FULL}
   EOKRB

   }

   askHostDom() {
    local hn dn
    while :; do
        read -p 'Enter HOSTNAME without domain: ' hn
        [ 0 -eq "$?" -a 4 -le ${#hn} -a ${#hn} -le 15 -a -z "$(expr "$hn" : '[a-zA-Z0-9-]*\(.*\)')" ] &&
            break;
        echo "Wrong value ${hn}"
        echo "You have to specify HOSTNAME 4 to 15 chars long."
        echo "Only numbers, latin letter and '-' are allowed."
    done

    while :; do
        read -p 'Enter DOMAINNAME: ' dn
        [ 0 -eq "$?" -a 6 -le ${#dn} -a -z "$(expr "$dn" : '[.a-zA-Z0-9-]*\(.*\)')" ] &&
            break;
        echo "Wrong value ${dn}"
        echo "You have to specify DOMAINNAME at least 6 chars long."
        echo "Only latin letter, numbers, '.' and '-' are allowed."
    done
    HOSTNAME="$hn"
    DOMAINNAME_FULL="${dn^^}"
    DOMAINNAME_SHORT=${DOMAINNAME_FULL/.*}
   }

   askOrgDir() {
    local od
    echo 'Enter Organizational directory where to create computer'\''s account. Defaut is "Computers".'
    echo 'Example: Site/Unit/Computers'

    read -p 'Org. dir.: ' od
    ORG_DIRECTORY="$od"
   }

   askAdmAccount() {
    local un
        
    while :; do
        read -p "Enter Admin account of scpecified domain: " un
        [ 0 -eq "$?" -a 1 -lt ${#un} ] && break;
        echo "Wrong value ${un}"
        echo "You have to specify admin account at least 1 char long."
    done
    ADMINACCOUNT="$un"
   }

   case "$1" in
    start)
        if [ `/usr/bin/id -u` -ne 0 ]; then
            echo $"ERROR: Only root can run $0"
            exit 4
        fi

        if [ ! -f /usr/bin/net ]; then
            echo $"ERROR: samba is not installed"
            exit 5
        fi

        args=""

        if [ -f $FILENAME ] && [ ! -z "$(grep 'RUN_ADSJOIN=NO' $FILENAME)" ]; then
            exit 0
        fi

        . /etc/profile.d/lang.sh

        /usr/bin/plymouth --hide-splash

    echo
    echo '========================================================'
    echo '============   Joining ADS'
    echo '========================================================'
    echo


    NTPSRVSRC='DHCP'
    NTPSRVS=$(sed -n 's/^server[[:space:]]*\([^[:space:]]*\).*/\1/p' /etc/ntp.conf| grep -v '^127' | sort -u)
    while :; do
        if [ -n "$NTPSRVS" ] ; then
            if ntpdate -u -b $NTPSRVS
            then
                echo "Ok"
                break;
            else
                echo "Can not synchronize to $NTPSRVS"
            fi
        fi
        echo -e "WARNING!!!\nNO working time servers specified by ${NTPSRVSRC}!"
        read -p 'Enter NTP server(s) of domain: ' NTPSRVS
        NTPSRVSRC=user
    done

    askHostDom

    echo
    prepareConfig
    echo

    service rsyslog restart

        /sbin/chkconfig winbind on

    RETVAL=255

    HOME=/root
    LOGNAME=root
    USER=root
    export HOME LOGNAME USER


    cntr=3
    while [ 0 -lt "$cntr" ]; do
        askAdmAccount
        if /usr/bin/kinit "${ADMINACCOUNT}"; then
            RETVAL=0;
            break;
        fi
        RETVAL=$?
        echo "Error loging in domain ${DOMAINNAME_FULL}"
        cntr=$(( $cntr - 1 ))
    done
    
    if [ "$RETVAL" -eq 0 ]; then
        cntr=3
        while [ 0 -lt "$cntr" ]; do

            askOrgDir
            if [ -n "${ORG_DIRECTORY}" ]; then
                ADS_ORG="createcomputer='${ORG_DIRECTORY}'"
            else
                ADS_ORG=""
            fi
            ( eval "set -x; /usr/bin/net ads join -d 1 -k ${ADS_ORG}" ) 2>&1 | tee /tmp/net-ads-join-$$-$cntr

   #            /usr/bin/net ads join -d 2 -k

            RETVAL=$?

            if [ "$RETVAL" -ne 0 ]; then
                echo "WARNING!!! Join failed"
                read -p 'Press Enter'
            else
                {
                /usr/bin/net -d 1 ads keytab create
                /sbin/service winbind restart
                /usr/bin/net -d 1 ads dns register
                } > /tmp/adsjoin-$$ 2>&1
                break;
            fi
            cntr=$(( $cntr - 1 ))
        done
    fi


        /usr/bin/plymouth --show-splash

        # If adsjoin succeeded, chkconfig it off so we don't see the message
        # every time about starting up adsjoin.
        if [ "$RETVAL" -eq 0 ]; then
            action "" /bin/true
        else
            action "" /bin/false
        fi

        /sbin/chkconfig adsjoin off

        exit $RETVAL
        ;;

    stop)
        exit 0
        ;;

    status)
        /sbin/chkconfig --list adsjoin | grep on >/dev/null
        RETVAL=$?

        if [ "$RETVAL" -eq 0 ]; then
            if [ ! -f $FILENAME ] || [ -z "$(grep 'RUN_ADSJOIN=NO' $FILENAME)" ]; then
                echo $"adsjoin is scheduled to run"
            else
                echo $"adsjoin is not scheduled to run"
            fi
        else
            echo $"adsjoin is not scheduled to run"
        fi

        exit 0
        ;;

    restart | reload | force-reload | condrestart | try-restart)
        usage
        exit 3
        ;;

    *)
        usage
        exit 2
        ;;
   esac


Примечание:

Параметры "kerberos method" файла /etc/samba/smb.conf и "krb5_ccache_type" файла /etc/security/pam_winbind.conf должны соответствовать друг другу, иначе пользователь не  сможет войти в систему.

Как ни странно, синхронизация времени часто сбивается в первые секунды после получения адреса по dhcp - приходится вводить адреса серверов времени по нескольку раз.
Скрипт перезапускает самбу и при его корректном завершении компьютер готов для работы без перезагрузки.

++ 6. Запускаем компьютеры

Подключаем к установочному VLAN-у коммутатор.
Запасаемся веером патч-кордов, кабелей питания и пр.
Подключаем сразу несколько компьютеров.
Запускаем на каждом новом компьютере загрузку по сети, по протоколу PXE.

У моих компьютеров сетевая загрузка была отключена, приходилось к каждому подключать монитор и клавиатуру и немного донастраивать BIOS. Но в итоге, параллельная подготовка компьютеров, включившая распаковку, заливку, введение в домен и упаковку для отправки в дальний офис занимала менее часа на десяток компьютеров, при том, что отдельный компьютер подготавливается около 15 минут.

++ Что не добавлено

1. Если какие-либо системные утилиты, работающие под уч. записью root и понимающие, что такое Цербер, лезут к компьютерам домена, можно добавить в крон ежечасный вызов

   /usr/bin/net ads kerberos kinit -P

- инициализация Церберного билета уч. записи компьютера.

2. Можно добавить клиенту DHCP скрипт само-регистрации в DNS:
/etc/dhcp/dhclient.d/dnsreg.sh

   #!/bin/sh

   dnsreg_config() {
        if [ -x /usr/bin/net ] ; then
                /usr/bin/net ads dns register -P 2>&1 | logger -p    daemon.info -t dhclient
        fi
        true
   }


3. Не настроен сервер обновлений. У нас CentOS ставился для пробы перед покупкой RedHat-а, обновлять его как-то не планировалось.

++ Благодарности

*** Руководству - за поставленную задачу и время, выделенное на её решение.
*** VMWare - за незначительное количество "особенностей" в эмуляторе, в целом просто невероятным образом сократившего время отладки.
*** Microsoft - за незабываемое время проведённое в борьбе с Active Directory.
*** Wireshark.org - за отличный инструмент борьбы со всем этим счастьем.


URL:
Обсуждается: http://www.opennet.me/tips/info/2730.shtml


Содержание

Сообщения в этом обсуждении
"Почти автоматическое разворачивание рабочих станций CentOS в домене MS Active Directory"
Отправлено Аноним12 , 05-Янв-13 02:52 
Неужто стали внедрять Linux в таких масштабах на рабочих станциях

"Почти автоматическое разворачивание рабочих станций CentOS в домене MS Active Directory"
Отправлено mike_t , 05-Янв-13 10:06 
Добавляем строку multilib_policy=all
э.. а так не работает чтоль?
%packages --multilib

"Почти автоматическое разворачивание рабочих станций CentOS в..."
Отправлено kazarov , 13-Янв-13 19:49 
> Добавляем строку multilib_policy=all
> э.. а так не работает чтоль?
> %packages --multilib

Да, слона то я и не приметил.


"Почти автоматическое разворачивание рабочих станций CentOS в..."
Отправлено kazarov , 19-Янв-13 07:20 
Проверил.
Ругается (перепечатывал ручками, возможны очепятки):
The following problem occured on line 179 of the kickstart file:

no such option: --multilib

install exited abnormally [1/1]
The system will be rebooted when you press Ctrl-C or Ctrl-Alt-Delete.

Да и в коде анаконды такого слова не нашёл.

Скорее всего это ещё не доехало в центос из федоры.


"Почти автоматическое разворачивание рабочих станций CentOS в домене MS Active Directory"
Отправлено mike_t , 05-Янв-13 10:06 
# Создаём учётные записи для великих гуру - пусть имеют возможность зайти на любой компьютер

http://fedoraproject.org/wiki/Anaconda/Kickstart#user ?


"Почти автоматическое разворачивание рабочих станций CentOS в..."
Отправлено kazarov , 13-Янв-13 19:38 
Kickstart создаёт юзеров с персональной группой в качестве основной. Это часто мешает работе нескольких гуру.

"Почти автоматическое разворачивание рабочих станций CentOS в домене MS Active Directory"
Отправлено mike_t , 05-Янв-13 10:07 
# Включаем нужные сервисы и выключаем не нужные.
http://fedoraproject.org/wiki/Anaconda/Kickstart#services

"Почти автоматическое разворачивание рабочих станций CentOS в домене MS Active Directory"
Отправлено mike_t , 05-Янв-13 10:07 
# Ставим дополнительные пакеты.
а здесь лучше создать и вести свой репозиторий yum

"Почти автоматическое разворачивание рабочих станций CentOS в домене MS Active Directory"
Отправлено Андрей Покало , 06-Янв-13 20:09 
очередной велосипед, В дистрибутиве CentOS есть system-config-netboot, проснись и пой! :-)

"Почти автоматическое разворачивание рабочих станций CentOS в..."
Отправлено mike_t , 08-Янв-13 08:27 
я так и не смог добиться от нетбут того что мне надо :(

"Почти автоматическое разворачивание рабочих станций CentOS в..."
Отправлено Андрей Покало , 08-Янв-13 11:04 
> я так и не смог добиться от нетбут того что мне надо
> :(

у меня уже лет семь работают бездисковые терминальные клиенты на работе при помощи нетбут, до этого использовал связку чуть по сложнее LTSP


"Почти автоматическое разворачивание рабочих станций CentOS в домене MS Active Directory"
Отправлено Nicolas , 08-Янв-13 07:27 
Спасибо за статью, грамотно разложено по полочкам, с множеством деталей, чего часто не хватает сейчас.

"Почти автоматическое разворачивание рабочих станций CentOS в домене MS Active Directory"
Отправлено name , 09-Янв-13 02:10 
файл vesamenu.c32 лучше копировать оттуда, где берется pxelinux.0
если они окажутся от разных версий syslinux, то может не заработать загрузка меню.
в 3.хх версии однажды наткнулся на такую граблю

"Почти автоматическое разворачивание рабочих станций CentOS в домене MS Active Directory"
Отправлено Евгений , 09-Янв-13 08:46 
Проще поставить станцию настроить ровно 1 раз, а далее одним скриптом подключать к домену. PXE только для LTSP, и для тех кто привык все ставить через инсталятор. На Linux проще все ставить
gzip -cd образ | dd of=/dev/sda

"Почти автоматическое разворачивание рабочих станций CentOS в..."
Отправлено Андрей Покало , 09-Янв-13 09:40 
> Проще поставить станцию настроить ровно 1 раз, а далее одним скриптом подключать
> к домену. PXE только для LTSP, и для тех кто привык
> все ставить через инсталятор. На Linux проще все ставить
> gzip -cd образ | dd of=/dev/sda

а если /dev/sda нету на машине? т.е. загрузка оси происходит не с жесткого диска, а с сервера в сети. Хотя речь в статье идет об инсталляции оси на рабочую станцию, всего лишь...


"Почти автоматическое разворачивание рабочих станций CentOS в..."
Отправлено mike_t , 09-Янв-13 10:53 
по времени примерно столько же, но менее удобно и в дальнейшем более косячно ибо сейчас линукс очень любит привязываться к id железа и генерировать uuid на каждый чих

"Почти автоматическое разворачивание рабочих станций CentOS в..."
Отправлено kazarov , 13-Янв-13 19:44 
Несколько возражений:

1. В домен вводить всё равно придётся.
2. Машины могут быть с разными дисками, не делать же имидж для каждой.
3. Что-то делать ручками??? Ну уж нет! Кабели воткнул, включил - пусть сами работают.


"Почти автоматическое разворачивание рабочих станций CentOS в..."
Отправлено user , 15-Янв-13 17:53 
# 2. Машины могут быть с разными дисками, не делать же имидж для каждой.
man sfdisk

"Почти автоматическое разворачивание рабочих станций CentOS в..."
Отправлено гыук , 16-Янв-13 19:01 
Да, да. А ещё
man resize2fs

И обязательно
info grub
ведь grub может захотеть перестановки, если биос диски немного не так репортит.

И ради чего весь этот геморрой? Установка нормальным способом - 15 минут в автомате, полная заливка диска - 85 минут для Hitachi HDS721050CLA360.


"Почти автоматическое разворачивание рабочих станций CentOS в..."
Отправлено sems , 09-Янв-13 09:35 
А почему такой странный выбор адреса подсети?

"Почти автоматическое разворачивание рабочих станций CentOS в..."
Отправлено mike_t , 09-Янв-13 10:51 
обычный приватный

"Почти автоматическое разворачивание рабочих станций CentOS в..."
Отправлено sems , 10-Янв-13 12:36 
Да. сорри это я что то ступил

"Почти автоматическое разворачивание рабочих станций CentOS в домене MS Active Directory"
Отправлено dd , 11-Янв-13 18:37 
А про 100 % лицензионности. Это зря. Документы где?
Для отдела к нужны документы.

"Почти автоматическое разворачивание рабочих станций CentOS в..."
Отправлено цирроз , 14-Янв-13 15:48 
больше сказать нечего было?
любой адекватный админ знает, где можно легально приобрести дистрибутив с квитанцией о покупке. так что пускай "отдел к" ловит вантузятников