--spin can be passed multiple hosts, and it will provision each host in turn.

Note that if it fails to spin a host, it will stop. I think this is better
than continuing to the next, because there might be a reason to spin hosts
in some specific order (ie, update dns first and then use it).
This commit is contained in:
Joey Hess 2014-11-23 15:17:57 -04:00
parent 3c952a0de9
commit 0ea0f7f4de
5 changed files with 32 additions and 17 deletions

2
debian/changelog vendored
View File

@ -6,6 +6,8 @@ propellor (1.0.1) UNRELEASED; urgency=medium
* --spin target --via relay causes propellor to bounce through an
intermediate relay host, which handles any necessary uploads
when provisioning the target host.
* --spin can be passed multiple hosts, and it will provision each host
in turn.
* Hostname parameters not containing dots are looked up in the DNS to
find the full hostname.
* Added group-related properties. Thanks, Félix Sipma.

View File

@ -20,12 +20,18 @@ action as needed to satisfy the configured properties of the local host.
# OPTIONS
* --spin targethost [--via relayhost]
* --spin targethost [targethost ...] [--via relayhost]
Causes propellor to automatically install itself on the specified target
host, or if it's already installed there, push any updates. Propellor is
then run on the target host, to satisfy its configured properties.
A signed git commit is made by --spin, so that any changes you have made
get propigated to the target host.
Multiple target hosts can be specified; propellor will run on each of
them in sequence.
When run with --via, propellor sshes to the relay host and runs
`propellor --spin hostname` from there. This can be useful when
propellor is installing itself, since most of the data transfer

View File

@ -39,8 +39,11 @@ usageError ps = do
processCmdLine :: IO CmdLine
processCmdLine = go =<< getArgs
where
go ("--spin":h:[]) = Spin <$> hostname h <*> pure Nothing
go ("--spin":h:"--via":r:[]) = Spin <$> hostname h <*> pure (Just r)
go ("--spin":ps) = case reverse ps of
(r:"--via":hs) -> Spin
<$> mapM hostname (reverse hs)
<*> pure (Just r)
_ -> Spin <$> mapM hostname ps <*> pure Nothing
go ("--add-key":k:[]) = return $ AddKey k
go ("--set":f:c:[]) = withprivfield f c Set
go ("--dump":f:c:[]) = withprivfield f c Dump
@ -97,12 +100,14 @@ defaultMain hostlist = do
go _ (Update (Just h)) = forceConsole >> fetchFirst (update (Just h))
go True cmdline@(Spin _ _) = buildFirst cmdline $ go False cmdline
go True cmdline = updateFirst cmdline $ go False cmdline
go False (Spin hn r) = withhost hn $ spin hn r
go False (Spin hs r) = do
commitSpin
forM_ hs $ \hn -> withhost hn $ spin hn r
go False cmdline@(SimpleRun hn) = buildFirst cmdline $
go False (Run hn)
go False (Run hn) = ifM ((==) 0 <$> getRealUserID)
( onlyprocess $ withhost hn mainProperties
, go True (Spin hn Nothing)
, go True (Spin [hn] Nothing)
)
withhost :: HostName -> (Host -> IO ()) -> IO ()

View File

@ -1,4 +1,5 @@
module Propellor.Spin (
commitSpin,
spin,
update,
gitPushHelper
@ -23,18 +24,19 @@ import qualified Propellor.Shim as Shim
import Utility.FileMode
import Utility.SafeCommand
commitSpin :: IO ()
commitSpin = do
void $ actionMessage "Git commit" $
gitCommit [Param "--allow-empty", Param "-a", Param "-m", Param "propellor spin"]
-- Push to central origin repo first, if possible.
-- The remote propellor will pull from there, which avoids
-- us needing to send stuff directly to the remote host.
whenM hasOrigin $
void $ actionMessage "Push to central git repository" $
boolSystem "git" [Param "push"]
spin :: HostName -> Maybe HostName -> Host -> IO ()
spin target relay hst = do
unless relaying $ do
void $ actionMessage "Git commit" $
gitCommit [Param "--allow-empty", Param "-a", Param "-m", Param "propellor spin"]
-- Push to central origin repo first, if possible.
-- The remote propellor will pull from there, which avoids
-- us needing to send stuff directly to the remote host.
whenM hasOrigin $
void $ actionMessage "Push to central git repository" $
boolSystem "git" [Param "push"]
cacheparams <- if viarelay
then pure ["-A"]
else toCommand <$> sshCachingParams hn
@ -78,7 +80,7 @@ spin target relay hst = do
runcmd = "cd " ++ localdir ++ " && ./propellor " ++ cmd
cmd = if viarelay
then "--serialized " ++ shellEscape (show (Spin target (Just target)))
then "--serialized " ++ shellEscape (show (Spin [target] (Just target)))
else "--continue " ++ shellEscape (show (SimpleRun target))
-- Update the privdata, repo url, and git repo over the ssh

View File

@ -142,7 +142,7 @@ instance ActionResult Result where
data CmdLine
= Run HostName
| Spin HostName (Maybe HostName)
| Spin [HostName] (Maybe HostName)
| SimpleRun HostName
| Set PrivDataField Context
| Dump PrivDataField Context