package cmd import ( "fmt" "github.com/spf13/cobra" "os" "path/filepath" "playbookctl/internal/space_worker" "playbookctl/internal/types" "playbookctl/internal/utils/logger" ) func NewCommandInstall() *cobra.Command { installCmd := &cobra.Command{ Use: "install [role1, role2, ...]", Short: "применить настройки пространства к серверу", Args: installCheckArgsE, ValidArgsFunction: ArgRoleCompletion, RunE: installRunE, } installCmd.Flags().Uint8Var(&flagAnsibleVerbose, "ansible-verbose", 0, "ansible verbose mode (0-3)") installCmd.Flags().StringVar(&flagAnsibleBin, "ansible-bin", "/usr/bin/ansible-playbook", "путь к ansible-playbook") installCmd.Flags().BoolVar(&flagGenOnly, "generate-only", false, "только сгенерировать исполняемую команду") installCmd.Flags().StringVar(&flagTargetHost, "target", "", "имя целевого хоста") if err := installCmd.MarkFlagFilename("ansible-bin"); err != nil { fmt.Println(err) os.Exit(1) } return installCmd } func installCheckArgsE(_ *cobra.Command, args []string) error { if len(args) == 0 { return nil } workDir, err := filepath.Abs(flagWorkdir) if err != nil { return err } playbook, err := types.ReadPlaybook(workDir) if err != nil { return err } for _, roleName := range args { if !containsInSlice(roleName, playbook.Roles) { return fmt.Errorf("роли \"%s\" не существует или она не добавлена в playbook.yml", roleName) } } return nil } func installRunE(_ *cobra.Command, args []string) error { workDir, err := filepath.Abs(flagWorkdir) if err != nil { return err } spaceWorker := space_worker.NewSpaceWorker(logger.LogVerbose(flagVerbose), workDir) spaceWorker.AnsibleBin = flagAnsibleBin spaceWorker.AnsibleVerbose = flagAnsibleVerbose return spaceWorker.Install(flagGenOnly, flagTargetHost, args...) } func containsInSlice(element string, slice []string) bool { for _, item := range slice { if item == element { return true } } return false }