diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/cmd/install.go b/cmd/install.go index 472d6d4..ca2f342 100644 --- a/cmd/install.go +++ b/cmd/install.go @@ -72,7 +72,7 @@ func installRunE(_ *cobra.Command, args []string) error { spaceWorker := space_worker.NewSpaceWorker(logger.LogVerbose(flagVerbose), workDir) spaceWorker.AnsibleBin = flagAnsibleBin spaceWorker.AnsibleVerbose = flagAnsibleVerbose - return spaceWorker.Install(flagGenOnly, args...) + return spaceWorker.Install(flagGenOnly, flagTargetHost, args...) } func containsInSlice(element string, slice []string) bool { diff --git a/internal/space_creator/space_creator.go b/internal/space_creator/space_creator.go index ca51656..e62cac3 100644 --- a/internal/space_creator/space_creator.go +++ b/internal/space_creator/space_creator.go @@ -81,7 +81,12 @@ func (app *SpaceCreator) CreateSpace(name string, props *ServerProps) error { } app.log.Trace("generate playbook.yml") - if err := generatePlaybook(spacePath, props.Name); err != nil { + if err := generatePlaybook(spacePath); err != nil { + return err + } + + app.log.Trace("generate default.host.txt") + if err := utils.WriteStringFile(filepath.Join(spacePath, "default.host.txt"), props.Name); err != nil { return err } @@ -134,9 +139,9 @@ func generateHosts(spacePath string, props *ServerProps) error { return types.WriteHosts(spacePath, &hosts) } -func generatePlaybook(spacePath string, name string) error { +func generatePlaybook(spacePath string) error { playbook := types.Playbook{ - Hosts: name, + Hosts: "all", GatherFacts: true, PreTasks: []types.Task{{ Name: "Include vars", diff --git a/internal/space_worker/space_worker.go b/internal/space_worker/space_worker.go index a9ba40f..df22897 100644 --- a/internal/space_worker/space_worker.go +++ b/internal/space_worker/space_worker.go @@ -176,9 +176,24 @@ func (app *SpaceWorker) ListRoles() error { //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -func (app *SpaceWorker) Install(generateOnly bool, roles ...string) error { +func (app *SpaceWorker) Install(generateOnly bool, targetHost string, roles ...string) error { app.log.Debug(fmt.Sprintf("workDir: %s", app.workDir)) - ansibleArgs := setupAnsibleArgs(app.AnsibleVerbose, roles) + + var host string + if targetHost != "" { + host = targetHost + } else { + var err error + host, err = app.GetDefaultHost() + if err != nil { + return err + } + } + + ansibleArgs, err := app.setupAnsibleArgs(app.AnsibleVerbose, host, roles) + if err != nil { + return err + } command := exec.Command(app.AnsibleBin, ansibleArgs...) command.Dir = app.workDir @@ -196,7 +211,7 @@ func (app *SpaceWorker) Install(generateOnly bool, roles ...string) error { return nil } -func setupAnsibleArgs(verbose uint8, roles []string) []string { +func (app *SpaceWorker) setupAnsibleArgs(verbose uint8, targetHost string, roles []string) ([]string, error) { var ansibleArgs []string switch verbose { @@ -209,6 +224,7 @@ func setupAnsibleArgs(verbose uint8, roles []string) []string { } ansibleArgs = append(ansibleArgs, "-i", "hosts.yml") + ansibleArgs = append(ansibleArgs, "-l", targetHost) if len(roles) > 0 { for _, role := range roles { @@ -218,7 +234,7 @@ func setupAnsibleArgs(verbose uint8, roles []string) []string { ansibleArgs = append(ansibleArgs, "--extra-vars", "dd_install=true") } - return append(ansibleArgs, "playbook.yml") + return append(ansibleArgs, "playbook.yml"), nil } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -232,9 +248,19 @@ func (app *SpaceWorker) ListHosts() error { return err } + app.log.Trace("try read default.host.txt") + defaultHost, err := utils.ReadStringFile(filepath.Join(app.workDir, "default.host.txt")) + if err != nil { + return err + } + fmt.Println("Хосты:") for serverName, props := range *hosts { - fmt.Printf(" - %s [%s:%d] (%s)\n", serverName, props.Host, props.Port, props.User) + defaultMarker := "" + if serverName == defaultHost { + defaultMarker = " *" + } + fmt.Printf(" - %s [%s:%d] (%s)%s\n", serverName, props.Host, props.Port, props.User, defaultMarker) } return nil @@ -302,20 +328,24 @@ func (app *SpaceWorker) HostRemove(name string) error { func (app *SpaceWorker) SetDefaultHost(name string) error { app.log.Debug(fmt.Sprintf("workDir: %s", app.workDir)) - app.log.Trace("try read playbook.yml") - playbook, err := types.ReadPlaybook(app.workDir) + app.log.Trace("try write default.host.txt") + err := utils.WriteStringFile(filepath.Join(app.workDir, "default.host.txt"), name) if err != nil { return err } - app.log.Trace("set default host") - playbook.Hosts = name - - app.log.Trace("write playbook.yml") - if err := types.WritePlaybook(app.workDir, playbook); err != nil { - return err - } - app.log.Info(fmt.Sprintf("Хост '%s' установлен по-умолчанию", name)) return nil } + +func (app *SpaceWorker) GetDefaultHost() (string, error) { + app.log.Debug(fmt.Sprintf("workDir: %s", app.workDir)) + + app.log.Trace("try read default.host.txt") + value, err := utils.ReadStringFile(filepath.Join(app.workDir, "default.host.txt")) + if err != nil { + return "", err + } + + return value, nil +} diff --git a/internal/utils/filesystem.go b/internal/utils/filesystem.go index 4efb434..f1100eb 100644 --- a/internal/utils/filesystem.go +++ b/internal/utils/filesystem.go @@ -1,6 +1,9 @@ package utils -import "os" +import ( + "bytes" + "os" +) func SaveStaticFile(path string, data []byte) error { return os.WriteFile(path, data, 0644) @@ -13,3 +16,19 @@ func CreateDir(path string) error { func RemoveFile(path string) error { return os.Remove(path) } + +func WriteStringFile(path string, data string) error { + buffer := &bytes.Buffer{} + buffer.WriteString(data) + + return os.WriteFile(path, buffer.Bytes(), 0644) +} + +func ReadStringFile(path string) (string, error) { + data, err := os.ReadFile(path) + if err != nil { + return "", err + } + + return string(data), nil +} diff --git a/target/playbookctl b/target/playbookctl index 3449895..12c8e4a 100755 Binary files a/target/playbookctl and b/target/playbookctl differ