From ae44332c692ba72e68483eb7a360b0e50a766aba Mon Sep 17 00:00:00 2001 From: xiaodongwang <xiaodongwang@huawei.com> Date: Tue, 6 May 2014 11:31:00 -0700 Subject: [PATCH] update snippet to support preseed Change-Id: I8442758ffaf3a55ec4773bf820bc4cdefb2e6452 --- .../mysql/templates/default/grants.sql.erb | 3 +- .../providers/volume.rb | 2 +- .../openstack-dashboard/attributes/default.rb | 2 +- .../openstack-dashboard/spec/server_spec.rb | 2 +- chef/databags/openstack/openstack.json | 2 +- cobbler/kickstarts/default.ks | 56 +-- cobbler/kickstarts/default.seed | 115 ++++++ cobbler/snippets/chef | 61 ++- cobbler/snippets/client.rb | 15 +- cobbler/snippets/hosts | 9 - cobbler/snippets/kickstart_chef | 12 + cobbler/snippets/kickstart_chef-validator.pem | 8 + cobbler/snippets/kickstart_chef_firstrun.sh | 25 ++ cobbler/snippets/kickstart_chef_init | 22 ++ cobbler/snippets/kickstart_chef_rerun.sh | 19 + cobbler/snippets/kickstart_chef_rsyslog.conf | 12 + cobbler/snippets/kickstart_client.rb | 28 ++ cobbler/snippets/kickstart_hosts | 12 + .../{limits.conf => kickstart_limits.conf} | 9 +- cobbler/snippets/kickstart_network_config | 7 + cobbler/snippets/kickstart_ntp | 80 ++++ cobbler/snippets/kickstart_partition_disks | 5 + cobbler/snippets/kickstart_post_anamon | 41 ++ .../kickstart_post_install_network_config | 350 ++++++++++++++++++ cobbler/snippets/kickstart_pre_anamon | 4 + .../kickstart_pre_install_network_config | 89 +++++ .../snippets/kickstart_pre_partition_disks | 80 ++++ cobbler/snippets/kickstart_rsyslog.conf | 53 +++ cobbler/snippets/kickstart_ssh | 24 ++ .../{sysctl.conf => kickstart_sysctl.conf} | 5 + cobbler/snippets/kickstart_yum.conf | 30 ++ cobbler/snippets/kickstart_yum_repo_config | 11 + cobbler/snippets/late_apt_repo_config | 24 -- cobbler/snippets/main_partition_select | 3 - cobbler/snippets/network_config_esx | 47 --- cobbler/snippets/network_config_esxi | 56 --- cobbler/snippets/ntp | 14 - cobbler/snippets/ntp.conf | 9 +- cobbler/snippets/partition_disks | 64 +--- cobbler/snippets/post_install_network_config | 7 +- cobbler/snippets/pre_partition_select | 33 -- cobbler/snippets/preseed_apt_repo_config | 5 +- cobbler/snippets/preseed_chef | 10 + cobbler/snippets/preseed_chef-validator.pem | 15 + cobbler/snippets/preseed_chef_firstrun.sh | 20 + cobbler/snippets/preseed_chef_init | 13 + cobbler/snippets/preseed_chef_rerun.sh | 14 + cobbler/snippets/preseed_chef_rsyslog.conf | 10 + cobbler/snippets/preseed_client.rb | 26 ++ cobbler/snippets/preseed_hosts | 10 + cobbler/snippets/preseed_limits.conf | 1 + cobbler/snippets/preseed_network_config | 21 ++ cobbler/snippets/preseed_ntp | 18 + cobbler/snippets/preseed_partition_disks | 32 ++ cobbler/snippets/preseed_post_anamon | 13 + cobbler/snippets/preseed_post_apt_repo_config | 24 ++ ...eb => preseed_post_install_network_config} | 153 ++++---- cobbler/snippets/preseed_pre_anamon | 4 + .../preseed_pre_install_network_config | 41 ++ cobbler/snippets/preseed_pre_partition_disks | 136 +++++++ cobbler/snippets/preseed_rsyslog.conf | 24 ++ cobbler/snippets/preseed_ssh | 23 ++ cobbler/snippets/preseed_sysctl.conf | 22 ++ cobbler/snippets/rsyslogconf | 3 +- cobbler/snippets/ssh | 9 - 65 files changed, 1651 insertions(+), 446 deletions(-) create mode 100644 cobbler/kickstarts/default.seed delete mode 100644 cobbler/snippets/hosts create mode 100644 cobbler/snippets/kickstart_chef create mode 100644 cobbler/snippets/kickstart_chef-validator.pem create mode 100644 cobbler/snippets/kickstart_chef_firstrun.sh create mode 100644 cobbler/snippets/kickstart_chef_init create mode 100644 cobbler/snippets/kickstart_chef_rerun.sh create mode 100644 cobbler/snippets/kickstart_chef_rsyslog.conf create mode 100644 cobbler/snippets/kickstart_client.rb create mode 100644 cobbler/snippets/kickstart_hosts rename cobbler/snippets/{limits.conf => kickstart_limits.conf} (94%) create mode 100644 cobbler/snippets/kickstart_network_config create mode 100644 cobbler/snippets/kickstart_ntp create mode 100644 cobbler/snippets/kickstart_partition_disks create mode 100644 cobbler/snippets/kickstart_post_anamon create mode 100644 cobbler/snippets/kickstart_post_install_network_config create mode 100644 cobbler/snippets/kickstart_pre_anamon create mode 100644 cobbler/snippets/kickstart_pre_install_network_config create mode 100644 cobbler/snippets/kickstart_pre_partition_disks create mode 100644 cobbler/snippets/kickstart_rsyslog.conf create mode 100644 cobbler/snippets/kickstart_ssh rename cobbler/snippets/{sysctl.conf => kickstart_sysctl.conf} (97%) create mode 100644 cobbler/snippets/kickstart_yum.conf create mode 100644 cobbler/snippets/kickstart_yum_repo_config delete mode 100644 cobbler/snippets/late_apt_repo_config delete mode 100644 cobbler/snippets/main_partition_select delete mode 100644 cobbler/snippets/network_config_esx delete mode 100644 cobbler/snippets/network_config_esxi delete mode 100644 cobbler/snippets/ntp delete mode 100644 cobbler/snippets/pre_partition_select create mode 100644 cobbler/snippets/preseed_chef create mode 100644 cobbler/snippets/preseed_chef-validator.pem create mode 100644 cobbler/snippets/preseed_chef_firstrun.sh create mode 100644 cobbler/snippets/preseed_chef_init create mode 100644 cobbler/snippets/preseed_chef_rerun.sh create mode 100644 cobbler/snippets/preseed_chef_rsyslog.conf create mode 100644 cobbler/snippets/preseed_client.rb create mode 100644 cobbler/snippets/preseed_hosts create mode 100644 cobbler/snippets/preseed_limits.conf create mode 100644 cobbler/snippets/preseed_network_config create mode 100644 cobbler/snippets/preseed_ntp create mode 100644 cobbler/snippets/preseed_partition_disks create mode 100644 cobbler/snippets/preseed_post_anamon create mode 100644 cobbler/snippets/preseed_post_apt_repo_config rename cobbler/snippets/{post_install_network_config_deb => preseed_post_install_network_config} (66%) create mode 100644 cobbler/snippets/preseed_pre_anamon create mode 100644 cobbler/snippets/preseed_pre_install_network_config create mode 100644 cobbler/snippets/preseed_pre_partition_disks create mode 100644 cobbler/snippets/preseed_rsyslog.conf create mode 100644 cobbler/snippets/preseed_ssh create mode 100644 cobbler/snippets/preseed_sysctl.conf delete mode 100644 cobbler/snippets/ssh diff --git a/chef/cookbooks/mysql/templates/default/grants.sql.erb b/chef/cookbooks/mysql/templates/default/grants.sql.erb index 87c0a0c..c07d9eb 100644 --- a/chef/cookbooks/mysql/templates/default/grants.sql.erb +++ b/chef/cookbooks/mysql/templates/default/grants.sql.erb @@ -17,8 +17,9 @@ GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY '<%= node['mysql']['server_root_pas # remove remote access for root user and set password for local root user DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1'); -UPDATE mysql.user SET Password=PASSWORD('<%= node['mysql']['server_root_password'] %>') WHERE User='root'; <% end %> +UPDATE mysql.user SET Password=PASSWORD('<%= node['mysql']['server_root_password'] %>') WHERE User='root'; + <% if node['mysql']['remove_anonymous_users'] -%> # Remove anonymous users diff --git a/chef/cookbooks/openstack-block-storage/providers/volume.rb b/chef/cookbooks/openstack-block-storage/providers/volume.rb index b9d875c..f4394f1 100644 --- a/chef/cookbooks/openstack-block-storage/providers/volume.rb +++ b/chef/cookbooks/openstack-block-storage/providers/volume.rb @@ -93,7 +93,7 @@ def select_loop_device resource output = %x{losetup -a|grep "/mnt/cinder-volumes"}.split(':') if output.empty? used_loop_device = %x{losetup -a |cut -f 1 -d ':'}.split - total_loop_device = %x{ls /dev/loop*}.split + total_loop_device = %x{ls /dev/loop* | egrep 'loop[0-9]+'}.split available_loop = total_loop_device - used_loop_device if available_loop.nil? resource.partition = nil diff --git a/chef/cookbooks/openstack-dashboard/attributes/default.rb b/chef/cookbooks/openstack-dashboard/attributes/default.rb index eebb187..9aa901e 100644 --- a/chef/cookbooks/openstack-dashboard/attributes/default.rb +++ b/chef/cookbooks/openstack-dashboard/attributes/default.rb @@ -83,7 +83,7 @@ when "ubuntu" default["openstack"]["dashboard"]["local_settings_path"] = "/etc/openstack-dashboard/local_settings.py" default["openstack"]["dashboard"]["static_path"] = "/usr/share/openstack-dashboard/openstack_dashboard/static" default["openstack"]["dashboard"]["platform"] = { - "horizon_packages" => ["lessc", "openstack-dashboard"], + "horizon_packages" => ["node-less", "openstack-dashboard"], "mysql_python_packages" => ["python-mysqldb"], "postgresql_python_packages" => ["python-psycopg2"], "memcache_python_packages" => ["python-memcache"], diff --git a/chef/cookbooks/openstack-dashboard/spec/server_spec.rb b/chef/cookbooks/openstack-dashboard/spec/server_spec.rb index a7c5b98..304b20b 100644 --- a/chef/cookbooks/openstack-dashboard/spec/server_spec.rb +++ b/chef/cookbooks/openstack-dashboard/spec/server_spec.rb @@ -37,7 +37,7 @@ describe "openstack-dashboard::server" do end it "installs packages" do - expect(@chef_run).to upgrade_package "lessc" + expect(@chef_run).to upgrade_package "node-less" expect(@chef_run).to upgrade_package "openstack-dashboard" expect(@chef_run).to upgrade_package "python-mysqldb" end diff --git a/chef/databags/openstack/openstack.json b/chef/databags/openstack/openstack.json index d215716..8299312 100644 --- a/chef/databags/openstack/openstack.json +++ b/chef/databags/openstack/openstack.json @@ -295,7 +295,7 @@ } } }, - "support_oses": [ "CentOS*" ], + "support_oses": [ "CentOS*", "Ubuntu*" ], "services" : { "compute" : { "name" : "nova", "status" : "enable" }, diff --git a/cobbler/kickstarts/default.ks b/cobbler/kickstarts/default.ks index e336d22..899a2bb 100644 --- a/cobbler/kickstarts/default.ks +++ b/cobbler/kickstarts/default.ks @@ -10,12 +10,8 @@ bootloader --location=mbr # Clear MBR zerombr -# Pre-clear Partition -clearpart --all --initlabel - # Use Text Mode text -# cmdline # Disable Firewall firewall --disabled @@ -36,10 +32,9 @@ logging --level=info url --url=$tree -$SNIPPET('network_config') - -# Repository Config -repo --name=ppa_repo --baseurl=http://$server:$http_port/cobbler/repo_mirror/ppa_repo/ +$SNIPPET('kickstart_network_config') +$SNIPPET('kickstart_partition_disks') +$SNIPPET('kickstart_yum_repo_config') # Root Password #if $getVar('password', '') != "" @@ -67,21 +62,14 @@ install # Reboot After Installation reboot -%include /tmp/part-include - %pre $SNIPPET('log_ks_pre') $SNIPPET('kickstart_start') -$SNIPPET('pre_install_network_config') +$SNIPPET('kickstart_pre_install_network_config') +$SNIPPET('kickstart_pre_partition_disks') + # Enable installation monitoring -$SNIPPET('pre_anamon') -# useful to debug pre/post -# chvt 3 -# exec < /dev/tty3 > /dev/tty3 2>/dev/tty3 - -# get the number of hard disks and their names - -$SNIPPET('partition_disks') +$SNIPPET('kickstart_pre_anamon') # Packages %packages --nobase @@ -98,29 +86,19 @@ liblogging rsyslog %post --log=/var/log/post_install.log -$SNIPPET('post_install_network_config') - -cat << EOF > /etc/yum.conf -$SNIPPET('yum.conf') -EOF - -$SNIPPET('ssh') -$SNIPPET('ntp') +$SNIPPET('kickstart_post_install_network_config') chkconfig iptables off chkconfig ip6tables off -cat << EOF > /etc/security/limits.conf -$SNIPPET('limits.conf') -EOF +$SNIPPET('kickstart_yum.conf') +$SNIPPET('kickstart_ssh') +$SNIPPET('kickstart_ntp') +$SNIPPET('kickstart_limits.conf') +$SNIPPET('kickstart_sysctl.conf') +$SNIPPET('kickstart_rsyslog.conf') +#set $kickstart_tool = "kickstart_%s" % $tool +$SNIPPET($kickstart_tool) -cat << EOF > /etc/sysctl.conf -$SNIPPET('sysctl.conf') -EOF - -sysctl -p - -$SNIPPET($tool) - -$SNIPPET('post_anamon') +$SNIPPET('kickstart_post_anamon') $SNIPPET('kickstart_done') diff --git a/cobbler/kickstarts/default.seed b/cobbler/kickstarts/default.seed new file mode 100644 index 0000000..dd1031c --- /dev/null +++ b/cobbler/kickstarts/default.seed @@ -0,0 +1,115 @@ +# Mostly based on the Ubuntu installation guide +# https://help.ubuntu.com/12.04/installation-guide/ + +## Figure out if we're kickstarting a system or a profile +#if $getVar('system_name','') != '' +#set $what = "system" +#else +#set $what = "profile" +#end if + +# Preseeding only locale sets language, country and locale. +d-i debian-installer/locale string en_US +d-i debian-installer/country string US +d-i debian-installer/language string en + +# Keyboard selection. +# Disable automatic (interactive) keymap detection. +d-i console-setup/ask_detect boolean false +d-i console-setup/layoutcode string us +d-i console-setup/modelcode string SKIP +d-i keyboard-configuration/variantcode string us +d-i keyboard-configuration/layoutcode string us +d-i keyboard-configuration/model select Generic 105-key (Intl) PC +d-i console-keymaps-at/keymap select us +d-i keyboard-configuration/xkb-keymap select us + +d-i preseed/early_command string \ +$SNIPPET('preseed_pre_anamon') echo "processed preseed_pre_anamon" >> /tmp/preseed.log; \ +$SNIPPET('preseed_pre_install_network_config') echo "processed preseed_pre_install_network_config" >> /tmp/preseed.log; \ +wget -O- \ +http://$http_server/cblr/svc/op/script/$what/$name/?script=preseed_early_default | /bin/sh -s + +d-i partman/early_command string \ +$SNIPPET('preseed_pre_partition_disks') echo "processed preseed_pre_partition_disks" >> /tmp/preseed.log; \ +wget -O- \ +http://$http_server/cblr/svc/op/script/$what/$name/?script=partman_early_default | /bin/sh -s + +$SNIPPET('preseed_network_config') +$SNIPPET('preseed_partition_disks') + +# NTP/Time Setup +#if $getVar('timezone', '') != "" +d-i time/zone string $timezone +#else +d-i time/zone string US/Pacific +#end if +d-i clock-setup/utc boolean true +d-i clock-setup/ntp boolean true +d-i clock-setup/ntp-server string ntp.ubuntu.com + +# Setup the installation source +d-i mirror/country string manual +d-i mirror/http/hostname string $http_server +d-i mirror/http/directory string $install_source_directory +#if $getVar('proxy', '') != "" +d-i mirror/http/proxy string $proxy +#end if + +#set $os_v = $getVar('os_version','') +#if $os_v and $os_v.lower()[0] > 'p' +# Required at least for 12.10+ +d-i live-installer/net-image string http://$http_server/cobbler/ks_mirror/$distro_name/install/filesystem.squashfs +#end if + +# root account and password +d-i passwd/root-login boolean true +d-i passwd/make-user boolean false +#if $getVar('password', '') != "" +d-i passwd/root-password-crypted password $password +#else +d-i passwd/root-password password root +d-i passwd/root-password-again password root +#end if + +$SNIPPET('preseed_apt_repo_config') + +# Individual additional packages to install +# wget is REQUIRED otherwise quite a few things won't work +# later in the build (like late-command scripts) +d-i pkgsel/include string ntp ssh wget chef +# Whether to upgrade packages after debootstrap. +# Allowed values: none, safe-upgrade, full-upgrade +d-i pkgsel/upgrade select none +d-i popularity-contest/participate boolean false +d-i lilo-installer/skip boolean true +d-i grub-installer/only_debian boolean true + +# Use the following option to add additional boot parameters for the +# installed system (if supported by the bootloader installer). +# Note: options passed to the installer will be added automatically. +d-i debian-installer/add-kernel-opts string $kernel_options_post +d-i debian-installer/allow_unauthenticated string true + +# Avoid that last message about the install being complete. +d-i finish-install/reboot_in_progress note + +# This command is run just before the install finishes, but when there is +# still a usable /target directory. You can chroot to /target and use it +# directly, or use the apt-install and in-target commands to easily install +# packages and run commands in the target system. +# d-i preseed/late_command string [command] +d-i preseed/late_command string \ +$SNIPPET('preseed_post_install_network_config') echo "processed preseed_post_install_network_config" >> /tmp/preseed.log; \ +$SNIPPET('preseed_ssh') echo "processed preseed_ssh" >> /tmp/preseed.log; \ +$SNIPPET('preseed_ntp') echo "processed preseed_ntp" >> /tmp/preseed.log; \ +$SNIPPET('preseed_post_apt_repo_config') echo "processed preseed_post_apt_repo_config" >> /tmp/preseed.log; \ +#set $preseed_tool = "preseed_%s" % $tool +$SNIPPET($preseed_tool) echo "processed $preseed_tool" >> /tmp/preseed.log; \ +$SNIPPET('preseed_limits.conf') echo "processed preseed_limits.conf" >> /tmp/preseed.log; \ +$SNIPPET('preseed_sysctl.conf') echo "processed preseed_sysctl.conf" >> /tmp/preseed.log; \ +$SNIPPET('preseed_rsyslog.conf') echo "processed preseed_rsyslog.conf" >> /tmp/preseed.log; \ +$SNIPPET('preseed_post_anamon') echo "processed preseed_post_anamon" >> /tmp/preseed.log; \ +wget -O- \ + http://$http_server/cblr/svc/op/script/$what/$name/?script=preseed_late_default | \ + chroot /target /bin/sh -s diff --git a/cobbler/snippets/chef b/cobbler/snippets/chef index 892b66d..4f194f9 100644 --- a/cobbler/snippets/chef +++ b/cobbler/snippets/chef @@ -11,6 +11,11 @@ cat << EOL > /etc/chef/client.rb $SNIPPET('client.rb') EOL +## Generate first-boot.json +cat << EOL > /etc/chef/first-boot.json +$SNIPPET('first-boot.json') +EOL + ## Register Server in Rsyslog @@ -25,50 +30,17 @@ EOL service rsyslog restart -cat << EOF > /etc/chef/firstrun.sh -#raw -#!/bin/bash -touch /tmp/chef.log -while true; do - echo "firstrun chef-client on `date`" &>> /tmp/chef.log - clients=\$(pgrep chef-client) - if [ "\$?" == "0" ]; then - echo "there are chef-clients '\$clients' running" &>> /tmp/chef.log - sleep 1m - else - chef-client -L /var/log/chef-client.log &>> /tmp/chef.log - if [ "\$?" != "0" ]; then - echo "chef-client run failed" &>> /tmp/chef.log - sleep 1m - else - echo "chef-client run success" &>> /tmp/chef.log - break - fi - fi -done -#end raw -EOF - cat << EOF > /etc/chef/rerun.sh #raw #!/bin/bash -echo "rerun chef-client on `date`" &>> /tmp/chef.log -clients=\$(pgrep chef-client) -if [ "\$?" == "0" ]; then - echo "there are chef-clients '\$clients' running" &>> /tmp/chef.log - exit 1 -fi -chef-client &>> /tmp/chef.log +pgrep chef-client if [ "\$?" != "0" ]; then - echo "chef-client run failed" &>> /tmp/chef.log -else - echo "chef-client run success" &>> /tmp/chef.log +chef-client -p /var/run/chef-client.pid -j /etc/chef/first-boot.json &> /tmp/chef.log fi #end raw EOF -chmod +x /etc/chef/firstrun.sh -chmod +x /etc/chef/rerun.sh + ## A self-destruct service to boot chef client and register cron job cat << EOF > /etc/init.d/chef @@ -76,15 +48,26 @@ cat << EOF > /etc/init.d/chef # chkconfig: 2345 95 20 # description: Description of the script # processname: chef-agent -/etc/chef/firstrun.sh +#if $getVar('ntp_server', '') != "" +echo "old date is: \`date\`" 2>&1 > /tmp/ntp.log +echo "path: \$PATH" 2>71 >> /tmp/ntp.log +/sbin/service ntpd stop 2>&1 >> /tmp/ntp.log +/usr/sbin/ntpdate $server 2>&1 >> /tmp/ntp.log +/sbin/service ntpd start 2>&1 >> /tmp/ntp.log +echo "new date is: \`date\`" 2>&1 >> /tmp/ntp.log +#end if +/etc/chef/rerun.sh + +chmod +x /etc/chef/rerun.sh crontab -l > mycron -echo "*/30 * * * * /etc/chef/rerun.sh" >> mycron +echo "*/1 * * * * /etc/chef/rerun.sh" >> mycron crontab mycron rm mycron chkconfig chef off -mv /etc/init.d/chef /tmp/chef +rm -rf /etc/init.d/chef EOF + chmod +x /etc/init.d/chef chkconfig --level 2345 chef on diff --git a/cobbler/snippets/client.rb b/cobbler/snippets/client.rb index ca3a7b7..506db72 100644 --- a/cobbler/snippets/client.rb +++ b/cobbler/snippets/client.rb @@ -1,26 +1,15 @@ log_level :info -log_location '/dev/null' +log_location '/var/log/chef-client.log' #if $getVar('chef_url', '') != "" chef_server_url '$chef_url' #end if #if $getVar('proxy', '') != "" http_proxy '$proxy' https_proxy '$proxy' -ENV['http_proxy'] = '$proxy' -ENV['https_proxy'] = '$proxy' -ENV['HTTP_PROXY'] = '$proxy' -ENV['HTTPS_PROXY'] = '$proxy' #end if #if $getVar('ignore_proxy', '') != "" no_proxy '$ignore_proxy' -ENV['no_proxy'] = '$ignore_proxy' -ENV['NO_PROXY'] = '$ignore_proxy' -#end if -#if $getVar('chef_node_name', '') != "" -node_name '$chef_node_name' #end if validation_client_name 'chef-validator' -json_attribs nil -pid_file '/var/run/chef-client.pid' # Using default node name (fqdn) -no_lazy_load true + diff --git a/cobbler/snippets/hosts b/cobbler/snippets/hosts deleted file mode 100644 index 13a3e2d..0000000 --- a/cobbler/snippets/hosts +++ /dev/null @@ -1,9 +0,0 @@ -127.0.0.1 $system_name localhost localhost.localdomain localhost4 localhost4.localdomain4 -::1 $system_name localhost localhost.localdomain localhost6 localhost6.localdomain6 -# #for $iname, $idata in $interfaces.items() -# #set $ip = $idata.get("ip_address", "") -# #if $hostname != "" and $ip != "" -# $ip $hostname -# #end if -# #end for -# # $compass_ip $compass_hostname diff --git a/cobbler/snippets/kickstart_chef b/cobbler/snippets/kickstart_chef new file mode 100644 index 0000000..7dca2ad --- /dev/null +++ b/cobbler/snippets/kickstart_chef @@ -0,0 +1,12 @@ +mkdir -p /etc/chef + +## Generate chef rsyslog conf +$SNIPPET('kickstart_chef_rsyslog.conf') + +## Generate validation.pem +$SNIPPET('kickstart_chef-validator.pem') +## Generate client.rb +$SNIPPET('kickstart_client.rb') +$SNIPPET('kickstart_chef_firstrun.sh') +$SNIPPET('kickstart_chef_rerun.sh') +$SNIPPET('kickstart_chef_init') diff --git a/cobbler/snippets/kickstart_chef-validator.pem b/cobbler/snippets/kickstart_chef-validator.pem new file mode 100644 index 0000000..515a219 --- /dev/null +++ b/cobbler/snippets/kickstart_chef-validator.pem @@ -0,0 +1,8 @@ +#if $getVar('chef_validation_file', '') == "" + #set chef_validation_file = '/etc/chef-server/chef-validator.pem' +#end if +#set f = $open($chef_validation_file) +cat << EOL > /etc/chef/validation.pem +#echo $f.read() +EOL +#silent $f.close() diff --git a/cobbler/snippets/kickstart_chef_firstrun.sh b/cobbler/snippets/kickstart_chef_firstrun.sh new file mode 100644 index 0000000..aa1f5fe --- /dev/null +++ b/cobbler/snippets/kickstart_chef_firstrun.sh @@ -0,0 +1,25 @@ +cat << EOF > /etc/chef/firstrun.sh +#raw +#!/bin/bash +touch /tmp/chef.log +while true; do + echo "firstrun chef-client on \`date\`" &>> /tmp/chef.log + clients=\$(pgrep chef-client) + if [ "\$?" == "0" ]; then + echo "there are chef-clients '\$clients' running" &>> /tmp/chef.log + sleep 1m + else + chef-client -L /var/log/chef-client.log &>> /tmp/chef.log + if [ "\$?" != "0" ]; then + echo "chef-client run failed" &>> /tmp/chef.log + sleep 1m + else + echo "chef-client run success" &>> /tmp/chef.log + break + fi + fi +done +#end raw +EOF +chmod +x /etc/chef/firstrun.sh + diff --git a/cobbler/snippets/kickstart_chef_init b/cobbler/snippets/kickstart_chef_init new file mode 100644 index 0000000..0b1a90a --- /dev/null +++ b/cobbler/snippets/kickstart_chef_init @@ -0,0 +1,22 @@ +## A self-destruct service to boot chef client and register cron job +cat << EOF > /etc/init.d/chef +#raw +#!/bin/bash +# chkconfig: 2345 99 20 +# description: Description of the script +# processname: chef-agent +rm -rf /var/lib/rsyslog/firstboot_log +service rsyslog restart +/etc/chef/firstrun.sh + +crontab -l > /tmp/mycron +echo "*/30 * * * * /etc/chef/rerun.sh" >> /tmp/mycron +crontab /tmp/mycron +rm /tmp/mycron +chkconfig chef off +mv /etc/init.d/chef /tmp/chef +#end raw +EOF + +chmod +x /etc/init.d/chef +chkconfig chef on diff --git a/cobbler/snippets/kickstart_chef_rerun.sh b/cobbler/snippets/kickstart_chef_rerun.sh new file mode 100644 index 0000000..2ebd74e --- /dev/null +++ b/cobbler/snippets/kickstart_chef_rerun.sh @@ -0,0 +1,19 @@ +cat << EOF > /etc/chef/rerun.sh +#raw +#!/bin/bash +echo "rerun chef-client on \`date\`" &>> /tmp/chef.log +clients=\$(pgrep chef-client) +if [ "\$?" == "0" ]; then + echo "there are chef-clients '\$clients' running" &>> /tmp/chef.log + exit 1 +fi +chef-client &>> /tmp/chef.log +if [ "\$?" != "0" ]; then + echo "chef-client run failed" &>> /tmp/chef.log +else + echo "chef-client run success" &>> /tmp/chef.log +fi +#end raw +EOF +chmod +x /etc/chef/rerun.sh + diff --git a/cobbler/snippets/kickstart_chef_rsyslog.conf b/cobbler/snippets/kickstart_chef_rsyslog.conf new file mode 100644 index 0000000..ac42906 --- /dev/null +++ b/cobbler/snippets/kickstart_chef_rsyslog.conf @@ -0,0 +1,12 @@ +cat << EOL > /etc/rsyslog.d/chef.conf +\\$ModLoad imfile +\\$InputFileName /var/log/chef-client.log +\\$InputFileReadMode 0 +\\$InputFileTag +\\$InputFileStateFile firstboot_log +\\$InputFileSeverity notice +\\$InputFileFacility local3 +\\$InputRunFileMonitor +\\$InputFilePollInterval 1 +local3.info @$server:514 +EOL diff --git a/cobbler/snippets/kickstart_client.rb b/cobbler/snippets/kickstart_client.rb new file mode 100644 index 0000000..be3d106 --- /dev/null +++ b/cobbler/snippets/kickstart_client.rb @@ -0,0 +1,28 @@ +cat << EOL > /etc/chef/client.rb +log_level :info +log_location '/dev/null' +#if $getVar('chef_url', '') != "" +chef_server_url '$chef_url' +#end if +#if $getVar('proxy', '') != "" +http_proxy '$proxy' +https_proxy '$proxy' +ENV['http_proxy'] = '$proxy' +ENV['https_proxy'] = '$proxy' +ENV['HTTP_PROXY'] = '$proxy' +ENV['HTTPS_PROXY'] = '$proxy' +#end if +#if $getVar('ignore_proxy', '') != "" +no_proxy '$ignore_proxy' +ENV['no_proxy'] = '$ignore_proxy' +ENV['NO_PROXY'] = '$ignore_proxy' +#end if +#if $getVar('chef_node_name', '') != "" +node_name '$chef_node_name' +#end if +validation_client_name 'chef-validator' +json_attribs nil +pid_file '/var/run/chef-client.pid' +# Using default node name (fqdn) +no_lazy_load true +EOL diff --git a/cobbler/snippets/kickstart_hosts b/cobbler/snippets/kickstart_hosts new file mode 100644 index 0000000..22aa0f7 --- /dev/null +++ b/cobbler/snippets/kickstart_hosts @@ -0,0 +1,12 @@ +cat << EOL > /etc/hosts +127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 +::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 +#for $iname, $idata in $interfaces.items() + #if $hostname and $idata["management"] and $idata["static"] and $idata.get("ip_address", "") != "" +$idata["ip_address"] $hostname + #end if +#end for +#import os +#set $server_name = $os.uname[1] +$server $server_name +EOL diff --git a/cobbler/snippets/limits.conf b/cobbler/snippets/kickstart_limits.conf similarity index 94% rename from cobbler/snippets/limits.conf rename to cobbler/snippets/kickstart_limits.conf index a997849..0b116f3 100644 --- a/cobbler/snippets/limits.conf +++ b/cobbler/snippets/kickstart_limits.conf @@ -1,6 +1,8 @@ +cat << EOF > /etc/security/limits.conf +#raw # /etc/security/limits.conf # -#Each line describes a limit for a user in the form: +# Each line describes a limit for a user in the form: # #<domain> <type> <item> <value> # @@ -39,7 +41,6 @@ #<domain> <type> <item> <value> # -#raw #* soft core 0 #* hard rss 10000 #@student hard nproc 20 @@ -48,6 +49,6 @@ #ftp hard nproc 0 #@student - maxlogins 4 * - nofile 100000 -#end raw - # End of file +#end raw +EOF diff --git a/cobbler/snippets/kickstart_network_config b/cobbler/snippets/kickstart_network_config new file mode 100644 index 0000000..6de06e5 --- /dev/null +++ b/cobbler/snippets/kickstart_network_config @@ -0,0 +1,7 @@ +## start of cobbler network_config generated code +#if $getVar("system_name","") != "" +# Using "new" style networking config, by matching networking information to the physical interface's +# MAC-address +%include /tmp/pre_install_network_config +#end if +## end of cobbler network_config generated code diff --git a/cobbler/snippets/kickstart_ntp b/cobbler/snippets/kickstart_ntp new file mode 100644 index 0000000..9d04aa4 --- /dev/null +++ b/cobbler/snippets/kickstart_ntp @@ -0,0 +1,80 @@ +#if $getVar('ntp_server', '') != "" + +chkconfig ntpd on + +cat << EOF > /etc/ntp.conf +# For more information about this file, see the man pages +# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5). + +# Include the option tinker panic 0 at the top of your ntp.conf file. +# By default, the NTP daemon sometimes panics and exits if the underlying clock +# appears to be behaving erratically. This option causes the daemon to keep +# running instead of panicking. +tinker panic 0 + +driftfile /var/lib/ntp/drift + +# Permit time synchronization with our time source, but do not +# permit the source to query or modify the service on this system. +restrict default kod nomodify notrap nopeer noquery +restrict -6 default kod nomodify notrap nopeer noquery + +# Permit all access over the loopback interface. This could +# be tightened as well, but to do so would effect some of +# the administrative functions. +restrict 127.0.0.1 +restrict -6 ::1 + +# Hosts on local network are less restricted. +# restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap + +# Use public servers from the pool.ntp.org project. +# Please consider joining the pool (http://www.pool.ntp.org/join.html). +# server 0.centos.pool.ntp.org +# server 1.centos.pool.ntp.org +# server 2.centos.pool.ntp.org +#if $getVar('ntp_server', '') != "" +server $ntp_server +#end if + +# broadcast 192.168.1.255 autokey # broadcast server +# broadcastclient # broadcast client +# broadcast 224.0.1.1 autokey # multicast server +# multicastclient 224.0.1.1 # multicast client +# manycastserver 239.255.254.254 # manycast server +# manycastclient 239.255.254.254 autokey # manycast client + +# Undisciplined Local Clock. This is a fake driver intended for backup +# and when no outside source of synchronized time is available. +server 127.127.1.0 # local clock + +# Enable public key cryptography. +# crypto + +includefile /etc/ntp/crypto/pw + +# Key file containing the keys and key identifiers used when operating +# with symmetric key cryptography. +keys /etc/ntp/keys + +# Specify the key identifiers which are trusted. +# trustedkey 4 8 42 + +# Specify the key identifier to use with the ntpdc utility. +# requestkey 8 + +# Specify the key identifier to use with the ntpq utility. +# controlkey 8 + +# Enable writing of statistics records. +# statistics clockstats cryptostats loopstats peerstats +EOF + +chkconfig ntpd on +echo "old date is: `date`" 2>&1 > /tmp/ntp.log +echo "path: \$PATH" 2>&1 >> /tmp/ntp.log +/sbin/service ntpd stop 2>&1 >> /tmp/ntp.log +/usr/sbin/ntpdate $ntp_server 2>&1 >> /tmp/ntp.log +/sbin/service ntpd start 2>&1 >> /tmp/ntp.log +echo "new date is: `date`" 2>&1 >> /tmp/ntp.log +#end if diff --git a/cobbler/snippets/kickstart_partition_disks b/cobbler/snippets/kickstart_partition_disks new file mode 100644 index 0000000..6978d8f --- /dev/null +++ b/cobbler/snippets/kickstart_partition_disks @@ -0,0 +1,5 @@ +## start of cobbler network_config generated code +#if $getVar("system_name","") != "" +%include /tmp/part-include +#end if +## end of cobbler network_config generated code diff --git a/cobbler/snippets/kickstart_post_anamon b/cobbler/snippets/kickstart_post_anamon new file mode 100644 index 0000000..8d5a47f --- /dev/null +++ b/cobbler/snippets/kickstart_post_anamon @@ -0,0 +1,41 @@ +#if $str($getVar('anamon_enabled','')) == "1" + +## install anamon script +wget -O /usr/local/sbin/anamon "http://$server:$http_port/cobbler/aux/anamon" +## install anamon system service +cat << EOF > /etc/init.d/anamon.init +#raw +#!/bin/bash +## BEGIN INIT INFO +# Provides: anamon.init +# Default-Start: 3 5 +# Default-Stop: 0 1 2 4 6 +# Required-Start: +# Should-Start: $network +# Short-Description: Starts the cobbler anamon boot notification program +# Description: anamon runs the first time a machine is booted after +# installation. +## END INIT INFO + +# +# anamon.init: Starts the cobbler post-install boot notification program +# +# chkconfig: 35 95 95 +# +# description: anamon runs the first time a machine is booted after +# installation. +# +#end raw +/usr/local/sbin/anamon --watchfile "/var/log/boot.log /var/log/messages /var/log/dmesg" --name $name --server $server --port $http_port --exit +chkconfig anamon.init off +mv /etc/init.d/anamon.init /tmp/anamon.init +EOF + +## adjust permissions +chmod 755 /etc/init.d/anamon.init /usr/local/sbin/anamon +test -d /selinux && restorecon /etc/init.d/anamon.init /usr/local/sbin/anamon + +## enable the script +chkconfig anamon.init on + +#end if diff --git a/cobbler/snippets/kickstart_post_install_network_config b/cobbler/snippets/kickstart_post_install_network_config new file mode 100644 index 0000000..69efd5e --- /dev/null +++ b/cobbler/snippets/kickstart_post_install_network_config @@ -0,0 +1,350 @@ +# Start post_install_network_config generated code +#if $getVar('promisc_nics', '') != "" + #set promisc_interfaces = [promisc.strip() for promisc in $promisc_nics.split(',') if promisc.strip()] +#else + #set promisc_interfaces = [] +#end if +#if $getVar("system_name","") != "" + ## this is being provisioned by system records, not profile records + ## so we can do the more complex stuff + ## get the list of interface names + #set ikeys = $interfaces.keys() + #set osversion = $getVar("os_version","") + #import re + #set $vlanpattern = $re.compile("[a-zA-Z0-9]+[\.:][0-9]+") + ## Determine if we should use the MAC address to configure the interfaces first + ## Only physical interfaces are required to have a MAC address + ## Also determine the number of bonding devices we have, so we can set the + ## max-bonds option in modprobe.conf accordingly. -- jcapel + #set $configbymac = True + #set $numbondingdevs = 0 + #set $enableipv6 = False + ## ============================================================================= + #for $iname in $ikeys + ## look at the interface hash data for the specific interface + #set $idata = $interfaces[$iname] + ## do not configure by mac address if we don't have one AND it's not for bonding/vlans + ## as opposed to a "real" physical interface + #if $idata.get("mac_address", "") == "" and not $vlanpattern.match($iname) and not $idata.get("interface_type", "").lower() in ("master","bond","bridge"): + ## we have to globally turn off the config by mac feature as we can't + ## use it now + #set $configbymac = False + #end if + ## count the number of bonding devices we have. + #if $idata.get("interface_type", "").lower() in ("master","bond","bonded_bridge_slave") + #set $numbondingdevs += 1 + #end if + ## enable IPv6 networking if we set an ipv6 address or turn on autoconfiguration + #if $idata.get("ipv6_address", "") != "" or $ipv6_autoconfiguration == True + #set $enableipv6 = True + #end if + #end for + ## end looping through the interfaces to see which ones we need to configure. + ## ============================================================================= + #set $i = 0 + ## setup bonding if we have to + #if $numbondingdevs > 0 + +# we have bonded interfaces, so set max_bonds +if [ -f "/etc/modprobe.conf" ]; then + echo "options bonding max_bonds=$numbondingdevs" >> /etc/modprobe.conf +fi + #end if + ## ============================================================================= + ## create a staging directory to build out our network scripts into + ## make sure we preserve the loopback device + +# create a working directory for interface scripts +mkdir /etc/sysconfig/network-scripts/cobbler +cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/cobbler/ + ## ============================================================================= + ## configure the gateway if set up (this is global, not a per-interface setting) + #if $gateway != "" + +# set the gateway in the network configuration file +grep -v GATEWAY /etc/sysconfig/network > /etc/sysconfig/network.cobbler +echo "GATEWAY=$gateway" >> /etc/sysconfig/network.cobbler +rm -f /etc/sysconfig/network +mv /etc/sysconfig/network.cobbler /etc/sysconfig/network + #end if + ## ============================================================================= + ## Configure the system's primary hostname. This is also passed to anaconda, but + ## anaconda doesn't seem to honour it in DHCP-setups. + #if $hostname != "" + +# set the hostname in the network configuration file +grep -v HOSTNAME /etc/sysconfig/network > /etc/sysconfig/network.cobbler +echo "HOSTNAME=$hostname" >> /etc/sysconfig/network.cobbler +rm -f /etc/sysconfig/network +mv /etc/sysconfig/network.cobbler /etc/sysconfig/network + +# Also set the hostname now, some applications require it +# (e.g.: if we're connecting to Puppet before a reboot). +/bin/hostname $hostname + #end if + +$SNIPPET('kickstart_hosts') + + #if $enableipv6 == True +grep -v NETWORKING_IPV6 /etc/sysconfig/network > /etc/sysconfig/network.cobbler +echo "NETWORKING_IPV6=yes" >> /etc/sysconfig/network.cobbler +rm -f /etc/sysconfig/network +mv /etc/sysconfig/network.cobbler /etc/sysconfig/network + #if $ipv6_autoconfiguration != "" +grep -v IPV6_AUTOCONF /etc/sysconfig/network > /etc/sysconfig/network.cobbler + #if $ipv6_autoconfiguration == True +echo "IPV6_AUTOCONF=yes" >> /etc/sysconfig/network.cobbler + #else +echo "IPV6_AUTOCONF=no" >> /etc/sysconfig/network.cobbler + #end if +rm -f /etc/sysconfig/network +mv /etc/sysconfig/network.cobbler /etc/sysconfig/network + #end if + #if $ipv6_default_device != "" +grep -v IPV6_DEFAULTDEV /etc/sysconfig/network > /etc/sysconfig/network.cobbler +echo "IPV6_DEFAULTDEV=$ipv6_default_device" >> /etc/sysconfig/network.cobbler +rm -f /etc/sysconfig/network +mv /etc/sysconfig/network.cobbler /etc/sysconfig/network + #end if + #end if + ## ============================================================================= + ## now create the config file for each interface + #for $iname in $ikeys + +# Start configuration for $iname + ## create lots of variables to use later + #set $idata = $interfaces[$iname] + #set $mac = $idata.get("mac_address", "").upper() + #set $mtu = $idata.get("mtu", "") + #set $static = $idata.get("static", "") + #set $ip = $idata.get("ip_address", "") + #set $netmask = $idata.get("netmask", "") + #set $if_gateway = $idata.get("if_gateway", "") + #set $static_routes = $idata.get("static_routes", "") + #set $iface_type = $idata.get("interface_type", "").lower() + #set $iface_master = $idata.get("interface_master", "") + #set $bonding_opts = $idata.get("bonding_opts", "") + #set $bridge_opts = $idata.get("bridge_opts", "").split(" ") + #set $ipv6_address = $idata.get("ipv6_address", "") + #set $ipv6_secondaries = $idata.get("ipv6_secondaries", "") + #set $ipv6_mtu = $idata.get("ipv6_mtu", "") + #set $ipv6_default_gateway = $idata.get("ipv6_default_gateway", "") + #set $ipv6_static_routes = $idata.get("ipv6_static_routes", "") + #set $devfile = "/etc/sysconfig/network-scripts/cobbler/ifcfg-" + $iname + #set $routesfile = "/etc/sysconfig/network-scripts/cobbler/route-" + $iname + #set $ipv6_routesfile = "/etc/sysconfig/network-scripts/cobbler/route6-" + $iname + ## determine if this interface is for a VLAN + #if $vlanpattern.match($iname) + #set $is_vlan = "true" + #else + #set $is_vlan = "false" + #end if + ## slave interfaces are assumed to be static + #if $iface_type in ("slave","bond_slave","bridge_slave","bonded_bridge_slave") + #set $static = 1 + #end if + ## =================================================================== + ## Things every interface get, no matter what + ## =================================================================== +echo "DEVICE=$iname" > $devfile +echo "ONBOOT=yes" >> $devfile + #if $mac != "" and $iface_type not in ("master","bond","bridge","bonded_bridge_slave") + ## virtual interfaces don't get MACs +echo "HWADDR=$mac" >> $devfile +IFNAME=\$(ip -o link | grep -i '$mac' | sed -e 's/^[0-9]*: //' -e 's/:.*//') + ## Rename this interface in modprobe.conf + ## FIXME: if both interfaces startwith eth this is wrong +if [ -f "/etc/modprobe.conf" ] && [ \$IFNAME ]; then + grep \$IFNAME /etc/modprobe.conf | sed "s/\$IFNAME/$iname/" >> /etc/modprobe.conf.cobbler + grep -v \$IFNAME /etc/modprobe.conf >> /etc/modprobe.conf.new + rm -f /etc/modprobe.conf + mv /etc/modprobe.conf.new /etc/modprobe.conf +fi + #end if + ## =================================================================== + ## Actions based on interface_type + ## =================================================================== + #if $iface_type in ("master","bond","bonded_bridge_slave") + ## if this is a bonded interface, configure it in modprobe.conf + #if $osversion == "rhel4" +if [ -f "/etc/modprobe.conf" ]; then + echo "install $iname /sbin/modprobe bonding -o $iname $bonding_opts" >> /etc/modprobe.conf.cobbler +fi + #else + ## Add required entry to modprobe.conf +if [ -f "/etc/modprobe.conf" ]; then + echo "alias $iname bonding" >> /etc/modprobe.conf.cobbler +fi + #end if + #if $bonding_opts != "" +cat >> $devfile << EOF +BONDING_OPTS="$bonding_opts" +EOF + #end if + #elif $iface_type in ("slave","bond_slave") and $iface_master != "" +echo "SLAVE=yes" >> $devfile +echo "MASTER=$iface_master" >> $devfile +echo "HOTPLUG=no" >> $devfile + #end if + #if $iface_type == "bridge" +echo "TYPE=Bridge" >> $devfile + #for $bridge_opt in $bridge_opts + #if $bridge_opt.strip() != "" +echo "$bridge_opt" >> $devfile + #end if + #end for + #elif ($iface_type == "bridge_slave" or $iface_type == "bonded_bridge_slave") and $iface_master != "" +echo "BRIDGE=$iface_master" >> $devfile +echo "HOTPLUG=no" >> $devfile + #end if + #if $iface_type != "bridge" +echo "TYPE=Ethernet" >> $devfile + #end if + ## =================================================================== + ## Actions based on static/dynamic configuration + ## =================================================================== + #if $static + #if $mac == "" and $iface_type == "" +# WARNING! Configuring interfaces by their names only +# is error-prone, and can cause issues if and when +# the kernel gives an interface a different name +# following a reboot/hardware changes. + #end if +echo "BOOTPROTO=static" >> $devfile + #if $ip != "" and $iface_type not in ("slave","bond_slave","bridge_slave","bonded_bridge_slave") + ## Only configure static networking if an IP-address is configured + ## and if the interface isn't slaved to another interface (bridging or bonding) + #if $iname in $promisc_interfaces +echo "PROMISC=yes" >> $devfile + #else + #if $ip != "" +echo "IPADDR=$ip" >> $devfile + #end if + #if $if_gateway != "" +echo "GATEWAY=$if_gateway" >> $devfile + #end if + #if $netmask == "" + ## Default to 255.255.255.0? + #set $netmask = "255.255.255.0" + #end if +echo "NETMASK=$netmask" >> $devfile + #end if + #end if + #if $enableipv6 == True and $ipv6_autoconfiguration == False + #if $ipv6_address != "" +echo "IPV6INIT=yes" >> $devfile +echo "IPV6ADDR=$ipv6_address" >> $devfile + #end if + #if $ipv6_secondaries != "" + #set ipv6_secondaries = ' '.join(ipv6_secondaries) + ## The quotes around the ipv6 ip's need to be here +echo "IPV6ADDR_SECONDARIES=\"$ipv6_secondaries\"" >> $devfile + #end if + #if $ipv6_mtu != "" +echo "IPV6MTU=$ipv6_mtu" >> $devfile + #end if + #if $ipv6_default_gateway != "" +echo "IPV6_DEFAULTGW=$ipv6_default_gateway" >> $devfile + #end if + #end if + #else + ## this is a DHCP interface, much less work to do +echo "BOOTPROTO=dhcp" >> $devfile + #if $len($name_servers) > 0 +echo "PEERDNS=no" >> $devfile + #end if + #end if + ## =================================================================== + ## VLAN configuration + ## =================================================================== + #if $is_vlan == "true" +echo "VLAN=yes" >> $devfile +echo "ONPARENT=yes" >> $devfile + #end if + ## =================================================================== + ## Optional configuration stuff + ## =================================================================== + #if $mtu != "" +echo "MTU=$mtu" >> $devfile + #end if + ## =================================================================== + ## Non-slave DNS configuration, when applicable + ## =================================================================== + ## If the interface is anything but a slave then add DNSn entry + #if $iface_type.lower() not in ("slave","bond_slave","bridge_slave","bonded_bridge_slave") + #set $nct = 0 + #for $nameserver in $name_servers + #set $nct = $nct + 1 +echo "DNS$nct=$nameserver" >> $devfile + #end for + #end if + ## =================================================================== + ## Interface route configuration + ## =================================================================== + #for $route in $static_routes + #set routepattern = $re.compile("[0-9/.]+:[0-9.]+") + #if $routepattern.match($route) + #set $routebits = $route.split(":") + #set [$network, $router] = $route.split(":") +echo "$network via $router" >> $routesfile + #else +# Warning: invalid route "$route" + #end if + #end for + #if $enableipv6 == True + #for $route in $ipv6_static_routes + #set routepattern = $re.compile("[0-9a-fA-F:/]+,[0-9a-fA-F:]+") + #if $routepattern.match($route) + #set $routebits = $route.split(",") + #set [$network, $router] = $route.split(",") +echo "$network via $router dev $iname" >> $ipv6_routesfile + #else +# Warning: invalid ipv6 route "$route" + #end if + #end for + #end if + ## =================================================================== + ## Done with this interface + ## =================================================================== + #set $i = $i + 1 +# End configuration for $iname + #end for + ## ============================================================================= + ## Configure name server search path in /etc/resolv.conf + #set $num_ns = $len($name_servers) + #set $num_ns_search = $len($name_servers_search) + #if $num_ns_search > 0 + +sed -i -e "/^search /d" /etc/resolv.conf +echo -n "search " >>/etc/resolv.conf + #for $nameserversearch in $name_servers_search +echo -n "$nameserversearch " >>/etc/resolv.conf + #end for +echo "" >>/etc/resolv.conf + #end if + ## ============================================================================= + ## Configure name servers in /etc/resolv.conf + #if $num_ns > 0 + +sed -i -e "/^nameserver /d" /etc/resolv.conf + #for $nameserver in $name_servers +echo "nameserver $nameserver" >>/etc/resolv.conf + #end for + #end if + +## Disable all eth interfaces by default before overwriting +## the old files with the new ones in the working directory +## This stops unneccesary (and time consuming) DHCP queries +## during the network initialization +sed -i 's/ONBOOT=yes/ONBOOT=no/g' /etc/sysconfig/network-scripts/ifcfg-eth* + +## Move all staged files to their final location +rm -f /etc/sysconfig/network-scripts/ifcfg-* +mv /etc/sysconfig/network-scripts/cobbler/* /etc/sysconfig/network-scripts/ +rm -r /etc/sysconfig/network-scripts/cobbler +if [ -f "/etc/modprobe.conf" ]; then +cat /etc/modprobe.conf.cobbler >> /etc/modprobe.conf +rm -f /etc/modprobe.conf.cobbler +fi +#end if +# End post_install_network_config generated code diff --git a/cobbler/snippets/kickstart_pre_anamon b/cobbler/snippets/kickstart_pre_anamon new file mode 100644 index 0000000..ea20460 --- /dev/null +++ b/cobbler/snippets/kickstart_pre_anamon @@ -0,0 +1,4 @@ +#if $str($getVar('anamon_enabled','')) == "1" +wget -O /tmp/anamon "http://$server:$http_port/cobbler/aux/anamon" +python /tmp/anamon --name "$name" --server "$server" --port "$http_port" +#end if diff --git a/cobbler/snippets/kickstart_pre_install_network_config b/cobbler/snippets/kickstart_pre_install_network_config new file mode 100644 index 0000000..d9dad17 --- /dev/null +++ b/cobbler/snippets/kickstart_pre_install_network_config @@ -0,0 +1,89 @@ +#if $getVar("system_name","") != "" +# Start pre_install_network_config generated code +#raw +# generic functions to be used later for discovering NICs +mac_exists() { + if which ip 2>/dev/null >/dev/null; then + ip -o link | grep -i "$1" 2>/dev/null >/dev/null + return $? + elif which esxcfg-nics 2>/dev/null >/dev/null; then + esxcfg-nics -l | grep -i "$1" 2>/dev/null >/dev/null + return $? + else + ifconfig -a | grep -i "$1" 2>/dev/null >/dev/null + return $? + fi +} +get_ifname() { + if which ip 2>/dev/null >/dev/null; then + IFNAME=$(ip -o link | grep -i "$1" | sed -e 's/^[0-9]*: //' -e 's/:.*//') + elif which esxcfg-nics 2>/dev/null >/dev/null; then + IFNAME=$(esxcfg-nics -l | grep -i "$1" | cut -d " " -f 1) + else + IFNAME=$(ifconfig -a | grep -i "$1" | cut -d " " -f 1) + if [ -z $IFNAME ]; then + IFNAME=$(ifconfig -a | grep -i -B 2 "$1" | sed -n '/flags/s/:.*$//p') + fi + fi +} +#end raw + #set ikeys = $interfaces.keys() + #import re + #set $vlanpattern = $re.compile("[a-zA-Z0-9]+[\.:][0-9]+") + #set $routepattern = $re.compile("[0-9/.]+:[0-9.]+") + ## + #for $iname in $ikeys +# Start $iname + #set $idata = $interfaces[$iname] + #set $mac = $idata["mac_address"] + #set $static = $idata["static"] + #set $management = $idata["management"] + #set $ip = $idata["ip_address"] + #set $netmask = $idata["netmask"] + #set $iface_type = $idata["interface_type"] + #set $iface_master = $idata["interface_master"] + #set $static_routes = $idata["static_routes"] + #if not $management or $mac == "" + #continue + #end if +# Configuring $iname ($mac) +if mac_exists $mac +then + get_ifname $mac + #if $static and $ip != "" + #if $netmask == "" + ## Netmask not provided, default to /24. + #set $netmask = "255.255.255.0" + #end if + #set $netinfo = "--bootproto=static --ip=%s --netmask=%s" % ($ip, $netmask) + #if $gateway != "" + #set $netinfo = "%s --gateway=%s" % ($netinfo, $gateway) + #end if + #if $len($name_servers) > 0 + #set $netinfo = "%s --nameserver=%s" % ($netinfo, $name_servers[0]) + #end if + #else if not $static + #set $netinfo = "--bootproto=dhcp" + #else + ## Skip this interface, it's set as static, but without + ## networking info. +# Skipping (no configuration)... + #continue + #end if + #if $hostname != "" + #set $netinfo = "%s --hostname=%s" % ($netinfo, $hostname) + #end if + echo "network --device=\$IFNAME $netinfo" >> /tmp/pre_install_network_config + #for $route in $static_routes + #if $routepattern.match($route) + #set $routebits = $route.split(":") + #set [$network, $router] = $route.split(":") + ip route add $network via $router dev \$IFNAME + #else + # Warning: invalid route "$route" + #end if + #end for +fi + #end for +# End pre_install_network_config generated code +#end if diff --git a/cobbler/snippets/kickstart_pre_partition_disks b/cobbler/snippets/kickstart_pre_partition_disks new file mode 100644 index 0000000..dd4fdd1 --- /dev/null +++ b/cobbler/snippets/kickstart_pre_partition_disks @@ -0,0 +1,80 @@ +#set hostname=$getVar('hostname',None) +#set partition = $getVar('partition', None) + +#if $hostname == None +#set $vgname = "VolGroup00" +#else +#set $vgname = $hostname.split('.')[0] +#end if + +set \$(list-harddrives) +let disk_nums=\$#/2 +let disk_offset=0 +let found_disk_offset=0 +while [ \$disk_offset -lt \$disk_nums ]; +do +#if $getVar('partitions_only','') != "" +let found_disk=0 + #for $partition_only in $partitions_only.split(',') +if expr match "\$1" "$partition_only"; then + disks[found_disk_offset]=\$1 + let found_disk=1 +fi + #end for +if [ \$found_disk -gt 0 ]; then + let found_disk_offset=\$found_disk_offset+1 +fi +#else + disks[found_disk_offset]=\$1 + let found_disk_offset=\$found_disk_offset+1 +#end if +let disk_offset=\$disk_offset+1 +shift 2 +done +let disk_nums=\$found_disk_offset + +echo "clearpart --all --initlabel" > /tmp/part-include + +#if $getVar('keep_old_partitions', '0') != "0" + #if $getVar('partitions_only','') != "" +echo "ignoredisk --only-use=$partitions_only" >> /tmp/part-include + #end if +#end if + +echo "part /boot --fstype ext3 --size=100 --ondisk=\${disks[0]} --asprimary" >> /tmp/part-include +echo "part swap --recommended --maxsize=128000 --ondisk=\${disks[0]}" >> /tmp/part-include + +vggroup='' +let disk_offset=0 +while [ \$disk_offset -lt \$disk_nums ]; +do +let pv_id=\$disk_offset+1 +partname="pv.0\$pv_id" +echo "part \$partname --size=1 --grow --ondisk=\${disks[\$disk_offset]}" >> /tmp/part-include +vggroup="\$vggroup \$partname" +let disk_offset=\$disk_offset+1; +done + +echo "volgroup $vgname \$vggroup" >> /tmp/part-include + +echo "logvol / --fstype ext3 --vgname=$vgname --size=1 --grow --name=rootvol" >> /tmp/part-include + +#if $partition != None + #set vol_sizes = [part.strip() for part in $partition.split(';') if part.strip()] + #for vol_and_size in vol_sizes + #set vol, vol_size = $vol_and_size.split(' ', 1) + #set vol = $vol.strip() + #set vol_size = $vol_size.strip() + #if $vol.startswith('/') + #set volname = $vol[1:] + #if $vol_size.endswith('%'): + #set vol_percent = vol_size[:-1] +echo "logvol $vol --fstype ext3 --vgname=$vgname --size=1 --grow --percent=$vol_percent --name=${volname}vol" >> /tmp/part-include + #else +echo "logvol $vol --vgname=$vgname --fstype ext3 --size=$vol_size --name=${volname}vol" >> /tmp/part-include + #end if + #else +# $vol is not starts with / + #end if + #end for +#end if diff --git a/cobbler/snippets/kickstart_rsyslog.conf b/cobbler/snippets/kickstart_rsyslog.conf new file mode 100644 index 0000000..4451037 --- /dev/null +++ b/cobbler/snippets/kickstart_rsyslog.conf @@ -0,0 +1,53 @@ +cat << EOL > /etc/rsyslog.conf +#### MODULES #### +\\$ModLoad imuxsock # provides support for local system logging (e.g. via logger command) +\\$ModLoad imfile + +\\$WorkDirectory /var/lib/rsyslog +\\$ActionQueueType LinkedList +\\$ActionQueueFileName srvrfwd +\\$ActionResumeRetryCount -1 +\\$ActionQueueSaveOnShutDown on +*.* @@$server:514 + +# Provides UDP syslog reception +\\$ModLoad imudp +\\$UDPServerRun 514 + +# Provides TCP syslog reception +\\$ModLoad imtcp +\\$InputTCPServerRun 514 +#set system_name = $getVar('system_name','') +\\$LocalHostName $system_name + +#### GLOBAL DIRECTIVES #### + +# Use default timestamp format +\\$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat + +# File syncing capability is disabled by default. This feature is usually not required, +# not useful and an extreme performance hit +#$ActionFileEnableSync on + +# Include all config files in /etc/rsyslog.d/ +\\$IncludeConfig /etc/rsyslog.d/*.conf + + +#### RULES #### + +mail.* -/var/log/maillog + +# Log cron stuff +cron.* /var/log/cron + +# Everybody gets emergency messages +*.emerg * + +# Save news errors of level crit and higher in a special file. +uucp,news.crit /var/log/spooler + +# Save boot messages also to boot.log +local7.* /var/log/boot.log + +EOL +chkconfig rsyslog on diff --git a/cobbler/snippets/kickstart_ssh b/cobbler/snippets/kickstart_ssh new file mode 100644 index 0000000..d5bf617 --- /dev/null +++ b/cobbler/snippets/kickstart_ssh @@ -0,0 +1,24 @@ +mkdir -p /root/.ssh +chmod 700 -R /root/.ssh +#if $getVar("push_ssh_keys", "") != "" + #set $ssh_keys = $push_ssh_keys.split(',') + set $firstline = True + #for $ssh_key in $ssh_keys + #if not $ssh_key + #continue + #end if + #set f = open($ssh_key) + #if $firstline +cat << EOL > /root/.ssh/authorized_keys +#echo $f.read() +EOL + #else +cat << EOL >> /root/.ssh/authorized_keys +#echo $f.read() +EOL + #end if + #silent $f.close() + #set $firstline = False + #end for +chmod 600 /root/.ssh/authorized_keys +#end if diff --git a/cobbler/snippets/sysctl.conf b/cobbler/snippets/kickstart_sysctl.conf similarity index 97% rename from cobbler/snippets/sysctl.conf rename to cobbler/snippets/kickstart_sysctl.conf index 1811fc9..b814dfd 100644 --- a/cobbler/snippets/sysctl.conf +++ b/cobbler/snippets/kickstart_sysctl.conf @@ -1,3 +1,5 @@ +cat << EOF > /etc/sysctl.conf +#raw # Kernel sysctl configuration file for Red Hat Linux # # For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and @@ -65,3 +67,6 @@ net.core.somaxconn = 8192 # avoid caching tcp network transfer statistics net.ipv4.route.flush=1 +#end raw +EOF +sysctl -p diff --git a/cobbler/snippets/kickstart_yum.conf b/cobbler/snippets/kickstart_yum.conf new file mode 100644 index 0000000..6b7e002 --- /dev/null +++ b/cobbler/snippets/kickstart_yum.conf @@ -0,0 +1,30 @@ +cat << EOF > /etc/yum.conf +[main] +cachedir=/var/cache/yum/$basearch/$releasever +#if $getVar('proxy', '') != "" +proxy=$proxy +#end if +keepcache=0 +debuglevel=2 +logfile=/var/log/yum.log +exactarch=1 +obsoletes=1 +gpgcheck=1 +plugins=1 +installonly_limit=5 +bugtracker_url=http://bugs.centos.org/set_project.php?project_id=16&ref=http://bugs.centos.org/bug_report_page.php?category=yum +distroverpkg=centos-release + +# This is the default, if you make this bigger yum won't see if the metadata +# is newer on the remote and so you'll "gain" the bandwidth of not having to +# download the new metadata and "pay" for it by yum not having correct +# information. +# It is esp. important, to have correct metadata, for distributions like +# Fedora which don't keep old packages around. If you don't like this checking +# interupting your command line usage, it's much better to have something +# manually check the metadata once an hour (yum-updatesd will do this). +# metadata_expire=90m + +# PUT YOUR REPOS HERE OR IN separate files named file.repo +# in /etc/yum.repos.d +EOF diff --git a/cobbler/snippets/kickstart_yum_repo_config b/cobbler/snippets/kickstart_yum_repo_config new file mode 100644 index 0000000..9aae52e --- /dev/null +++ b/cobbler/snippets/kickstart_yum_repo_config @@ -0,0 +1,11 @@ +# Repository Config +#set $repo_data = $getVar("repo_data",[]) +#for $repo in $repo_data +#if $repo.mirror_locally +repo --name=${repo.name} --baseurl=http://$http_server/cobbler/repo_mirror/${repo.name}/ +#else +repo --name=${repo.name} --baseurl=${repo.mirror} +#end if +#end for + + diff --git a/cobbler/snippets/late_apt_repo_config b/cobbler/snippets/late_apt_repo_config deleted file mode 100644 index 8e79bd3..0000000 --- a/cobbler/snippets/late_apt_repo_config +++ /dev/null @@ -1,24 +0,0 @@ -# start late_apt_repo_config -cat<<EOF>/etc/apt/sources.list -deb http://$http_server/cblr/links/$distro_name $os_version main -#set $repo_data = $getVar("repo_data",[]) -#for $repo in $repo_data - #for $dist in $repo.apt_dists - #set $comps = " ".join($repo.apt_components) - #if $repo.comment != "" -# ${repo.comment} - #end if - #if $repo.arch == "x86_64" - #set $rarch = "[arch=amd64]" - #else - #set $rarch = "[arch=%s]" % $repo.arch - #end if - #if $repo.mirror_locally -deb ${rarch} http://$http_server/cblr/repo_mirror/${repo.name} $dist $comps - #else -deb ${rarch} ${repo.mirror} $dist $comps - #end if - #end for -#end for -EOF -# end late_apt_repo_config diff --git a/cobbler/snippets/main_partition_select b/cobbler/snippets/main_partition_select deleted file mode 100644 index 9d996e6..0000000 --- a/cobbler/snippets/main_partition_select +++ /dev/null @@ -1,3 +0,0 @@ -# partition selection -%include /tmp/partinfo - diff --git a/cobbler/snippets/network_config_esx b/cobbler/snippets/network_config_esx deleted file mode 100644 index e378569..0000000 --- a/cobbler/snippets/network_config_esx +++ /dev/null @@ -1,47 +0,0 @@ -#import re - -#if $getVar("system_name","") != "" - #set ikeys = $interfaces.keys() - #set $vlanpattern = $re.compile("[a-zA-Z0-9]+[\.:][0-9]+") - #for $iname in $ikeys - #set $idata = $interfaces[$iname] - #set $mac = $idata["mac_address"] - #set $static = $idata["static"] - #set $ip = $idata["ip_address"] - #set $netmask = $idata["netmask"] - #set $type = $idata["interface_type"] - #if $vlanpattern.match($iname) or $type in ("master","bond","bridge") - ## If this is a VLAN interface, skip it, anaconda doesn't know - ## about VLANs. - #set $is_vlan = "true" - #else - #set $is_vlan = "false" - #end if - #if $mac != "" or $ip != "" and $is_vlan == "false" - #if $static == True: - #set $network_str = "--bootproto=static" - #if $ip != "": - #set $network_str = $network_str + " --ip=" + $ip - #if $netmask != "": - #set $network_str = $network_str + " --netmask=" + $netmask - #end if - #if $gateway != "": - #set $network_str = $network_str + " --gateway=" + $gateway - #end if - #if $name_servers and $name_servers[0] != "": - ## Anaconda only allows one nameserver - #set $network_str = $network_str + " --nameserver=" + $name_servers[0] - #end if - #end if - #else - #set $network_str = "--bootproto=dhcp" - #end if - #if $hostname != "" - #set $network_str = $network_str + " --hostname=" + $hostname - #end if - #else - #set $network_str = "--bootproto=dhcp" - #end if -network $network_str --device=$mac - #end for -#end if diff --git a/cobbler/snippets/network_config_esxi b/cobbler/snippets/network_config_esxi deleted file mode 100644 index ad29080..0000000 --- a/cobbler/snippets/network_config_esxi +++ /dev/null @@ -1,56 +0,0 @@ -#import re - -#if $getVar("system_name","") != "" - #set ikeys = $interfaces.keys() - #set $vlanpattern = $re.compile("[a-zA-Z0-9]+[\.:][0-9]+") - #for $iname in $ikeys - #set $idata = $interfaces[$iname] - #set $mac = $idata["mac_address"] - #set $static = $idata["static"] - #set $ip = $idata["ip_address"] - #set $netmask = $idata["netmask"] - #set $type = $idata["interface_type"] - #set $vlanid = "" - #if $vlanpattern.match($iname) or $type in ("master","bond","bridge") - ## If this is a VLAN interface, skip it, anaconda doesn't know - ## about VLANs. - #set $is_vlan = "true" - #set $vlanid = " --vlanid=" + $iname.split('.')[1] - #set $iname = $iname.split('.')[0] - #else - #set $is_vlan = "false" - #end if - #if $mac != "" or $ip != "" and $is_vlan == "false" - #if $static == True: - #set $network_str = "--bootproto=static" - #if $ip != "": - #set $network_str = $network_str + " --ip=" + $ip - #if $netmask != "": - #set $network_str = $network_str + " --netmask=" + $netmask - #end if - #if $gateway != "": - #set $network_str = $network_str + " --gateway=" + $gateway - #end if - #if $name_servers and $name_servers[0] != "": - #set $network_str = $network_str + " --nameserver=" + $name_servers[0] - #if len($name_servers) > 1 and $name_servers[1] != "": - #set $network_str += "," + $name_servers[1] - #end if - #end if - #end if - #else - #set $network_str = "--bootproto=dhcp" - #end if - #if $hostname != "" - #set $network_str = $network_str + " --hostname=" + $hostname - #end if - #else - #set $network_str = "--bootproto=dhcp" - - #end if - #if $vlanid != "" - #set $network_str = $network_str + $vlanid - #end if -network $network_str --device=$iname - #end for -#end if diff --git a/cobbler/snippets/ntp b/cobbler/snippets/ntp deleted file mode 100644 index a572d8f..0000000 --- a/cobbler/snippets/ntp +++ /dev/null @@ -1,14 +0,0 @@ -chkconfig ntpd on - -cat << EOF > /etc/ntp.conf -$SNIPPET('ntp.conf') -EOF - -#if $getVar('ntp_server', '') != "" -echo "old date is: \`date\`" 2>&1 > /tmp/ntp.log -echo "path: \$PATH" 2>&1 >> /tmp/ntp.log -/sbin/service ntpd stop 2>&1 >> /tmp/ntp.log -/usr/sbin/ntpdate $ntp_server 2>&1 >> /tmp/ntp.log -/sbin/service ntpd start 2>&1 >> /tmp/ntp.log -echo "new date is: \`date\`" 2>&1 >> /tmp/ntp.log -#end if diff --git a/cobbler/snippets/ntp.conf b/cobbler/snippets/ntp.conf index acf5ba3..d27eb6e 100644 --- a/cobbler/snippets/ntp.conf +++ b/cobbler/snippets/ntp.conf @@ -1,12 +1,6 @@ # For more information about this file, see the man pages # ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5). -# Include the option tinker panic 0 at the top of your ntp.conf file. -# By default, the NTP daemon sometimes panics and exits if the underlying clock -# appears to be behaving erratically. This option causes the daemon to keep -# running instead of panicking. -tinker panic 0 - driftfile /var/lib/ntp/drift # Permit time synchronization with our time source, but do not @@ -42,6 +36,7 @@ server $ntp_server # Undisciplined Local Clock. This is a fake driver intended for backup # and when no outside source of synchronized time is available. server 127.127.1.0 # local clock +fudge 127.127.1.0 stratum 10 # Enable public key cryptography. # crypto @@ -64,3 +59,5 @@ keys /etc/ntp/keys # Enable writing of statistics records. # statistics clockstats cryptostats loopstats peerstats +# make ntpdate using the server in conf to update the system time. +NTPDATE_USE_NTP_CONF=yes diff --git a/cobbler/snippets/partition_disks b/cobbler/snippets/partition_disks index 0f51eaa..e2ea9aa 100644 --- a/cobbler/snippets/partition_disks +++ b/cobbler/snippets/partition_disks @@ -1,5 +1,5 @@ -#set hostname=$getVar('hostname',None) -#set partition = $getVar('partition', None) +#set hostname=$getVar('$hostname',None) +#set partition = $getVar('$partition', None) #if $hostname == None #set $vgname = "VolGroup00" @@ -8,56 +8,22 @@ #end if set \$(list-harddrives) -let disk_nums=\$#/2 -let disk_offset=0 -let found_disk_offset=0 -while [ \$disk_offset -lt \$disk_nums ]; -do -#if $getVar('partitions_only','') != "" -let found_disk=0 - #for $partition_only in $partitions_only.split(',') -if [[ "\$1" =~ "$partition_only" ]]; then - disks[found_disk_offset]=\$1 - let found_disk=1 -fi - #end for -if [ \$found_disk -gt 0 ]; then - let found_disk_offset=\$found_disk_offset+1 -fi -#else - disks[found_disk_offset]=\$1 - let found_disk_offset=\$found_disk_offset+1 -#end if -let disk_offset=\$disk_offset+1 -shift 2 -done -let disk_nums=\$found_disk_offset +let numd=\$#/2 +d1=\$1 +d2=\$3 echo "clearpart --all --initlabel" > /tmp/part-include +echo "part /boot --fstype ext3 --size=100 --ondisk=\$d1 --asprimary" >> /tmp/part-include +echo "part swap --recommended --ondisk=\$d1" >> /tmp/part-include +echo "part pv.01 --size=1 --grow --ondisk=\$d1" >> /tmp/part-include +# if [ "$numd" == "2" ] +# echo "part pv.02 --size=1 --glow --ondisk=\$d2" >> /tmp/part-include +# echo "volgroup $vgname pv.01 pv.02" >> /tmp/part-include +# else + echo "volgroup $vgname pv.01" >> /tmp/part-include +# fi -#if $getVar('keep_old_partitions', '0') != "0" - #if $getVar('partitions_only','') != "" -echo "ignoredisk --only-use=$partitions_only" >> /tmp/part-include - #end if -#end if - -echo "part /boot --fstype ext3 --size=100 --ondisk=\${disks[0]} --asprimary" >> /tmp/part-include -echo "part swap --recommended --maxsize=128000 --ondisk=\${disks[0]}" >> /tmp/part-include - -vggroup='' -let disk_offset=0 -while [ \$disk_offset -lt \$disk_nums ]; -do -let pv_id=\$disk_offset+1 -partname="pv.0\$pv_id" -echo "part \$partname --size=1 --grow --ondisk=\${disks[\$disk_offset]}" >> /tmp/part-include -vggroup="\$vggroup \$partname" -let disk_offset=\$disk_offset+1; -done - -echo "volgroup $vgname \$vggroup" >> /tmp/part-include - -echo "logvol / --fstype ext3 --vgname=$vgname --size=1 --grow --name=rootvol" >> /tmp/part-include +echo "logvol / --fstype ext3 --vgname=$vgname --size=1 --grow --percent=30 --name=rootvol" >> /tmp/part-include #if $partition != None #set vol_sizes = [part.strip() for part in $partition.split(';') if part.strip()] diff --git a/cobbler/snippets/post_install_network_config b/cobbler/snippets/post_install_network_config index 6105eff..21c7202 100644 --- a/cobbler/snippets/post_install_network_config +++ b/cobbler/snippets/post_install_network_config @@ -82,11 +82,6 @@ mv /etc/sysconfig/network.cobbler /etc/sysconfig/network # (e.g.: if we're connecting to Puppet before a reboot). /bin/hostname $hostname #end if - -cat << EOL > /etc/hosts -$SNIPPET('hosts') -EOL - #if $enableipv6 == True grep -v NETWORKING_IPV6 /etc/sysconfig/network > /etc/sysconfig/network.cobbler echo "NETWORKING_IPV6=yes" >> /etc/sysconfig/network.cobbler @@ -212,7 +207,7 @@ echo "TYPE=Ethernet" >> $devfile # the kernel gives an interface a different name # following a reboot/hardware changes. #end if -echo "BOOTPROTO=static" >> $devfile +echo "BOOTPROTO=none" >> $devfile #if $ip != "" and $iface_type not in ("slave","bond_slave","bridge_slave","bonded_bridge_slave") ## Only configure static networking if an IP-address is configured ## and if the interface isn't slaved to another interface (bridging or bonding) diff --git a/cobbler/snippets/pre_partition_select b/cobbler/snippets/pre_partition_select deleted file mode 100644 index 1d1e8f4..0000000 --- a/cobbler/snippets/pre_partition_select +++ /dev/null @@ -1,33 +0,0 @@ -# partition details calculation - -# Determine how many drives we have -set \$(list-harddrives) -let numd=\$#/2 -d1=\$1 -d2=\$3 - -# Determine architecture-specific partitioning needs -EFI_PART="" -PPC_PREP_PART="" -BOOT_PART="" - -case \$(uname -m) in - ia64) - EFI_PART="part /boot/efi --fstype vfat --size 200 --recommended" - ;; - ppc*) - PPC_PREP_PART="part None --fstype 'PPC PReP Boot' --size 8" - BOOT_PART="part /boot --fstype ext3 --size 200 --recommended" - ;; - *) - BOOT_PART="part /boot --fstype ext3 --size 200 --recommended" - ;; -esac - -cat << EOF > /tmp/partinfo -\$EFI_PART -\$PPC_PREP_PART -\$BOOT_PART -part / --fstype ext3 --size=1024 --grow --ondisk=\$d1 --asprimary -part swap --recommended --ondisk=\$d1 --asprimary -EOF diff --git a/cobbler/snippets/preseed_apt_repo_config b/cobbler/snippets/preseed_apt_repo_config index 2d3487c..28c0070 100644 --- a/cobbler/snippets/preseed_apt_repo_config +++ b/cobbler/snippets/preseed_apt_repo_config @@ -1,3 +1,6 @@ +# Uncomment this if you don't want to use a network mirror +d-i apt-setup/use_mirror boolean false + # Additional repositories, local[0-9] available #set $cur=0 #set $repo_data = $getVar("repo_data",[]) @@ -6,7 +9,7 @@ #set $comps = " ".join($repo.apt_components) d-i apt-setup/local${cur}/repository string \ #if $repo.mirror_locally - http://$http_server/cblr/repo_mirror/${repo.name} $dist $comps + http://$http_server/cobbler/repo_mirror/${repo.name} $dist $comps #else ${repo.mirror} $dist $comps #end if diff --git a/cobbler/snippets/preseed_chef b/cobbler/snippets/preseed_chef new file mode 100644 index 0000000..a62b5cd --- /dev/null +++ b/cobbler/snippets/preseed_chef @@ -0,0 +1,10 @@ +mkdir -p /target/etc/chef; \ +## Generate validation.pem +$SNIPPET('preseed_chef-validator.pem') echo "processed preseed_chef-validator.pem" >> /tmp/preseed.log; \ +## Generate client.rb +$SNIPPET('preseed_client.rb') echo "processed preseed_client.rb" >> /tmp/preseed.log; \ +## Generate chef rsyslog conf +$SNIPPET('preseed_chef_rsyslog.conf') echo "processed preseed_chef_rsyslog.conf" >> /tmp/preseed.log; \ +$SNIPPET('preseed_chef_firstrun.sh') echo "processed preseed_chef_firstrun.sh" >> /tmp/preseed.log; \ +$SNIPPET('preseed_chef_rerun.sh') echo "processed preseed_chef_rerun.sh" >> /tmp/preseed.log; \ +$SNIPPET('preseed_chef_init') echo "processed preseed_chef_init" >> /tmp/preseed.log; \ diff --git a/cobbler/snippets/preseed_chef-validator.pem b/cobbler/snippets/preseed_chef-validator.pem new file mode 100644 index 0000000..e3616ae --- /dev/null +++ b/cobbler/snippets/preseed_chef-validator.pem @@ -0,0 +1,15 @@ +#if $getVar('chef_validation_file', '') == "" + #set chef_validation_file = '/etc/chef-server/chef-validator.pem' +#end if +#set $firstline = True +#set $f = $open($chef_validation_file) +#for $line in $f + #set $line = $line.rstrip('\n') + #if $firstline +echo "$line" > /target/etc/chef/validation.pem; \ + #else +echo "$line" >> /target/etc/chef/validation.pem; \ + #end if + #set $firstline = False +#end for +#silent $f.close() diff --git a/cobbler/snippets/preseed_chef_firstrun.sh b/cobbler/snippets/preseed_chef_firstrun.sh new file mode 100644 index 0000000..b6b91dc --- /dev/null +++ b/cobbler/snippets/preseed_chef_firstrun.sh @@ -0,0 +1,20 @@ +echo "#!/bin/bash" > /target/etc/chef/firstrun.sh; \ +echo "touch /tmp/chef.log" >> /target/etc/chef/firstrun.sh; \ +echo "while true; do" >> /target/etc/chef/firstrun.sh; \ +echo " echo \"firstrun.sh chef-client on \`date\`\" &>> /tmp/chef.log" >> /target/etc/chef/firstrun.sh; \ +echo " clients=\\$(pgrep chef-client)" >> /target/etc/chef/firstrun.sh; \ +echo " if [ \"\\$?\" == \"0\" ]; then" >> /target/etc/chef/firstrun.sh; \ +echo " echo \"there are chef-clients '\\$clients' running\" &>> /tmp/chef.log" >> /target/etc/chef/firstrun.sh; \ +echo " sleep 1m" >> /target/etc/chef/firstrun.sh; \ +echo " else" >> /target/etc/chef/firstrun.sh; \ +echo " chef-client -L /var/log/chef-client.log &>> /tmp/chef.log" >> /target/etc/chef/firstrun.sh; \ +echo " if [ \"\\$?\" != \"0\" ]; then" >> /target/etc/chef/firstrun.sh; \ +echo " echo \"chef-client run failed\" &>> /tmp/chef.log" >> /target/etc/chef/firstrun.sh; \ +echo " sleep 1m" >> /target/etc/chef/firstrun.sh; \ +echo " else" >> /target/etc/chef/firstrun.sh; \ +echo " echo \"chef-client run success\" &>> /tmp/chef.log" >> /target/etc/chef/firstrun.sh; \ +echo " break" >> /target/etc/chef/firstrun.sh; \ +echo " fi" >> /target/etc/chef/firstrun.sh; \ +echo " fi" >> /target/etc/chef/firstrun.sh; \ +echo "done" >> /target/etc/chef/firstrun.sh; \ +chmod +x /target/etc/chef/firstrun.sh; \ diff --git a/cobbler/snippets/preseed_chef_init b/cobbler/snippets/preseed_chef_init new file mode 100644 index 0000000..2828ccc --- /dev/null +++ b/cobbler/snippets/preseed_chef_init @@ -0,0 +1,13 @@ +## A self-destruct service to boot chef client and register cron job +echo "#!/bin/bash" > /target/etc/init.d/chef; \ +echo "rm -rf /var/lib/rsyslog/firstboot_log" >> /target/etc/init.d/chef; \ +echo "service rsyslog restart" >> /target/etc/init.d/chef; \ +echo "/etc/chef/firstrun.sh" >> /target/etc/init.d/chef; \ +echo "crontab -l > /tmp/mycron" >> /target/etc/init.d/chef; \ +echo "echo \"*/30 * * * * /etc/chef/rerun.sh\" >> /tmp/mycron" >> /target/etc/init.d/chef; \ +echo "crontab /tmp/mycron" >> /target/etc/init.d/chef; \ +echo "rm /tmp/mycron" >> /target/etc/init.d/chef; \ +echo "update-rc.d -f chef remove" >> /target/etc/init.d/chef; \ +echo "mv /etc/init.d/chef /tmp/chef" >> /target/etc/init.d/chef; \ +chmod +x /target/etc/init.d/chef; \ +chroot /target update-rc.d chef defaults 99 20; \ diff --git a/cobbler/snippets/preseed_chef_rerun.sh b/cobbler/snippets/preseed_chef_rerun.sh new file mode 100644 index 0000000..9d198a3 --- /dev/null +++ b/cobbler/snippets/preseed_chef_rerun.sh @@ -0,0 +1,14 @@ +echo "#!/bin/bash" > /target/etc/chef/rerun.sh; \ +echo "echo \"rerun chef-client on \`date\`\" &>> /tmp/chef.log" >> /target/etc/chef/rerun.sh; \ +echo "clients=\\$(pgrep chef-client)" >> /target/etc/chef/rerun.sh; \ +echo "if [ \"\\$?\" == \"0\" ]; then" >> /target/etc/chef/rerun.sh; \ +echo " echo \"there are chef-clients '\\$clients' running\" &>> /tmp/chef.log" >> /target/etc/chef/rerun.sh; \ +echo " exit 1" >> /target/etc/chef/rerun.sh; \ +echo "fi" >> /target/etc/chef/rerun.sh; \ +echo "chef-client &>> /tmp/chef.log" >> /target/etc/chef/rerun.sh; \ +echo "if [ \"\\$?\" != \"0\" ]; then" >> /target/etc/chef/rerun.sh; \ +echo " echo \"chef-client run failed\" &>> /tmp/chef.log" >> /target/etc/chef/rerun.sh; \ +echo "else" >> /target/etc/chef/rerun.sh; \ +echo " echo \"chef-client run success\" &>> /tmp/chef.log" >> /target/etc/chef/rerun.sh; \ +echo "fi" >> /target/etc/chef/rerun.sh; \ +chmod +x /target/etc/chef/rerun.sh; \ diff --git a/cobbler/snippets/preseed_chef_rsyslog.conf b/cobbler/snippets/preseed_chef_rsyslog.conf new file mode 100644 index 0000000..f26613b --- /dev/null +++ b/cobbler/snippets/preseed_chef_rsyslog.conf @@ -0,0 +1,10 @@ +echo "\\$ModLoad imfile" > /target/etc/rsyslog.d/chef.conf; \ +echo "\\$InputFileName /var/log/chef-client.log" >> /target/etc/rsyslog.d/chef.conf; \ +echo "\\$InputFileReadMode 0" >> /target/etc/rsyslog.d/chef.conf; \ +echo "\\$InputFileTag" >> /target/etc/rsyslog.d/chef.conf; \ +echo "\\$InputFileStateFile firstboot_log" >> /target/etc/rsyslog.d/chef.conf; \ +echo "\\$InputFileSeverity notice" >> /target/etc/rsyslog.d/chef.conf; \ +echo "\\$InputFileFacility local3" >> /target/etc/rsyslog.d/chef.conf; \ +echo "\\$InputRunFileMonitor" >> /target/etc/rsyslog.d/chef.conf; \ +echo "\\$InputFilePollInterval 1" >> /target/etc/rsyslog.d/chef.conf; \ +echo "local3.info @$server:514" >> /target/etc/rsyslog.d/chef.conf; \ diff --git a/cobbler/snippets/preseed_client.rb b/cobbler/snippets/preseed_client.rb new file mode 100644 index 0000000..6afebec --- /dev/null +++ b/cobbler/snippets/preseed_client.rb @@ -0,0 +1,26 @@ +echo "log_level :info" > /target/etc/chef/client.rb; \ +echo "log_location '/dev/null'" >> /target/etc/chef/client.rb; \ +#if $getVar('chef_url', '') != "" +echo "chef_server_url '$chef_url'" >> /target/etc/chef/client.rb; \ +#end if +#if $getVar('proxy', '') != "" +echo "http_proxy '$proxy'" >> /target/etc/chef/client.rb; \ +echo "https_proxy '$proxy'" >> /target/etc/chef/client.rb; \ +echo "ENV['http_proxy'] = '$proxy'" >> /target/etc/chef/client.rb; \ +echo "ENV['https_proxy'] = '$proxy'" >> /target/etc/chef/client.rb; \ +echo "ENV['HTTP_PROXY'] = '$proxy'" >> /target/etc/chef/client.rb; \ +echo "ENV['HTTPS_PROXY'] = '$proxy'" >> /target/etc/chef/client.rb; \ +#end if +#if $getVar('ignore_proxy', '') != "" +echo "no_proxy '$ignore_proxy'" >> /target/etc/chef/client.rb; \ +echo "ENV['no_proxy'] = '$ignore_proxy'" >> /target/etc/chef/client.rb; \ +echo "ENV['NO_PROXY'] = '$ignore_proxy'" >> /target/etc/chef/client.rb; \ +#end if +#if $getVar('chef_node_name', '') != "" +echo "node_name '$chef_node_name'" >> /target/etc/chef/client.rb; \ +#end if +echo "validation_client_name 'chef-validator'" >> /target/etc/chef/client.rb; \ +echo "json_attribs nil" >> /target/etc/chef/client.rb; \ +echo "pid_file '/var/run/chef-client.pid'" >> /target/etc/chef/client.rb; \ +echo "# Using default node name (fqdn)" >> /target/etc/chef/client.rb; \ +echo "no_lazy_load true" >> /target/etc/chef/client.rb; \ diff --git a/cobbler/snippets/preseed_hosts b/cobbler/snippets/preseed_hosts new file mode 100644 index 0000000..ba99274 --- /dev/null +++ b/cobbler/snippets/preseed_hosts @@ -0,0 +1,10 @@ +echo "127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4" > /target/etc/hosts; \ +echo "::1 localhost localhost.localdomain localhost6 localhost6.localdomain6" >> /target/etc/hosts; \ +#for $iname, $idata in $interfaces.items() + #if $hostname and $idata["management"] and $idata["static"] and $idata.get("ip_address", "") != "" +echo "$idata["ip_address"] $hostname" >> /target/etc/hosts; \ + #end if +#end for +#import os +#set $server_name = $os.uname[1] +echo "$server $server_name" >> /target/etc/hosts; \ diff --git a/cobbler/snippets/preseed_limits.conf b/cobbler/snippets/preseed_limits.conf new file mode 100644 index 0000000..a54dcfe --- /dev/null +++ b/cobbler/snippets/preseed_limits.conf @@ -0,0 +1 @@ +echo "* - nofile 100000" > /target/etc/security/limits.conf; \ diff --git a/cobbler/snippets/preseed_network_config b/cobbler/snippets/preseed_network_config new file mode 100644 index 0000000..f02be37 --- /dev/null +++ b/cobbler/snippets/preseed_network_config @@ -0,0 +1,21 @@ +#if $getVar("system_name","") != "" +d-i netcfg/link_detection_timeout string 0 +d-i netcfg/dhcp_timeout string 0 +d-i netcfg/dhcpv6_timeout string 0 +d-i netcfg/enable boolean true +d-i netcfg/disable_autoconfig boolean true +d-i netcfg/dhcp_failed note +d-i netcfg/dhcp_options select Configure network manually +d-i hw-detect/load_firmware boolean true +d-i netcfg/confirm_static boolean true + #if $hostname != "" +d-i netcfg/get_hostname string $hostname +d-i netcfg/hostname string $hostname + #end if + #if $gateway != "" +d-i netcfg/get_gateway string $gateway + #end if + #if $len($name_servers) > 0 +d-i netcfg/get_nameservers string $name_servers[0] + #end if +#end if diff --git a/cobbler/snippets/preseed_ntp b/cobbler/snippets/preseed_ntp new file mode 100644 index 0000000..aa33430 --- /dev/null +++ b/cobbler/snippets/preseed_ntp @@ -0,0 +1,18 @@ +#if $getVar('ntp_server', '') != "" +echo "driftfile /var/lib/ntp/ntp.drift" > /target/etc/ntp.conf; \ +echo "#statsdir /var/log/ntpstats/" >> /target/etc/ntp.conf; \ +echo "statistics loopstats peerstats clockstats" >> /target/etc/ntp.conf; \ +echo "filegen loopstats file loopstats type day enable" >> /target/etc/ntp.conf; \ +echo "filegen peerstats file peerstats type day enable" >> /target/etc/ntp.conf; \ +echo "filegen clockstats file clockstats type day enable" >> /target/etc/ntp.conf; \ +echo "server $ntp_server" >> /target/etc/ntp.conf; \ +echo "restrict -4 default kod notrap nomodify nopeer noquery" >> /target/etc/ntp.conf; \ +echo "restrict -6 default kod notrap nomodify nopeer noquery" >> /target/etc/ntp.conf; \ +echo "restrict 127.0.0.1" >> /target/etc/ntp.conf; \ +echo "restrict ::1" >> /target/etc/ntp.conf; \ +echo "server 127.127.1.0 # local clock" >> /target/etc/ntp.conf; \ +chroot /target update-rc.d ntp defaults 58 74; \ +chroot /target service ntp stop 2>&1 >> /tmp/ntp.log; \ +chroot /target ntpdate $ntp_server 2>&1 >> /tmp/ntp.log; \ +chroot /target service ntp start 2>&1 >> /tmp/ntp.log; \ +#end if diff --git a/cobbler/snippets/preseed_partition_disks b/cobbler/snippets/preseed_partition_disks new file mode 100644 index 0000000..24f2de6 --- /dev/null +++ b/cobbler/snippets/preseed_partition_disks @@ -0,0 +1,32 @@ +#set hostname=$getVar('hostname',None) +#set partition = $getVar('partition', None) +#if $hostname == None +#set $vgname = "VolGroup00" +#else +#set $vgname = $hostname.split('.')[0] +#end if +#if $getVar("system_name","") != "" +d-i partman-auto/init_automatically_partition string custom +d-i partman-auto/automatically_partition string custom +d-i partman-auto/method string lvm +d-i partman-auto/purge_lvm_from_device boolean true +d-i partman-auto-lvm/new_vg_name string $vgname +d-i partman-auto-lvm/guided_size string max +d-i partman-lvm/device_remove_lvm boolean true +d-i partman-lvm/device_remove_lvm_span boolean true +d-i partman-lvm/confirm boolean true +d-i partman-lvm/confirm_nooverwrite boolean true +d-i partman-md/device_remove_md boolean true +d-i partman-md/confirm boolean true +d-i partman-partitioning/confirm_write_new_label boolean true +d-i partman/confirm boolean true +d-i partman/confirm_nooverwrite boolean true +d-i partman/default_filesystem string ext3 +d-i partman/mount_style select uuid +d-i partman/confirm_write_changes_to_disks_and_configure_lvm boolean true +d-i partman/choose_partition select Finish partitioning and write changes to disk +d-i partman-auto/choose_recipe select boot-root +d-i mdadm/boot_degraded boolean true +d-i partman-auto-lvm/no_boot boolean true +d-i partman-lvm/vgcreate string $vgname +#end if diff --git a/cobbler/snippets/preseed_post_anamon b/cobbler/snippets/preseed_post_anamon new file mode 100644 index 0000000..4a351f6 --- /dev/null +++ b/cobbler/snippets/preseed_post_anamon @@ -0,0 +1,13 @@ +#if $str($getVar('anamon_enabled','')) == "1" +wget -O /target/usr/local/sbin/anamon "http://$server:$http_port/cobbler/aux/anamon"; \ +## A self-destruct service to boot anamon +echo "#!/bin/bash" > /target/etc/init.d/anamon.init; \ +echo "cd /var/log/installer" >> /target/etc/init.d/anamon.init; \ +echo "gunzip initial-status.gz" >> /target/etc/init.d/anamon.init; \ +echo "/usr/local/sbin/anamon --watchfile \"/var/log/installer/syslog /var/log/installer/hardware-summary /var/log/installer/initial-status /var/log/installer/status /var/log/messages /var/log/dmesg\" --name $name --server $server --port $http_port --exit" >> /target/etc/init.d/anamon.init; \ +echo "update-rc.d -f anamon remove" >> /target/etc/init.d/anamon.init; \ +echo "mv /etc/init.d/anamon.init /tmp/anamon.init" >> /target/etc/init.d/anamon.init; \ +chmod 755 /target/etc/init.d/anamon.init /target/usr/local/sbin/anamon; \ +chroot /target update-rc.d anamon.init defaults 95 95; \ +#end if + diff --git a/cobbler/snippets/preseed_post_apt_repo_config b/cobbler/snippets/preseed_post_apt_repo_config new file mode 100644 index 0000000..3f8f002 --- /dev/null +++ b/cobbler/snippets/preseed_post_apt_repo_config @@ -0,0 +1,24 @@ +echo "deb http://archive.ubuntu.com/ubuntu/ raring main restricted universe multiverse" > /target/etc/apt/sources.list; \ +echo "deb http://archive.ubuntu.com/ubuntu/ raring-security main restricted universe multiverse" >> /target/etc/apt/sources.list; \ +echo "deb http://archive.ubuntu.com/ubuntu/ raring-updates main restricted universe multiverse" >> /target/etc/apt/sources.list; \ +echo "deb http://archive.ubuntu.com/ubuntu/ raring-proposed main restricted universe multiverse" >> /target/etc/apt/sources.list; \ +echo "deb http://archive.ubuntu.com/ubuntu/ raring-backports main restricted universe multiverse" >> /target/etc/apt/sources.list; \ +#set $repo_data = $getVar("repo_data",[]) +#for $repo in $repo_data + #for $dist in $repo.apt_dists + #set $comps = " ".join($repo.apt_components) + #if $repo.comment != "" +echo "# ${repo.comment}" >> /target/etc/apt/sources.list; \ + #end if + #if $repo.arch == "x86_64" + #set $rarch = "[arch=amd64]" + #else + #set $rarch = "[arch=%s]" % $repo.arch + #end if + #if $repo.mirror_locally +echo "deb ${rarch} http://$http_server/cblr/repo_mirror/${repo.name} $dist $comps" >> /target/etc/apt/sources.list; \ + #else +echo "deb ${rarch} ${repo.mirror} $dist $comps" >> /target/etc/apt/sources.list; \ + #end if + #end for +#end for diff --git a/cobbler/snippets/post_install_network_config_deb b/cobbler/snippets/preseed_post_install_network_config similarity index 66% rename from cobbler/snippets/post_install_network_config_deb rename to cobbler/snippets/preseed_post_install_network_config index 01548b6..fd7812f 100644 --- a/cobbler/snippets/post_install_network_config_deb +++ b/cobbler/snippets/preseed_post_install_network_config @@ -1,4 +1,9 @@ -# Start post_install_network_config generated code +## Start post_install_network_config generated code +#if $getVar('promisc_nics', '') != "" + #set promisc_interfaces = [promisc.strip() for promisc in $promisc_nics.split(',') if promisc.strip()] +#else + #set promisc_interfaces = [] +#end if #if $getVar("system_name","") != "" ## this is being provisioned by system records, not profile records ## so we can do the more complex stuff @@ -47,11 +52,9 @@ ## end looping through the interfaces to see which ones we need to configure. ## ============================================================================= ## Rewrite the interfaces file and make sure we preserve the loopback device -rm -f /etc/network/interfaces -touch /etc/network/interfaces -echo "auto lo" >> /etc/network/interfaces -echo "iface lo inet loopback" >> /etc/network/interfaces -echo "" >> /etc/network/interfaces +echo "auto lo" > /target/etc/network/interfaces; \ +echo " iface lo inet loopback" >> /target/etc/network/interfaces; \ +echo "" >> /target/etc/network/interfaces; \ ## ============================================================================= ## now create the config file for each interface #for $iname in $ikeys @@ -60,6 +63,7 @@ echo "" >> /etc/network/interfaces #set $mac = $idata.get("mac_address", "").upper() #set $mtu = $idata.get("mtu", "") #set $static = $idata.get("static", "") + #set $management = $idata.get("management", "") #set $ip = $idata.get("ip_address", "") #set $netmask = $idata.get("netmask", "") #set $if_gateway = $idata.get("if_gateway", "") @@ -73,9 +77,9 @@ echo "" >> /etc/network/interfaces #set $ipv6_mtu = $idata.get("ipv6_mtu", "") #set $ipv6_default_gateway = $idata.get("ipv6_default_gateway", "") #set $ipv6_static_routes = $idata.get("ipv6_static_routes", "") - #set $devfile = "/etc/sysconfig/network-scripts/cobbler/ifcfg-" + $iname - #set $routesfile = "/etc/sysconfig/network-scripts/cobbler/route-" + $iname - #set $ipv6_routesfile = "/etc/sysconfig/network-scripts/cobbler/route6-" + $iname + #set $devfile = "/target/etc/sysconfig/network-scripts/cobbler/ifcfg-" + $iname + #set $routesfile = "/target/etc/sysconfig/network-scripts/cobbler/route-" + $iname + #set $ipv6_routesfile = "/target/etc/sysconfig/network-scripts/cobbler/route6-" + $iname ## determine if this interface is for a VLAN #if $vlanpattern.match($iname) #set $is_vlan = "true" @@ -89,35 +93,31 @@ echo "" >> /etc/network/interfaces ## =================================================================== ## Things every interface get, no matter what ## =================================================================== -echo "auto $iname" >> /etc/network/interfaces - ## =================================================================== - ## Actions based on interface_type - ## =================================================================== - #if $iface_type in ("master","bond","bonded_bridge_slave") - #pass - #elif $iface_type in ("slave","bond_slave") and $iface_master != "" - #pass - #elif $iface_type == "bridge" - #set $slave_ports = " ".join($bridge_slaves.get($iname,[])) - #if $slave_ports != "" -echo " bridge_ports $slave_ports" >> /etc/network/interfaces - #end if - #for $bridge_opt in $bridge_opts - #if $bridge_opt.strip() != "" -echo " $bridge_opt" >> /etc/network/interfaces - #end if - #end for - #end if +echo "auto $iname" >> /target/etc/network/interfaces; \ ## =================================================================== ## Actions based on static configuration ## =================================================================== #if $static - #if $ip != "" and $iface_type not in ("slave","bond_slave","bridge_slave","bonded_bridge_slave") -echo "iface $iname inet static" >> /etc/network/interfaces -echo " hwaddress $mac" >> /etc/network/interfaces -echo " address $ip" >> /etc/network/interfaces - #if $netmask != "" -echo " netmask $netmask" >> /etc/network/interfaces + #if $iface_type not in ("slave","bond_slave","bridge_slave","bonded_bridge_slave") +echo "iface $iname inet static" >> /target/etc/network/interfaces; \ + #if $mac != "" +echo " hwaddress $mac" >> /target/etc/network/interfaces; \ + #end if + #if $iname in $promisc_interfaces +echo " up ifconfig $iname promisc up" >> /target/etc/network/interfaces; \ +echo " down ifconfig $iname promisc down" >> /target/etc/network/interfaces; \ + #else + #if $ip != "" +echo " address $ip" >> /target/etc/network/interfaces; \ + #end if + #if $if_gateway != "" +echo " gateway $if_gateway" >> /target/etc/network/interfaces; \ + #end if + #if $netmask == "" + ## Default to 255.255.255.0? + #set $netmask = "255.255.255.0" + #end if +echo " netmask $netmask" >> /target/etc/network/interfaces; \ #end if #if $iface_type in ("master","bond") #set $bondslaves = "" @@ -129,34 +129,20 @@ echo " netmask $netmask" >> /etc/network/interfaces #set $bondslaves += $bondiname + " " #end if #end for -echo " bond-slaves $bondslaves" >> /etc/network/interfaces - #for $bondopts in $bonding_opts.split(" ") - #set [$bondkey, $bondvalue] = $bondopts.split("=") -echo " bond-$bondkey $bondvalue" >> /etc/network/interfaces - #end for +echo " bond-slaves $bondslaves" >> /target/etc/network/interfaces; \ + #for $bondopts in $bonding_opts.split(" ") + #set [$bondkey, $bondvalue] = $bondopts.split("=") +echo " bond-$bondkey $bondvalue" >> /target/etc/network/interfaces; \ + #end for #end if #else -echo "iface $iname inet manual" >> /etc/network/interfaces +echo "iface $iname inet manual" >> /target/etc/network/interfaces; \ #end if #if $iface_type in ("slave","bond_slave") and $iface_master != "" -echo "bond-master $iface_master" >> /etc/network/interfaces - #end if - #if $enableipv6 == True and $ipv6_autoconfiguration == False - #if $ipv6_address != "" - #pass - #end if - #if $ipv6_secondaries != "" - #set ipv6_secondaries = ' '.join(ipv6_secondaries) - #end if - #if $ipv6_mtu != "" - #pass - #end if - #if $ipv6_default_gateway != "" - #pass - #end if +echo "bond-master $iface_master" >> /target/etc/network/interfaces; \ #end if #else -echo "iface $iname inet dhcp" >> /etc/network/interfaces +echo "iface $iname inet dhcp" >> /target/etc/network/interfaces; \ #end if ## =================================================================== ## VLAN configuration @@ -167,11 +153,8 @@ echo "iface $iname inet dhcp" >> /etc/network/interfaces ## =================================================================== ## Optional configuration stuff ## =================================================================== - #if $if_gateway != "" -echo " gateway $if_gateway" >> /etc/network/interfaces - #end if #if $mtu != "" -echo " mtu $mtu" >> /etc/network/interfaces +echo " mtu $mtu" >> /target/etc/network/interfaces; \ #end if ## =================================================================== ## Interface route configuration @@ -180,9 +163,9 @@ echo " mtu $mtu" >> /etc/network/interfaces #set routepattern = $re.compile("[0-9/.]+:[0-9.]+") #if $routepattern.match($route) #set [$network, $router] = $route.split(":") -echo " up ip route add $network via $router dev $iname || true" >> /etc/network/interfaces +echo " up ip route add $network via $router dev $iname || true" >> /target/etc/network/interfaces; \ #else -echo " # Warning: invalid route: $route" >> /etc/network/interfaces +echo " # Warning: invalid route: $route" >> /target/etc/network/interfaces; \ #end if #end for #if $enableipv6 == True @@ -190,12 +173,28 @@ echo " # Warning: invalid route: $route" >> /etc/network/interfaces #set routepattern = $re.compile("[0-9a-fA-F:/]+,[0-9a-fA-F:]+") #if $routepattern.match($route) #set [$network, $router] = $route.split(",") -echo " up ip -6 route add $network via $router dev $iname || true" >> /etc/network/interfaces +echo " up ip -6 route add $network via $router dev $iname || true" >> /target/etc/network/interfaces; \ #else -echo " # Warning: invalid route: $route" >> /etc/network/interfaces +echo " # Warning: invalid route: $route" >> /target/etc/network/interfaces; \ #end if #end for #end if + #if $management + #if $gateway != "" and $if_gateway == "" +echo " gateway $gateway" >> /target/etc/network/interfaces; \ + #end if + ## ============================================================================= + ## Configure name server search path in /target/etc/resolv.conf + #set $nameservers = ' '.join($name_servers) + #set $nameserver_search = ' '.join($name_servers_search) + #if $nameservers != "" +echo " dns-nameservers $nameservers" >> /target/etc/network/interfaces; \ + #end if + #if $nameserver_search != "" +echo " dns-search $nameserver_search" >> /target/etc/network/interfaces; \ + #end if + #end if +echo "" >> /target/etc/network/interfaces; \ ## =================================================================== ## Done with this interface ## =================================================================== @@ -204,28 +203,8 @@ echo " # Warning: invalid route: $route" >> /etc/network/interfaces ## Configure the system's primary hostname. This is also passed to anaconda, but ## anaconda doesn't seem to honour it in DHCP-setups. #if $hostname != "" -echo "$hostname" > /etc/hostname -/bin/hostname $hostname - #end if - ## ============================================================================= - ## Configure name server search path in /etc/resolv.conf - #set $num_ns = $len($name_servers) - #set $num_ns_search = $len($name_servers_search) - #if $num_ns_search > 0 -sed -i -e "/^search /d" /etc/resolv.conf -echo -n "search " >>/etc/resolv.conf - #for $nameserversearch in $name_servers_search -echo -n "$nameserversearch " >>/etc/resolv.conf - #end for -echo "" >>/etc/resolv.conf - #end if - ## ============================================================================= - ## Configure name servers in /etc/resolv.conf - #if $num_ns > 0 -sed -i -e "/^nameserver /d" /etc/resolv.conf - #for $nameserver in $name_servers -echo "nameserver $nameserver" >>/etc/resolv.conf - #end for +echo "$hostname" > /target/etc/hostname; \ #end if +$SNIPPET('preseed_hosts') echo "processed preseed_hosts" >> /tmp/preseed.log; \ #end if -# End post_install_network_config generated code +## End post_install_network_config generated code diff --git a/cobbler/snippets/preseed_pre_anamon b/cobbler/snippets/preseed_pre_anamon new file mode 100644 index 0000000..76d913c --- /dev/null +++ b/cobbler/snippets/preseed_pre_anamon @@ -0,0 +1,4 @@ +#if $str($getVar('anamon_enabled','')) == "1" +wget -O /tmp/anamon "http://$server:$http_port/cobbler/aux/anamon" ; \ +python /tmp/anamon --name "$name" --watchfiles "/var/log/syslog /var/log/partman /var/log/hareware_summary /var/log/status /tmp/preseed.log" --server "$server" --port "$http_port"; \ +#end if diff --git a/cobbler/snippets/preseed_pre_install_network_config b/cobbler/snippets/preseed_pre_install_network_config new file mode 100644 index 0000000..fa639c7 --- /dev/null +++ b/cobbler/snippets/preseed_pre_install_network_config @@ -0,0 +1,41 @@ +#if $getVar("system_name","") != "" +mac_exists() { \ + ip -o link | grep -i "$1" 2>/dev/null >/dev/null; \ + return $?; \ +}; \ +get_ifname() { \ + IFNAME=\$(ip -o link | grep -i "$1" | sed -e 's/^[0-9]*: //' -e 's/:.*//'); \ +}; \ + #set ikeys = $interfaces.keys() + #import re + #set $vlanpattern = $re.compile("[a-zA-Z0-9]+[\.:][0-9]+") + #set $routepattern = $re.compile("[0-9/.]+:[0-9.]+") + #for $iname in $ikeys + #set $idata = $interfaces[$iname] + #set $mac = $idata["mac_address"] + #set $static = $idata["static"] + #set $management = $idata["management"] + #set $ip = $idata["ip_address"] + #set $netmask = $idata["netmask"] + #set $iface_type = $idata["interface_type"] + #set $iface_master = $idata["interface_master"] + #set $static_routes = $idata["static_routes"] + #if not $management or $mac == "" + #continue + #end if +if mac_exists $mac; then \ + get_ifname $mac; \ + echo "d-i netcfg/choose_interface string \$IFNAME" >> /tmp/pre_install_network_config; \ + #if $static and $ip != "" + echo "d-i netcfg/get_ipaddress string $ip" >> /tmp/pre_install_network_config; \ + #if $netmask == "" + #set $netmask = "255.255.255.0" + #end if + echo "d-i netcfg/get_netmask string $netmask" >> /tmp/pre_install_network_config; \ + #else + #continue + #end if +fi; \ + #end for +#end if +debconf-set-selections /tmp/pre_install_network_config; \ diff --git a/cobbler/snippets/preseed_pre_partition_disks b/cobbler/snippets/preseed_pre_partition_disks new file mode 100644 index 0000000..2996d67 --- /dev/null +++ b/cobbler/snippets/preseed_pre_partition_disks @@ -0,0 +1,136 @@ +#set hostname=$getVar('hostname',None) +#set partition = $getVar('partition', None) +#if $hostname == None +#set $vgname = "VolGroup00" +#else +#set $vgname = $hostname.split('.')[0] +#end if +#if $getVar("system_name","") != "" +first_found_disk=""; \ +disks_str=""; \ +found_disks_str=""; \ +for disk in \$(list-devices disk); do \ + if [[ x"\$disk" == x"" ]]; then \ + continue; \ + fi; \ +#if $getVar('partitions_only','') != "" + let found_disk=0; \ + #for $partition_only in $partitions_only.split(',') + #if not $partition_only + #continue + #end if + if expr match "\$disk" "$partition_only"; then \ + let found_disk=1; \ + fi; \ + #end for +#else + let found_disk=1; \ +#end if + if [ \$found_disk -gt 0 ]; then \ + if [ -z \$found_disks_str ]; then \ + found_disks_str="\$disk"; \ + first_found_disk="\$disk"; \ + else \ + found_disks_str="\${found_disks_str} \$disk"; \ + fi; \ + fi; \ + if [ -z \$disks_str ]; then \ + disks_str="\$disk"; \ + else \ + disks_str="\${disks_str} \$disk"; \ + fi; \ +done; \ +logger "partition disks: \${found_disks_str}"; \ +#if $getVar('keep_old_partitions', '0') != "0" +remove_disks_str=\${found_disks_str}; \ +#else +remove_disks_str=\${disks_str}; \ +#end if +logger "remove disks \${remove_disks_str}"; \ +## vgremove -f $vgname; \ +## logger "vgremove $vgname"; \ +disk_partitions=\$(pvs --noheadings --rows | head -n1); \ +for disk_partition in \${disk_partitions}; do \ + if [[ x"\$disk_partition" == x"" ]]; then \ + continue; \ + fi; \ + vg=\$(pvs --noheadings --separator : \${disk_partition} | cut -d: -f2); \ + remove_vg=""; \ + for remove_disk in \${remove_disks_str}; do \ + if [[ x"\$remove_disk" == x"" ]]; then \ + continue; \ + fi; \ + if expr match "\${disk_partition}" "\${remove_disk}.*"; then \ + remove_vg="\$vg"; \ + logger "partition \${disk_partition} matches \${remove_disk}.*"; \ + logger "set remove_vg to \$vg"; \ + else \ + logger "partition \${disk_partition} does not match \${remove_disk}.*"; \ + fi; \ + done; \ + if [[ x"\$remove_vg" != x"" ]]; then \ + vgremove -f \$remove_vg; \ + logger "vgremove \${remove_vg} for \${disk_partition}"; \ + else \ + logger "\${disk_partition} is not in vgremove list"; \ + fi; \ +done; \ +for remove_disk in \${remove_disks_str}; do \ + if [[ x"\$remove_disk" == x"" ]]; then \ + continue; \ + fi; \ + pvremove -ff -y \${remove_disk}*; \ + logger "pvremove \${remove_disk}*"; \ +done; \ +remove_disks=\$(echo \${remove_disks_str} | sed -e 's/ /,/g'); \ +echo "d-i partman-auto/select_disks multiselect \${remove_disks}" >> /tmp/part-include; \ +echo "d-i partman-auto/disk string \${found_disks_str}" >> /tmp/part-include; \ +recipe="boot-root :: \ +100 100 100 ext3 \ +\\$primary{ } \\$bootable{ } method{ format } \ +format{ } use_filesystem{ } filesystem{ ext3 } \ +mountpoint{ /boot } device{ \$first_found_disk } \ +. \ +200% 200% 200% linux-swap \ +\\$primary{ } method{ swap } format{ } \ +device{ \$first_found_disk } \ +. \ +#if $partition != None + #set vol_sizes = [part.strip() for part in $partition.split(';') if part.strip()] + #for vol_and_size in vol_sizes + #set vol, vol_size = $vol_and_size.split(' ', 1) + #set vol = $vol.strip() + #set vol_size = $vol_size.strip() + #if $vol.startswith('/') + #set volname = $vol[1:] +${vol_size} ${vol_size} ${vol_size} ext3 \ +\\$lvmok{ } method{ format } format{ } \ +use_filesystem{ } filesystem{ ext3 } \ +in_vg{ $vgname } lv_name{ ${volname}vol } \ +mountpoint{ $vol } \ +. \ + #else + #continue + #end if + #end for +#end if +1 2 100% ext3 \ +\\$lvmok{ } method{ format } \ +format{ } use_filesystem{ } filesystem{ ext3 } \ +in_vg{ $vgname } lv_name{ rootvol } \ +mountpoint{ / } \ +. \ +"; \ +pv_offset=1; \ +for found_disk in \${found_disks_str}; do \ + recipe="\$recipe \ +1 1 -1 ext3 \ +\\$defaultignore{ } \\$primary{ } device{ \${found_disk} } \ +method{ lvm } vg_name{ $vgname } \ +. \ +"; \ +let pv_offset=\${pv_offset}+1; \ +done; \ +echo "d-i partman-auto/expert_recipe string \$recipe" >> /tmp/part-include; \ +debconf-set-selections /tmp/part-include; \ +#end if diff --git a/cobbler/snippets/preseed_rsyslog.conf b/cobbler/snippets/preseed_rsyslog.conf new file mode 100644 index 0000000..66b5972 --- /dev/null +++ b/cobbler/snippets/preseed_rsyslog.conf @@ -0,0 +1,24 @@ +echo "\\$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)" > /target/etc/rsyslog.conf; \ +echo "\\$ModLoad imklog # provides kernel logging support (previously done by rklogd)" >> /target/etc/rsyslog.conf; \ +echo "\\$ModLoad immark # provides --MARK-- message capability" >> /target/etc/rsyslog.conf; \ +echo "\\$WorkDirectory /var/spool/rsyslog" >> /target/etc/rsyslog.conf; \ +echo "\\$ActionQueueType LinkedList" >> /target/etc/rsyslog.conf; \ +echo "\\$ActionQueueFileName srvrfwd" >> /target/etc/rsyslog.conf; \ +echo "\\$ActionResumeRetryCount -1" >> /target/etc/rsyslog.conf; \ +echo "\\$ActionQueueSaveOnShutDown on" >> /target/etc/rsyslog.conf; \ +echo "*.* @@$server:514" >> /target/etc/rsyslog.conf; \ +echo "\\$ModLoad imudp" >> /target/etc/rsyslog.conf; \ +echo "\\$UDPServerRun 514" >> /target/etc/rsyslog.conf; \ +echo "\\$ModLoad imtcp" >> /target/etc/rsyslog.conf; \ +echo "\\$InputTCPServerRun 514" >> /target/etc/rsyslog.conf; \ +#set system_name = $getVar('system_name','') +echo "\\$LocalHostName $system_name" >> /target/etc/rsyslog.conf; \ +echo "\\$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat" >> /target/etc/rsyslog.conf; \ +echo "\\$IncludeConfig /etc/rsyslog.d/*.conf" >> /target/etc/rsyslog.conf; \ +echo "*.info;mail.none;authpriv.none;cron.none /var/log/messages" >> /target/etc/rsyslog.conf; \ +echo "mail.* -/var/log/maillog" >> /target/etc/rsyslog.conf; \ +echo "cron.* /var/log/cron" >> /target/etc/rsyslog.conf; \ +echo "*.emerg *" >> /target/etc/rsyslog.conf; \ +echo "uucp,news.crit /var/log/spooler" >> /target/etc/rsyslog.conf; \ +echo "local7.* /var/log/boot.log" >> /target/etc/rsyslog.conf; \ +chroot /target update-rc.d rsyslog defaults 12 88; \ diff --git a/cobbler/snippets/preseed_ssh b/cobbler/snippets/preseed_ssh new file mode 100644 index 0000000..3d10eaf --- /dev/null +++ b/cobbler/snippets/preseed_ssh @@ -0,0 +1,23 @@ +mkdir -p /target/root/.ssh; \ +chmod 700 -R /target/root/.ssh; \ +#if $getVar("push_ssh_keys", "") != "" + #set $ssh_keys = $push_ssh_keys.split(',') + #set $firstline = True + #for $ssh_key in $ssh_keys + #if not $ssh_key + #continue + #end if + #set $f = open($ssh_keys) + #for $line in $f + #set $line = $line.rstrip('\n') + #if $firstline +echo "$line" > /target/root/.ssh/authorized_keys; \ + #else +echo "$line" >> /target/root/.ssh/authorized_keys; \ + #end if + #set $firstline = False + #end for + #silent $f.close() + #end for +chmod 600 /target/root/.ssh/authorized_keys; \ +#end if diff --git a/cobbler/snippets/preseed_sysctl.conf b/cobbler/snippets/preseed_sysctl.conf new file mode 100644 index 0000000..e16fd68 --- /dev/null +++ b/cobbler/snippets/preseed_sysctl.conf @@ -0,0 +1,22 @@ +echo "net.ipv4.ip_forward = 0" > /target/etc/sysctl.conf; \ +echo "net.ipv4.conf.default.rp_filter = 1" >> /target/etc/sysctl.conf; \ +echo "net.ipv4.conf.default.accept_source_route = 1" >> /target/etc/sysctl.conf; \ +echo "kernel.sysrq = 0" >> /target/etc/sysctl.conf; \ +echo "kernel.core_uses_pid = 1" >> /target/etc/sysctl.conf; \ +echo "net.ipv4.tcp_syncookies = 1" >> /target/etc/sysctl.conf; \ +echo "kernel.msgmnb = 65536" >> /target/etc/sysctl.conf; \ +echo "kernel.msgmax = 65536" >> /target/etc/sysctl.conf; \ +echo "kernel.shmmax = 68719476736" >> /target/etc/sysctl.conf; \ +echo "kernel.shmall = 4294967296" >> /target/etc/sysctl.conf; \ +echo "net.core.rmem_max = 16777216" >> /target/etc/sysctl.conf; \ +echo "net.core.wmem_max = 16777216" >> /target/etc/sysctl.conf; \ +echo "net.core.netdev_max_backlog = 30000" >> /target/etc/sysctl.conf; \ +echo "net.ipv4.tcp_max_syn_backlog = 4096" >> /target/etc/sysctl.conf; \ +echo "net.ipv4.tcp_congestion_control=htcp" >> /target/etc/sysctl.conf; \ +echo "net.ipv4.tcp_mtu_probing=1" >> /target/etc/sysctl.conf; \ +echo "net.ipv4.ip_local_port_range = 15000 61000" >> /target/etc/sysctl.conf; \ +echo "net.ipv4.tcp_fin_timeout=30" >> /target/etc/sysctl.conf; \ +echo "net.ipv4.tcp_tw_recycle = 1" >> /target/etc/sysctl.conf; \ +echo "net.ipv4.tcp_tw_reuse = 1" >> /target/etc/sysctl.conf; \ +echo "net.core.somaxconn = 8192" >> /target/etc/sysctl.conf; \ +echo "net.ipv4.route.flush=1" >> /target/etc/sysctl.conf; \ diff --git a/cobbler/snippets/rsyslogconf b/cobbler/snippets/rsyslogconf index fcbe2e5..6de661d 100644 --- a/cobbler/snippets/rsyslogconf +++ b/cobbler/snippets/rsyslogconf @@ -23,8 +23,7 @@ # Provides TCP syslog reception \\$ModLoad imtcp \\$InputTCPServerRun 514 -#set system_name = $getVar('system_name','') -\\$LocalHostName $system_name + #### GLOBAL DIRECTIVES #### diff --git a/cobbler/snippets/ssh b/cobbler/snippets/ssh deleted file mode 100644 index 1eb5052..0000000 --- a/cobbler/snippets/ssh +++ /dev/null @@ -1,9 +0,0 @@ -mkdir -p /root/.ssh -chmod 700 -R /root/.ssh -touch /root/.ssh/authorized_keys -chmod 600 /root/.ssh/authorized_keys -#if $getVar("push_ssh_keys", "") != "" -cat << EOL >> /root/.ssh/authorized_keys -$SNIPPET('id_rsa.pub') -EOL -#end if