You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jclouds.apache.org by Ignasi Barrera <na...@apache.org> on 2016/02/03 00:44:37 UTC
Re: Problem bootstraping FreeBSD on EC2
Great investigation, and thanks for reporting back the results!
The bootstrap BSD looks like a nice recipe to have. I'd add a statement
class for it to the preconfigured Statements [1] so users can easily use
that when composing their scripts. And the ComputeService could also add
that automatically to BSD nodes when needed.
Also, being able to add a user to the sudores file would be a nice addition
to the SudoStatements [2].
Mind opening a JIRA to track this? And even better, are you up to
contributing the changes in a pull request? :)
Thanks!
I.
[1]
https://github.com/jclouds/jclouds/tree/master/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements
[2]
https://github.com/jclouds/jclouds/blob/master/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements/login/SudoStatements.java
El 3/2/2016 12:07 a. m., "Klemen Ferjančič" <im...@gmail.com> escribió:
> The problem is that FreeBSD /bin/sh really does not like DOS style line
> breaks so it interprets \r as part of the command name, therefore the
> weird "not found" messages. I ended up with replacing \r\n with \n in
> java on the fly, then uploading script to the server and executing it
> with a one liner:
>
> su - root -c "chmod +x /home/ec2-user/bootstrap_freebsd.sh &&
> /home/ec2-user/bootstrap_freebsd.sh"
>
> bootstrap_freebsd.sh content:
> #!/bin/sh
> pkg install -y sudo
> pkg install -y bash
> ln /usr/local/bin/bash /bin/bash
> echo "ec2-user ALL=(ALL) NOPASSWD:ALL" >> /usr/local/etc/sudoers
>
>
> You need to install sudo, bash, add ec2-user to sudoers and also symlink
> the bash path because jclouds uses /bin/bash hardcoded in the init files.
>
> After these 4 lines are executed you can proceed executing commands with
> init script and sudo as normal.
>
> Hopefully this helps someone in the future as crazy as I who wants to
> run FreeBSD. :)
>
> Best regards, Klemen
>
>
> On 29. 01. 2016 14:55, Ignasi Barrera wrote:
> > That one-liner thing is really weird! Glad to see you found a way to
> > bypass that.
> >
> > Another option would be to put your script in a file, upload it to the
> > node using the jclouds ssh client, and then run a script that simply
> > executes that script file. Could that work and be cleaner? Have a look
> > at the "Advanced usage" section of the compute guide [1] for an
> > example of how to upload a file to a node.
> >
> > I.
> >
> > [1] http://jclouds.apache.org/start/compute/
> >
> > On 28 January 2016 at 23:14, cen <im...@gmail.com> wrote:
> >> Found the solution. If I execute commands in a single line using &&,
> written
> >> as a java string they work as expected.
> >> But reading them from a file where I write them line by line it cause
> the
> >> problems mentioned previously:
> >>
> >> Files.toString(file, Charsets.UTF_8)
> >>
> >> If I write them in a single line in the file it works as expected too. I
> >> tried to print the commands when they are line by line
> >> and everything seems normal in console. Maybe it's the line breaks in
> >> combination with tcsh or something in that regard causing the problem.
> >>
> >> Plus another find: you can't actually su root && command, the proper
> way is
> >> su - root -c "commands && here". su root seems to break the flow.
> >>
> >>
> >> Ignasi Barrera je 28. 01. 2016 ob 11:12 napisal:
> >>>
> >>> I have no experience with BSD instances, but could it be a PATH issue?
> >>>
> >>> Can you try setting the PATH manually?
> >>>
> >>> On 28 January 2016 at 09:13, Klemen Ferjančič <im...@gmail.com>
> wrote:
> >>>>
> >>>> It seems I've hit a wall.
> >>>>
> >>>> 1. For some reason, even when disabling init script on template
> builder,
> >>>> it still tries to run it. So I decided to skip it for now.
> >>>>
> >>>>
> >>>>
> .wrapInInitScript(false).runScript(getBootInstructions(os)).runAsRoot(true);
> >>>>
> >>>> 2. Running as root and disabling sudo does not actually remove sudo.
> >>>> Taking a closer look at RunScriptOnNodeUsingSsh.java->execAsRoot, it
> >>>> seems that sudo is always run in front.
> >>>>
> >>>>
> >>>>
> opts.wrapInInitScript(false).runAsRoot(true).overrideAuthenticateSudo(false)
> >>>> .overrideLoginCredentials(getLoginForCommandExecution(os));
> >>>>
> >>>> Result:
> >>>> `sudo sh <<'RUN_SCRIPT_AS_ROOT_SSH' ...
> >>>>
> >>>> which means I can't run as root.
> >>>>
> >>>> 3. So I decided to run as regular user (not root and not sudo) and
> just
> >>>> switch to root manually. Works if I do it by hand:
> >>>> su root
> >>>> pkg install -y sudo
> >>>> pkg install -y bash
> >>>>
> >>>> Opts:
> >>>> .wrapInInitScript(false).runAsRoot(false)
> >>>> .overrideLoginCredentials(getLoginForCommandExecution(os))
> >>>>
> >>>> But for some reason, it seems that jclouds puts me in some weird
> >>>> restricted shell where I can't execute anything.
> >>>> su returns "Sorry" and trying to run a simple command like "whoami"
> >>>> results in: not found. It's clear to me that this is not the same
> >>>> environment as the one
> >>>> when I manually ssh into the machine so what is the difference?
> >>>>
> >>>>
> >>>> Best regards, Klemen
> >>>>
> >>>> On 27. 01. 2016 11:06, Ignasi Barrera wrote:
> >>>>>
> >>>>> No. You can use the one in the template builder to run the first one
> and
> >>>>> the run the rest by calling computeService.runScriptOnNode
> afterhaving
> >>>>> created the node.
> >>>>>
> >>>>> El 27/1/2016 11:03 a. m., "Klemen Ferjančič" <imbacen@gmail.com
> >>>>> <ma...@gmail.com>> escribió:
> >>>>>
> >>>>> If I add additional scripts on top of template builder are they
> >>>>> going to
> >>>>> be executed in order or is the solution more complex than this?
> >>>>>
> >>>>> Something like:
> >>>>>
> >>>>>
> >>>>>
> templateBuilder.wrapInInitScript(false).runScript(installBashAndSudo())
> >>>>> .wrapInitScript(true).runScript(everythingElse())
> >>>>>
> >>>>> On 27. 01. 2016 10:56, Ignasi Barrera wrote:
> >>>>> > Yes, the RunScriptOptions provide options to run the scripts
> as
> >>>>> root,
> >>>>> > and also to explicitly disable sudo.
> >>>>> >
> >>>>> > Currently the wrapper script requires bash, so you'll have to
> >>>>> install
> >>>>> > it first if you need to use it. You could split the runscript
> in
> >>>>> two
> >>>>> > operations: a first one with the wrapInitScript(false) to just
> >>>>> install
> >>>>> > bash, and a second one to run the desired script.
> >>>>> >
> >>>>> > That wrapper script, as said, contains several helpers to let
> >>>>> jclouds
> >>>>> > query the status of the script execution: see if it is still
> >>>>> running,
> >>>>> > allow to abort it, etc. If you are running scripts that take
> >>>>> time, I'd
> >>>>> > recommend you run them with the wrapper script.
> >>>>> >
> >>>>> > I.
> >>>>> >
> >>>>> > On 27 January 2016 at 10:48, Klemen Ferjančič <
> imbacen@gmail.com
> >>>>> <ma...@gmail.com>> wrote:
> >>>>> >> Good advice, I suspect I know what is going on.
> >>>>> >>
> >>>>> >> Home directory contains bootstrap and /tmp/init-bootstrap
> >>>>> exists.
> >>>>> >> However, if I run ./init-bootstrap it says "not found". I
> >>>>> checked the
> >>>>> >> init script and it seems that bash is expected to exist on
> the
> >>>>> system
> >>>>> >> (#!/bin/bash), however, bash does not come preinstalled on
> >>>>> FreeBSD. I
> >>>>> >> could install bash with runScript but I don't think personal
> >>>>> script is
> >>>>> >> executed before the init one? Another interesting note: sudo
> is
> >>>>> not
> >>>>> >> preinstalled either so I probably need to run my script as
> root.
> >>>>> I'll
> >>>>> >> play around with this and see what I can do.
> >>>>> >>
> >>>>> >> Code snippet:
> >>>>> >>
> >>>>> >> templateBuilder.osFamily(OsFamily.FREEBSD);
> >>>>> >> templateBuilder.imageId(REGION + "/ami-9f5549f3");
> >>>>> >> EC2TemplateOptions o =
> >>>>> EC2TemplateOptions.Builder.keyPair("mykeypair")
> >>>>> >>
> >>>>>
> >>>>>
> .overrideLoginCredentials(getLoginForCommandExecution(os)).runScript(getBootInstructions(os));
> >>>>> >> templateBuilder.locationId(REGION);
> >>>>> >> templateBuilder.hardwareId(INSTANCE);
> >>>>> >> templateBuilder.options(o);
> >>>>> >>
> >>>>> >>
> >>>>> >> On 27. 01. 2016 10:23, Ignasi Barrera wrote:
> >>>>> >>> Hi Klemen,
> >>>>> >>>
> >>>>> >>> jclouds generates and uploads that script to the node. It
> is a
> >>>>> wrapper
> >>>>> >>> script that provides some helpers to get the status of the
> >>>>> configured
> >>>>> >>> script, and to properly capture the output, stderr, and
> make it
> >>>>> >>> possible to abort its execution.
> >>>>> >>>
> >>>>> >>> After the failure, can you log in to the instance and see
> which
> >>>>> files
> >>>>> >>> do you have in the user's home directory and in /tmp?
> >>>>> >>>
> >>>>> >>> You can also disable the wrapper script by configuring the
> >>>>> >>> "wrapInitScript(false)" in the RunScriptOptions, and see if
> the
> >>>>> >>> problem persists.
> >>>>> >>>
> >>>>> >>> Could you also share a small code snippet of the code you're
> >>>>> using to
> >>>>> >>> bootstrap the node?
> >>>>> >>>
> >>>>> >>> I.
> >>>>> >>>
> >>>>> >>> On 27 January 2016 at 09:39, Klemen Ferjančič
> >>>>> <imbacen@gmail.com
> >>>>> <ma...@gmail.com>> wrote:
> >>>>> >>>> Hi
> >>>>> >>>>
> >>>>> >>>> When I create a new Ec2 instance with FreeBSD private AMI,
> the
> >>>>> >>>> init-bootstrap fails to run. The instance is created and
> runs
> >>>>> normally,
> >>>>> >>>> but the error also fails my own runScript so I'd like to
> >>>>> resolve it.
> >>>>> >>>>
> >>>>> >>>> 00:32:27,588 ERROR [jclouds.compute] (user thread 0) <<
> >>>>> problem
> >>>>> >>>> customizing node(eu-central-1/i-22cd4c9e): :
> >>>>> >>>> java.lang.IllegalStateException: error running
> >>>>> [/tmp/init-bootstrap
> >>>>> >>>> init] as ec2-user@52.59.247.117
> >>>>> <ma...@52.59.247.117>; returnVal !=0:
> >>>>> >>>> {output=/tmp/init-bootstrap: not found
> >>>>> >>>> , error=, exitStatus=127)
> >>>>> >>>>
> >>>>> >>>> Full stacktrace: http://pastebin.com/xabqprs5
> >>>>> >>>>
> >>>>> >>>> 1. Is /tmp/init-bootstrap supposed to already exist on the
> >>>>> image or is
> >>>>> >>>> this a script that jclouds uploads to the node? If the
> latter,
> >>>>> I assume
> >>>>> >>>> there is a problem with script not being uploaded in the
> first
> >>>>> place? No
> >>>>> >>>> error indicates this though.
> >>>>> >>>> 2. What does this script actually do? Is it possible to
> >>>>> disable it?
> >>>>> >>>>
> >>>>> >>>> Best regards, Klemen
> >>>>> >>>>
> >>>>> >>>>
> >>>>> >>
> >>>>>
> >>
>
>