Новости из Блогов Почти автоматическое разворачивание рабочих станций CentOS в домене MSActiveDirectory

Discussion in 'Мировые новости. Обсуждения.' started by Suicide, 8 Jan 2013.

  1. Suicide

    Suicide Super Moderator
    Staff Member

    Joined:
    24 Apr 2009
    Messages:
    2,482
    Likes Received:
    7,062
    Reputations:
    693
    Почти автоматическое разворачивание рабочих станций CentOS в домене MS Active Directory

    05.01.2013
    Автор: Дмитрий Казаров
    http://www.opennet.ru/tips/2730_centos_samba_ldap_activedirectory_kickstart_install_pxe_boot.shtml



    В заметке рассказывается о решении задачи по автоматизации установки новых 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 до примерно такого вида:
    Code:
     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 - файл в папке загрузочных файлов (см следующий пункт).

    включаем загрузку демона
    Code:
    chkconfig dhcpd on
    и запускаем его
    Code:
    service dhcpd start
    
    1.3 Настраиваем tftp

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

    Создаём саму папку для загрузочных файлов (/tftpboot - из параметра server_args):
    Code:
    mkdir /tftpboot
    Ставим пакет syslinux-а
    Code:
     yum install syslinux-4.02-7.el6.x86_64
    
    И копируем PXE-шный загрузчкик в выбранное место:
    Code:
    cp /usr/share/syslinux/pxelinux.0 /tftpboot
    И включаем демон:
    Code:
      chkconfig xinetd on
       service xinetd restart
    1.4 Настраиваем NFS

    Создаём папку для дистрибутива
    Code:
     mkdir -p /pub/CentOS
    Распаковываем туда дистрибутив
    Code:
     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
    Открываем к доступ к папке
    Code:
     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 и папку для дополнительных файлов загрузчика.
    Code:
    mkdir -p /tftpboot/pxelinux.cfg
    Копируем туда под именем default файл конфигурации isolinux-а с дистрибутива CentOS...
    Code:
    cd /pub/CentOS/isolinux/
       cp isolinux.cfg /tftpboot/pxelinux.cfg/default
       [
    ][/CODE]
    ...и несколько файлов, используемых при загрузке.
    Code:
     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 примерно такого вида:
    Code:
      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 во временную папку
    Code:
     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 строка файла. Можно применить такой патчик:
    Code:
    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
    Кладём подправленный файл в папку, откуда его точно заглотит инсталлятор:
    Code:
    mkdir /pub/CentOS/RHupdates/
       cp yuminstall.py /pub/CentOS/RHupdates/
    4. Создание конфигурации Kickstart.

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

    Пакеты выбираем по собственному вкусу, но для интеграции с Active Directory необходимы
    Code:
    samba-winbind
        krb5-workstation
        openldap-clients
    их можно выбрать в "Выбор пакетов" -> "Базовая система" -> "Клиент каталогов".
    На всякий случай, мало ли на какой каталог придётся переползать, я ставлю вообще все пакеты этого подраздела.

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

    У меня файл /pub/CentOS-conf/desktop.cfg получился таким (он содержит комментарии на русском, их лучше удалить перед использованием - не хватало ещё глюков из-за кириллицы):
    Code:
    #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
    Продолжение ->
     
    _________________________
  2. Suicide

    Suicide Super Moderator
    Staff Member

    Joined:
    24 Apr 2009
    Messages:
    2,482
    Likes Received:
    7,062
    Reputations:
    693
    Продолжение.



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

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

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

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

    Скрипт /pub/CentOS-conf/adsjoin
    Code:
    #!/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 и понимающие, что такое Цербер, лезут к компьютерам домена, можно добавить в крон ежечасный вызов
    Code:
     /usr/bin/net ads kerberos kinit -P
    - инициализация Церберного билета уч. записи компьютера.

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

    Code:
     #!/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 - за отличный инструмент борьбы со всем этим счастьем.
     
    _________________________
Loading...