// cloudinitRunCmd returns the shell command that, when run, will create the // "machine info" file containing the hostname of a machine. // That command is destined to be used by cloudinit. func (info *machineInfo) cloudinitRunCmd(cloudcfg cloudinit.CloudConfig) (string, error) { dataDir, err := paths.DataDir(cloudcfg.GetSeries()) if err != nil { return "", errors.Trace(err) } yaml, err := goyaml.Marshal(info) if err != nil { return "", errors.Trace(err) } renderer := cloudcfg.ShellRenderer() fileName := renderer.Join(renderer.FromSlash(dataDir), "MAASmachine.txt") script := renderer.MkdirAll(dataDir) contents := renderer.Quote(string(yaml)) script = append(script, renderer.WriteFile(fileName, []byte(contents))...) script = append(script, renderer.Chmod(fileName, 0755)...) return strings.Join(script, "\n"), nil }
// SetUbuntuUser creates an "ubuntu" use for unix systems so the juju client // can access the machine using ssh with the configuration we expect. // On precise, the default cloudinit version is too old to support the users // option, so instead rely on the default user being created and adding keys. // It may make sense in the future to add a "juju" user instead across // all distributions. func SetUbuntuUser(conf cloudinit.CloudConfig, authorizedKeys string) { targetSeries := conf.GetSeries() if targetSeries == "precise" { conf.SetSSHAuthorizedKeys(authorizedKeys) } else { var groups []string targetOS, _ := series.GetOSFromSeries(targetSeries) switch targetOS { case os.Ubuntu: groups = UbuntuGroups case os.CentOS: groups = CentOSGroups } conf.AddUser(&cloudinit.User{ Name: "ubuntu", Groups: groups, Shell: "/bin/bash", Sudo: []string{"ALL=(ALL) NOPASSWD:ALL"}, SSHAuthorizedKeys: authorizedKeys, }) } }