В заметке рассказывается о решении задачи по автоматизации установки новых 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.dev/tips/info/2730.shtml