From ccc82907124ccd2ad4951c2c4946ae20af007530 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 4 Apr 2014 01:12:09 -0400 Subject: update --- Propellor/Config/Joey.hs | 126 ++++++++++++++++++++++++++++++++++++++++++++ Propellor/Config/Simple.hs | 52 +++++++++++++++++++ TODO | 2 + config-joeyh.hs | 127 --------------------------------------------- config-simple.hs | 52 ------------------- config.hs | 2 +- debian/changelog | 8 +-- propellor.cabal | 6 +-- 8 files changed, 188 insertions(+), 187 deletions(-) create mode 100644 Propellor/Config/Joey.hs create mode 100644 Propellor/Config/Simple.hs delete mode 100644 config-joeyh.hs delete mode 100644 config-simple.hs diff --git a/Propellor/Config/Joey.hs b/Propellor/Config/Joey.hs new file mode 100644 index 00000000..530df9a3 --- /dev/null +++ b/Propellor/Config/Joey.hs @@ -0,0 +1,126 @@ +-- | This is the live config file used by propellor's author. + +import Propellor +import Propellor.CmdLine +import qualified Propellor.Property.File as File +import qualified Propellor.Property.Apt as Apt +import qualified Propellor.Property.Network as Network +import qualified Propellor.Property.Ssh as Ssh +import qualified Propellor.Property.Cron as Cron +import qualified Propellor.Property.Sudo as Sudo +import qualified Propellor.Property.User as User +import qualified Propellor.Property.Hostname as Hostname +--import qualified Propellor.Property.Reboot as Reboot +import qualified Propellor.Property.Tor as Tor +import qualified Propellor.Property.Docker as Docker +import qualified Propellor.Property.SiteSpecific.GitHome as GitHome +import qualified Propellor.Property.SiteSpecific.GitAnnexBuilder as GitAnnexBuilder +import qualified Propellor.Property.SiteSpecific.JoeySites as JoeySites +import Data.List +-- Only imported to make sure it continues to build. +import qualified ConfigSimple as Simple + +main :: IO () +main = defaultMain [host, Docker.containerProperties container] + +-- | This is where the system's HostName, either as returned by uname +-- or one specified on the command line, is converted into a list of +-- Properties for that system. +-- +-- Edit this to configure propellor! +host :: HostName -> Maybe [Property] +-- Clam is a tor bridge, and an olduse.net shellbox and other fun stuff. +host hostname@"clam.kitenet.net" = standardSystem Unstable $ props + & cleanCloudAtCost hostname + & Apt.unattendedUpgrades + & Network.ipv6to4 + & Apt.installed ["git-annex", "mtr"] + & Tor.isBridge + & JoeySites.oldUseNetshellBox + & Docker.configured + ! Docker.docked container hostname "amd64-git-annex-builder" + & Docker.garbageCollected +-- Orca is the main git-annex build box. +host hostname@"orca.kitenet.net" = standardSystem Unstable $ props + & Hostname.set hostname + & Apt.unattendedUpgrades + & Docker.configured + & Apt.buildDep ["git-annex"] + & Docker.docked container hostname "amd64-git-annex-builder" + & Docker.docked container hostname "i386-git-annex-builder" + & Docker.garbageCollected +-- My laptop +host _hostname@"darkstar.kitenet.net" = Just $ props + & Docker.configured + +-- add more hosts here... +--host "foo.example.com" = +host _ = Nothing + +-- | This is where Docker containers are set up. A container +-- can vary by hostname where it's used, or be the same everywhere. +container :: HostName -> Docker.ContainerName -> Maybe (Docker.Container) +container _host name + | name == "webserver" = Just $ Docker.containerFrom + (image $ System (Debian Unstable) "amd64") + [ Docker.publish "8080:80" + , Docker.volume "/var/www:/var/www" + , Docker.inside $ props + & serviceRunning "apache2" + `requires` Apt.installed ["apache2"] + ] + | "-git-annex-builder" `isSuffixOf` name = + let arch = takeWhile (/= '-') name + in Just $ Docker.containerFrom + (image $ System (Debian Unstable) arch) + [ Docker.inside $ props & GitAnnexBuilder.builder arch "15 * * * *" True ] + | otherwise = Nothing + +-- | Docker images I prefer to use. +image :: System -> Docker.Image +image (System (Debian Unstable) arch) = "joeyh/debian-unstable-" ++ arch +image _ = "debian-stable-official" -- does not currently exist! + +-- This is my standard system setup +standardSystem :: DebianSuite -> [Property] -> Maybe [Property] +standardSystem suite customprops = Just $ + standardprops : customprops ++ endprops + where + standardprops = propertyList "standard system" $ props + & Apt.stdSourcesList suite `onChange` Apt.upgrade + & Apt.installed ["etckeeper"] + & Apt.installed ["ssh"] + & GitHome.installedFor "root" + & User.hasSomePassword "root" + -- Harden the system, but only once root's authorized_keys + -- is safely in place. + & check (Ssh.hasAuthorizedKeys "root") + (Ssh.passwordAuthentication False) + & User.accountFor "joey" + & User.hasSomePassword "joey" + & Sudo.enabledFor "joey" + & GitHome.installedFor "joey" + & Apt.installed ["vim", "screen", "less"] + & Cron.runPropellor "30 * * * *" + -- I use postfix, or no MTA. + & Apt.removed ["exim4", "exim4-daemon-light", "exim4-config", "exim4-base"] + `onChange` Apt.autoRemove + -- May reboot, so comes last + -- Currently not enable due to #726375 + endprops = [] -- [Apt.installed ["systemd-sysv"] `onChange` Reboot.now] + +-- Clean up a system as installed by cloudatcost.com +cleanCloudAtCost :: HostName -> Property +cleanCloudAtCost hostname = propertyList "cloudatcost cleanup" + [ Hostname.set hostname + , Ssh.uniqueHostKeys + , "worked around grub/lvm boot bug #743126" ==> + "/etc/default/grub" `File.containsLine` "GRUB_DISABLE_LINUX_UUID=true" + `onChange` cmdProperty "update-grub" [] + `onChange` cmdProperty "update-initramfs" ["-u"] + , combineProperties "nuked cloudatcost cruft" + [ File.notPresent "/etc/rc.local" + , File.notPresent "/etc/init.d/S97-setup.sh" + , User.nuked "user" User.YesReallyDeleteHome + ] + ] diff --git a/Propellor/Config/Simple.hs b/Propellor/Config/Simple.hs new file mode 100644 index 00000000..840bad02 --- /dev/null +++ b/Propellor/Config/Simple.hs @@ -0,0 +1,52 @@ +-- | This is the main configuration file for Propellor, and is used to build +-- the propellor program. + +import Propellor +import Propellor.CmdLine +import qualified Propellor.Property.File as File +import qualified Propellor.Property.Apt as Apt +import qualified Propellor.Property.Network as Network +import qualified Propellor.Property.Ssh as Ssh +import qualified Propellor.Property.Cron as Cron +import qualified Propellor.Property.Sudo as Sudo +import qualified Propellor.Property.User as User +import qualified Propellor.Property.Hostname as Hostname +import qualified Propellor.Property.Reboot as Reboot +import qualified Propellor.Property.Docker as Docker + +main :: IO () +main = defaultMain [host, Docker.containerProperties container] + +-- | This is where the system's HostName, either as returned by uname +-- or one specified on the command line, is converted into a list of +-- Properties for that system. +-- +-- Edit this to configure propellor! +host :: HostName -> Maybe [Property] +host hostname@"mybox.example.com" = Just $ props + & Apt.stdSourcesList Unstable + `onChange` Apt.upgrade + & Apt.unattendedUpgrades + & Apt.installed ["etckeeper"] + & Apt.installed ["ssh"] + & User.hasSomePassword "root" + & Network.ipv6to4 + & File.dirExists "/var/www" + & Docker.docked container hostname "webserver" + & Docker.garbageCollected + & Cron.runPropellor "30 * * * *" +-- add more hosts here... +--host "foo.example.com" = +host _ = Nothing + +-- | This is where Docker containers are set up. A container +-- can vary by hostname where it's used, or be the same everywhere. +container :: HostName -> Docker.ContainerName -> Maybe (Docker.Container) +container _ "webserver" = Just $ Docker.containerFrom "joeyh/debian-unstable" + [ Docker.publish "80:80" + , Docker.volume "/var/www:/var/www" + , Docker.inside $ props + & serviceRunning "apache2" + `requires` Apt.installed ["apache2"] + ] +container _ _ = Nothing diff --git a/TODO b/TODO index a90875fd..3b816ad3 100644 --- a/TODO +++ b/TODO @@ -12,3 +12,5 @@ says they are unchanged even when they changed and triggered a reprovision. * Should properties be a tree rather than a list? +* Only make docker garbage collection run once a day or something + to avoid GC after a temp fail. diff --git a/config-joeyh.hs b/config-joeyh.hs deleted file mode 100644 index e4a9dcac..00000000 --- a/config-joeyh.hs +++ /dev/null @@ -1,127 +0,0 @@ --- | This is the live config file used by propellor's author. - -import Propellor -import Propellor.CmdLine -import qualified Propellor.Property.File as File -import qualified Propellor.Property.Apt as Apt -import qualified Propellor.Property.Network as Network -import qualified Propellor.Property.Ssh as Ssh -import qualified Propellor.Property.Cron as Cron -import qualified Propellor.Property.Sudo as Sudo -import qualified Propellor.Property.User as User -import qualified Propellor.Property.Hostname as Hostname ---import qualified Propellor.Property.Reboot as Reboot -import qualified Propellor.Property.Tor as Tor -import qualified Propellor.Property.Docker as Docker -import qualified Propellor.Property.SiteSpecific.GitHome as GitHome -import qualified Propellor.Property.SiteSpecific.GitAnnexBuilder as GitAnnexBuilder -import qualified Propellor.Property.SiteSpecific.JoeySites as JoeySites -import Data.List - -main :: IO () -main = defaultMain [host, Docker.containerProperties container] - --- | This is where the system's HostName, either as returned by uname --- or one specified on the command line, is converted into a list of --- Properties for that system. --- --- Edit this to configure propellor! -host :: HostName -> Maybe [Property] --- Clam is a tor bridge, and an olduse.net shellbox and other fun stuff. -host hostname@"clam.kitenet.net" = standardSystem Unstable $ props - & cleanCloudAtCost hostname - & Apt.unattendedUpgrades - & Network.ipv6to4 - & Apt.installed ["git-annex", "mtr"] - & Tor.isBridge - & JoeySites.oldUseNetshellBox - & Docker.configured - ! Docker.docked container hostname "amd64-git-annex-builder" - & Docker.garbageCollected --- Orca is the main git-annex build box. -host hostname@"orca.kitenet.net" = standardSystem Unstable $ props - & Hostname.set hostname - & Apt.unattendedUpgrades - & Docker.configured - & Apt.buildDep ["git-annex"] - & Docker.docked container hostname "amd64-git-annex-builder" - & Docker.docked container hostname "i386-git-annex-builder" - & Docker.garbageCollected --- My laptop -host _hostname@"darkstar.kitenet.net" = Just $ props - & Docker.configured - --- add more hosts here... ---host "foo.example.com" = -host _ = Nothing - --- | This is where Docker containers are set up. A container --- can vary by hostname where it's used, or be the same everywhere. -container :: HostName -> Docker.ContainerName -> Maybe (Docker.Container) -container _host name - | name == "webserver" = Just $ Docker.containerFrom - (image $ System (Debian Unstable) "amd64") - [ Docker.publish "8080:80" - , Docker.volume "/var/www:/var/www" - , Docker.inside $ props - & serviceRunning "apache2" - `requires` Apt.installed ["apache2"] - ] - | "-git-annex-builder" `isSuffixOf` name = - let arch = takeWhile (/= '-') name - in Just $ Docker.containerFrom - (image $ System (Debian Unstable) arch) - [ Docker.inside $ props & GitAnnexBuilder.builder arch "15 * * * *" True ] - | otherwise = Nothing - --- | Docker images I prefer to use. --- Edit as suites you, or delete this function and just put the image names --- above. -image :: System -> Docker.Image -image (System (Debian Unstable) "amd64") = "joeyh/debian-unstable" -image (System (Debian Unstable) "i386") = "joeyh/debian-unstable-i386" -image _ = "debian" - --- This is my standard system setup -standardSystem :: DebianSuite -> [Property] -> Maybe [Property] -standardSystem suite customprops = Just $ - standardprops : customprops ++ endprops - where - standardprops = propertyList "standard system" $ props - & Apt.stdSourcesList suite `onChange` Apt.upgrade - & Apt.installed ["etckeeper"] - & Apt.installed ["ssh"] - & GitHome.installedFor "root" - & User.hasSomePassword "root" - -- Harden the system, but only once root's authorized_keys - -- is safely in place. - & check (Ssh.hasAuthorizedKeys "root") - (Ssh.passwordAuthentication False) - & User.accountFor "joey" - & User.hasSomePassword "joey" - & Sudo.enabledFor "joey" - & GitHome.installedFor "joey" - & Apt.installed ["vim", "screen", "less"] - & Cron.runPropellor "30 * * * *" - -- I use postfix, or no MTA. - & Apt.removed ["exim4", "exim4-daemon-light", "exim4-config", "exim4-base"] - `onChange` Apt.autoRemove - -- May reboot, so comes last - -- Currently not enable due to #726375 - endprops = [] -- [Apt.installed ["systemd-sysv"] `onChange` Reboot.now] - --- Clean up a system as installed by cloudatcost.com -cleanCloudAtCost :: HostName -> Property -cleanCloudAtCost hostname = propertyList "cloudatcost cleanup" - [ Hostname.set hostname - , Ssh.uniqueHostKeys - , "worked around grub/lvm boot bug #743126" ==> - "/etc/default/grub" `File.containsLine` "GRUB_DISABLE_LINUX_UUID=true" - `onChange` cmdProperty "update-grub" [] - `onChange` cmdProperty "update-initramfs" ["-u"] - , combineProperties "nuked cloudatcost cruft" - [ File.notPresent "/etc/rc.local" - , File.notPresent "/etc/init.d/S97-setup.sh" - , User.nuked "user" User.YesReallyDeleteHome - ] - ] diff --git a/config-simple.hs b/config-simple.hs deleted file mode 100644 index 840bad02..00000000 --- a/config-simple.hs +++ /dev/null @@ -1,52 +0,0 @@ --- | This is the main configuration file for Propellor, and is used to build --- the propellor program. - -import Propellor -import Propellor.CmdLine -import qualified Propellor.Property.File as File -import qualified Propellor.Property.Apt as Apt -import qualified Propellor.Property.Network as Network -import qualified Propellor.Property.Ssh as Ssh -import qualified Propellor.Property.Cron as Cron -import qualified Propellor.Property.Sudo as Sudo -import qualified Propellor.Property.User as User -import qualified Propellor.Property.Hostname as Hostname -import qualified Propellor.Property.Reboot as Reboot -import qualified Propellor.Property.Docker as Docker - -main :: IO () -main = defaultMain [host, Docker.containerProperties container] - --- | This is where the system's HostName, either as returned by uname --- or one specified on the command line, is converted into a list of --- Properties for that system. --- --- Edit this to configure propellor! -host :: HostName -> Maybe [Property] -host hostname@"mybox.example.com" = Just $ props - & Apt.stdSourcesList Unstable - `onChange` Apt.upgrade - & Apt.unattendedUpgrades - & Apt.installed ["etckeeper"] - & Apt.installed ["ssh"] - & User.hasSomePassword "root" - & Network.ipv6to4 - & File.dirExists "/var/www" - & Docker.docked container hostname "webserver" - & Docker.garbageCollected - & Cron.runPropellor "30 * * * *" --- add more hosts here... ---host "foo.example.com" = -host _ = Nothing - --- | This is where Docker containers are set up. A container --- can vary by hostname where it's used, or be the same everywhere. -container :: HostName -> Docker.ContainerName -> Maybe (Docker.Container) -container _ "webserver" = Just $ Docker.containerFrom "joeyh/debian-unstable" - [ Docker.publish "80:80" - , Docker.volume "/var/www:/var/www" - , Docker.inside $ props - & serviceRunning "apache2" - `requires` Apt.installed ["apache2"] - ] -container _ _ = Nothing diff --git a/config.hs b/config.hs index 65a95f2c..3d5a087a 120000 --- a/config.hs +++ b/config.hs @@ -1 +1 @@ -config-joeyh.hs \ No newline at end of file +Propellor/Config/Joey.hs \ No newline at end of file diff --git a/debian/changelog b/debian/changelog index a126e8fb..f4eadd22 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,11 +1,11 @@ -propellor (0.2.2) UNRELEASED; urgency=medium +propellor (0.2.2) unstable; urgency=medium * Now supports provisioning docker containers with architecture/libraries - that do not match the outside host. + that do not match the host. * Fixed a bug that caused file modes to be set to 600 when propellor - modified the file. + modified the file (did not affect newly created files). - -- Joey Hess Fri, 04 Apr 2014 00:06:26 -0400 + -- Joey Hess Fri, 04 Apr 2014 01:07:32 -0400 propellor (0.2.1) unstable; urgency=medium diff --git a/propellor.cabal b/propellor.cabal index c85a3e77..5d601393 100644 --- a/propellor.cabal +++ b/propellor.cabal @@ -1,5 +1,5 @@ Name: propellor -Version: 0.2.1 +Version: 0.2.2 Cabal-Version: >= 1.6 License: GPL Maintainer: Joey Hess @@ -14,8 +14,6 @@ Extra-Source-Files: README.md TODO CHANGELOG - config-simple.hs - config-joeyh.hs Makefile debian/changelog debian/README.Debian @@ -64,6 +62,8 @@ Library Exposed-Modules: Propellor + Propellor.Config.Simple + Propellor.Config.Joey Propellor.Property Propellor.Property.Apt Propellor.Property.Cmd -- cgit v1.3-2-g0d8e