diff --git a/CHANGELOG.md b/CHANGELOG.md index 9369279..c718635 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## v2.0.1 (2024-07-10) + +### Fixed + +- Fixed the String method on the AnsiblePlaybookOptions and AnsibleAdhocOptions structs that does not return the verbose flags correctly. + ## v2.0.0 (2024-04-20) Version 2.0.0 of *go-ansible* introduces several disruptive changes. Read the upgrade guide carefully before proceeding with the upgrade. diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 0440887..1267794 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,94 +1,7 @@ # Release notes -## v2.0.0 (2024-04-20) - -Version 2.0.0 of *go-ansible* introduces several disruptive changes. Read the upgrade guide carefully before proceeding with the upgrade. - -### BREAKING CHANGES - -> **Note** -> The latest major version of _go-ansible_, version _2.x_, introduced significant and breaking changes. If you are currently using a version prior to _2.x_, please refer to the [upgrade guide](https://github.com/apenella/go-ansible/blob/master/docs/upgrade_guide_to_2.x.md) for detailed information on how to migrate to version _2.x_. - -- The Go module name has been changed from `github.com/apenella/go-ansible` to `github.com/apenella/go-ansible/v2`. So, you need to update your import paths to use the new module name. -- The relationship between the executor and `AnsiblePlaybookCmd` / `AnsibleAdhocCmd` / `AnsibleInvetoryCmd` has undergone important changes. - - **Inversion of responsibilities**: The executor is now responsible for executing external commands, while `AnsiblePlaybookCmd`, `AnsibleInventoryCmd` and `AnsibleAdhocCmd` have cut down their responsibilities, primarily focusing on generating the command to be executed. - - **Method and Attribute Removal**: The following methods and attributes have been removed on `AnsiblePlaybookCmd`, `AnsibleInventoryCmd` and `AnsibleAdhocCmd`: - - The `Run` method. - - The `Exec` and `StdoutCallback` attributes. - - **Attributes Renaming**: The `Options` attribute has been renamed to `PlaybookOptions` in `AnsiblePlaybookCmd`, `AdhocOptions` in `AnsibleAdhocCmd` and `InventoryOptions` in `AnsibleInventoryCmd`. -- The `Executor` interface has undergone a significant signature change. This change entails the removal of the following arguments `resultsFunc` and `options`. The current signature is: `Execute(ctx context.Context) error`. -- The `github.com/apenella/go-ansible/pkg/options` package has been removed. After that deletion, the attributes from `AnsibleConnectionOptions` and `AnsiblePrivilegeEscalationOptions` attributes have been moved to the `PlaybookOptions`, `AdhocOptions` and `InventoryOptions` structs. -- The `github.com/apenella/go-ansible/pkg/stdoutcallback` package has been removed. Its responsibilities have been absorbed by two distinc packages `github.com/apenella/go-ansible/v2/pkg/execute/result`, which manages the output of the commands, and `github.com/apenella/go-ansible/v2/pkg/execute/stdoutcallback` that enables the setting of the stdout callback. -- The constants `AnsibleForceColorEnv` and `AnsibleHostKeyCheckingEnv` have been removed from the `github.com/apenella/go-ansible/pkg/options` package. -- The functions `AnsibleForceColor`, `AnsibleAvoidHostKeyChecking` and `AnsibleSetEnv` have been removed from the `github.com/apenella/go-ansible/pkg/options` package. Use the `ExecutorWithAnsibleConfigurationSettings` decorator instead defined in the `github.com/apenella/go-ansible/v2/pkg/execute/configuration` package. -- The methods `WithWrite` and `WithShowduration` have been removed from the `ExecutorTimeMeasurement` decorator. Instead, a new method named `Duration` has been introduced for obtaining the duration of the execution. -- In the `AnsiblePlaybookJSONResultsPlayTaskHostsItem` struct, the attributes `StdoutLines` and `StderrLines` have chnage their type from `[]string` to `[]interface{}`. +## v2.0.1 (2024-07-10) ### Fixed -- Quote properly the attributes `SCPExtraArgs`, `SFTPExtraArgs`, `SSHCommonArgs`, `SSHExtraArgs` in `AnsibleAdhocOptions` and `AnsiblePlaybookOptions` structs when generating the command to be executed. #140 -- When using the JSON Stdout Callback method combined with enabled verbosity in the command, it causes an error during JSON parsing. To resolve this issue, the `DefaultExecute` struct includes the `Quiet` method, which removes verbosity from the executed command. #110 - -### Added - -- `AnsibleAdhocExecute` _executor_ has been introduced. That _executor_ allows you to create an executor to run `ansible` commands using the default settings of `DefaultExecute`. This _executor_ is located in the `github.com/apenella/go-ansible/v2/pkg/execute/adhoc` package. -- `AnsibleInventoryExecute` _executor_ has been introduced. That _executor_ allows you to create an executor to run `ansible-inventory` commands using the default settings of `DefaultExecute`. This _executor_ is located in the `github.com/apenella/go-ansible/v2/pkg/execute/inventory` package. -- `ansibleplaybook-embed-python` example to demonstrate how to use `go-ansible` library along with the `go-embed-python` package. -- `ansibleplaybook-extravars` example to show how to configure extra vars when running an Ansible playbook command. -- `ansibleplaybook-ssh` example to show how to execute an Ansible playbook using SSH as the connection method. -- `AnsiblePlaybookExecute` _executor_ has been introduced. That _executor_ allows you to create an executor to run `ansible-playbook` commands using the default settings of `DefaultExecute`. This _executor_ is located in the `github.com/apenella/go-ansible/v2/pkg/execute/playbook` package. -- `Commander` interface has been introduced in the `github.com/apenella/go-ansible/v2/pkg/execute` package. This interface defines the criteria for a struct to be compliant in generating execution commands. -- `ErrorEnricher` interface has been introduced in the `github.com/apenella/go-ansible/v2/pkg/execute` package. This interface defines the criteria for a struct to be compliant in enriching the error message of the command execution. -- `Executabler` interface has been introduced in the `github.com/apenella/go-ansible/v2/pkg/execute` package. This interface defines the criteria for a struct to be compliant in executing external commands. -- `ExecutorEnvVarSetter` interface in `github.com/apenella/go-ansible/v2/pkg/execute/configuration` defines the criteria for a struct to be compliant in setting Ansible configuration. -- `ExecutorQuietStdoutCallbackSetter` interface has been introduced in the `github.com/apenella/go-ansible/v2/pkg/execute/stdoutcallback` package. This interface defines the criteria for a struct to be compliant in setting an executor that accepts the stdout callback configuration and that enables the `Quiet` method for Ansible executions. -- `ExecutorStdoutCallbackSetter` interface has been introduced in the `github.com/apenella/go-ansible/v2/pkg/execute/stdoutcallback` package. This interface defines the criteria for a struct to be compliant in setting an executor that accepts the stdout callback configuration for Ansible executions. -- `github.com/apenella/go-ansible/v2/internal/executable/os/exec` package has been introduced. This package serves as a wrapper for `os.exec`. -- `github.com/apenella/go-ansible/v2/pkg/execute/configuration` package includes the `ExecutorWithAnsibleConfigurationSettings` struct, which acts as a decorator that facilitates the configuration of Ansible settings within the executor. -- `github.com/apenella/go-ansible/v2/pkg/execute/result/default` package has been introduced. This package offers the default component for printing execution results. It supersedes the `DefaultStdoutCallbackResults` function that was previously defined in the `github.com/apenella/go-ansible/v2/pkg/stdoutcallback` package. -- `github.com/apenella/go-ansible/v2/pkg/execute/result/json` package has been introduced. This package offers the component for printing execution results from the JSON stdout callback. It supersedes the `JSONStdoutCallbackResults` function that was previously defined in the `github.com/apenella/go-ansible/v2/pkg/stdoutcallback` package. -- `github.com/apenella/go-ansible/v2/pkg/execute/stdoutcallback`. package has been introduced and offers multiple decorators designed to set the stdout callback for Ansible executions. -- `github.com/apenella/go-ansible/v2/pkg/execute/workflow` package has been introduced and allows you to define a workflow for executing multiple commands in a sequence. -- `github.com/apenella/go-ansible/v2/pkg/galaxy/collection/install` package has been introduced. This package allows you to install Ansible collections from the Ansible Galaxy. Along with this package, the example `workflowexecute-ansibleplaybook-with-galaxy-install-collection` has been added to demonstrate how to install an Ansible collection and execute an Ansible playbook in a sequence. -- `github.com/apenella/go-ansible/v2/pkg/galaxy/role/install` package has been introduced. This package allows you to install Ansible roles from the Ansible Galaxy. Along with this package, the example `workflowexecute-ansibleplaybook-with-galaxy-install-role` has been added to demonstrate how to install an Ansible role and execute an Ansible playbook in a sequence. -- `golangci-lint` has been added to the CI/CD pipeline to ensure the code quality. -- `NewAnsibleAdhocCmd`, `NewAnsibleInventoryCmd` and `NewAnsiblePlaybookCmd` functions have been introduced. These functions are responsible for creating the `AnsibleAdhocCmd`, `AnsibleInventoryCmd` and `AnsiblePlaybookCmd` structs, respectively. -- `Path` attribute has been added to the `AnsiblePlaybookJSONResultsPlayTaskHostsItem` struct. -- `ResultsOutputer` interface has been introduced in the `github.com/apenella/go-ansible/v2/pkg/execute/result` package. This interface defines the criteria for a struct to be compliant in printing execution results. -- A utility to generate the code for the configuration package has been introduced. This utility is located in the `utils/cmd/configGenerator.go`. -- The `Quiet` method has been added to the `DefaultExecute` struct. This method forces to remove verbosity from the executed command. - -### Changed - -- `DefaultExecute` used the `String` method from the `Commander` to include the command in the error message when the execution fails, instead of using the the `String` method from the `os/exec.Cmd` struct. -- In the `AnsiblePlaybookJSONResultsPlayTaskHostsItem` struct, the attributes `StdoutLines` and `StderrLines` have chnage their type from `[]string` to `[]interface{}`. -- The `AnsibleAdhocCmd` struct has been updated to implement the `Commander` interface. -- The `AnsibleInventoryCmd` struct has been updated to implement the `Commander` interface. -- The `AnsiblePlaybookCmd` struct has been updated to implement the `Commander` interface. -- The `AnsiblePlaybookOptions` and `AnsibleAdhocOptions` structs have been updated to include the attributes from `AnsibleConnectionOptions` and `AnsiblePrivilegeEscalationOptions`. -- The `DefaultExecute` struct has been updated to have a new attribute named `Exec` of type `Executabler` that is responsible for executing external commands. -- The `DefaultExecute` struct has been updated to have a new attribute named `Output` of type `ResultsOutputer` that is responsible for printing the execution's output. -- The `DefaultExecute` struct has been updated to implement the `Executor` interface. -- The `DefaultExecute` struct has been updated to implement the `ExecutorEnvVarSetter` interface. -- The `DefaultExecute` struct has been updated to implement the `ExecutorStdoutCallbackSetter` interface. -- The `Execute` method in the `DefaultExecute` struct has been updated to return an error on the deferred function when the command execution fails. -- The `Options` attribute in `AnsibleAdhocCmd` struct has been renamed to `AdhocOptions`. -- The `Options` attribute in `AnsibleInventoryCmd` struct has been renamed to `InventoryOptions`. -- The `Options` attribute in `AnsiblePlaybookCmd` struct has been renamed to `PlaybookOptions`. -- The `Read` method in the `ReadPasswordFromEnvVar` struct from the `github.com/apenella/go-ansible/v2/vault/password/envvars` package has been updated to log a warning message when the environment variable is not set. -- The examples has been adapted to use executor as the component to execute Ansible commands. -- The package `github.com/apenella/go-ansible/pkg/stdoutcallback/result/transformer` has been moved to `github.com/apenella/go-ansible/v2/pkg/execute/result/transformer`. -- Upgrade the Go version from `1.19` to `1.22`. - -### Removed - -- Remove from `DefaultExecute` ansible-playbook error enrichment. -- The `Exec` attribute has been removed from `AnsiblePlaybookCmd` and `AdhocPlaybookCmd`. -- The `github.com/apenella/go-ansible/pkg/options` package has been removed. After the `AnsibleConnectionOptions` and `AnsiblePrivilegeEscalationOptions` structs are not available anymore. -- The `github.com/apenella/go-ansible/pkg/stdoutcallback` package has been removed. -- The `Run` method has been removed from the `AnsiblePlaybookCmd` and `AdhocPlaybookCmd` structs. -- The `ShowDuration` attribute in the `DefaultExecute` struct has been removed. -- The `StdoutCallback` attribute has been removed from `AnsiblePlaybookCmd` and `AdhocPlaybookCmd`. -- The constants `AnsibleForceColorEnv` and `AnsibleHostKeyCheckingEnv` have been removed from the `github.com/apenella/go-ansible/pkg/options` package. -- The functions `AnsibleForceColor`, `AnsibleAvoidHostKeyChecking` and `AnsibleSetEnv` have been removed from the `github.com/apenella/go-ansible/pkg/options` package. Use the `ExecutorWithAnsibleConfigurationSettings` decorator instead defined in the `github.com/apenella/go-ansible/v2/pkg/execute/configuration` package. -- The methods `WithWrite` and `withshowduration` have been removed from the `ExecutorTimeMeasurement` decorator. +- Fixed the String method on the AnsiblePlaybookOptions and AnsibleAdhocOptions structs that does not return the verbose flags correctly. diff --git a/examples/ansibleplaybook-simple-with-prompt/ansibleplaybook-simple-with-prompt.go b/examples/ansibleplaybook-simple-with-prompt/ansibleplaybook-simple-with-prompt.go index 7b9560b..f776902 100644 --- a/examples/ansibleplaybook-simple-with-prompt/ansibleplaybook-simple-with-prompt.go +++ b/examples/ansibleplaybook-simple-with-prompt/ansibleplaybook-simple-with-prompt.go @@ -2,8 +2,10 @@ package main import ( "context" + "os" "github.com/apenella/go-ansible/v2/pkg/execute" + "github.com/apenella/go-ansible/v2/pkg/execute/configuration" "github.com/apenella/go-ansible/v2/pkg/playbook" ) @@ -12,6 +14,7 @@ func main() { ansiblePlaybookOptions := &playbook.AnsiblePlaybookOptions{ Connection: "local", Inventory: "127.0.0.1,", + // Verbose: true, } playbookCmd := playbook.NewAnsiblePlaybookCmd( @@ -19,9 +22,13 @@ func main() { playbook.WithPlaybookOptions(ansiblePlaybookOptions), ) - exec := execute.NewDefaultExecute( - execute.WithCmd(playbookCmd), - execute.WithErrorEnrich(playbook.NewAnsiblePlaybookErrorEnrich()), + exec := configuration.NewAnsibleWithConfigurationSettingsExecute( + execute.NewDefaultExecute( + execute.WithCmd(playbookCmd), + execute.WithErrorEnrich(playbook.NewAnsiblePlaybookErrorEnrich()), + execute.WithWriteError(os.Stdout), + ), + configuration.WithAnsibleForceColor(), ) err := exec.Execute(context.TODO()) diff --git a/examples/ansibleplaybook-simple-with-prompt/input.yml b/examples/ansibleplaybook-simple-with-prompt/input.yml index 6498602..d8f10a8 100644 --- a/examples/ansibleplaybook-simple-with-prompt/input.yml +++ b/examples/ansibleplaybook-simple-with-prompt/input.yml @@ -1,21 +1,21 @@ --- + - name: Test playbook for user input hosts: localhost + gather_facts: false + + vars_prompt: + - name: input_this + prompt: Type in anything + - name: input_that + prompt: Type in another thing tasks: - - name: simple prompt 1 - pause: - prompt: | - Type in anything to be echo'ed - register: result - - name: echo user input + + - name: echo user input this debug: - msg: you typed {{ result.user_input }} - - name: simple prompt 2 - pause: - prompt: | - Type in anything to be echo'ed again with more information - register: result_2 - - name: echo user input with more details + msg: "You typed this: '{{ input_this }}'" + + - name: echo user input that debug: - var: result_2 + msg: "You typed that: '{{ input_that }}'" diff --git a/pkg/adhoc/ansibleAdhocOptions.go b/pkg/adhoc/ansibleAdhocOptions.go index e95d8d3..197d75f 100644 --- a/pkg/adhoc/ansibleAdhocOptions.go +++ b/pkg/adhoc/ansibleAdhocOptions.go @@ -600,8 +600,9 @@ func (o *AnsibleAdhocOptions) String() string { str = fmt.Sprintf("%s %s %s", str, VaultPasswordFileFlag, o.VaultPasswordFile) } - if o.Verbose { - str = fmt.Sprintf("%s %s", str, VerboseFlag) + verbosityString, _ := o.generateVerbosityFlag() + if verbosityString != "" { + str = fmt.Sprintf("%s %s", str, verbosityString) } if o.Version { diff --git a/pkg/adhoc/ansibleAdhocOptions_test.go b/pkg/adhoc/ansibleAdhocOptions_test.go index 9e55ab2..7a29d50 100644 --- a/pkg/adhoc/ansibleAdhocOptions_test.go +++ b/pkg/adhoc/ansibleAdhocOptions_test.go @@ -197,54 +197,92 @@ func TestGenerateExtraVarsCommand(t *testing.T) { func TestAnsibleAdhocOptionsString(t *testing.T) { - t.Log("Testing generate ansible adhoc options string") - - options := &AnsibleAdhocOptions{ - Args: "args", - AskBecomePass: true, - AskPass: true, - AskVaultPassword: true, - Background: 11, - Become: true, - BecomeMethod: "become-method", - BecomeUser: "become-user", - Check: true, - Connection: "local", - Diff: true, - ExtraVars: map[string]interface{}{ - "var1": "value1", - "var2": false, + tests := []struct { + desc string + options *AnsibleAdhocOptions + res string + }{ + { + desc: "Testing generate ansible adhoc options string", + options: &AnsibleAdhocOptions{ + Args: "args", + AskBecomePass: true, + AskPass: true, + AskVaultPassword: true, + Background: 11, + Become: true, + BecomeMethod: "become-method", + BecomeUser: "become-user", + Check: true, + Connection: "local", + Diff: true, + ExtraVars: map[string]interface{}{ + "var1": "value1", + "var2": false, + }, + ExtraVarsFile: []string{"@test/ansible/extra_vars.yml"}, + Forks: "10", + Inventory: "127.0.0.1,", + Limit: "myhost", + ListHosts: true, + ModuleName: "module-name", + ModulePath: "/dev/null", + OneLine: true, + PlaybookDir: "playbook-dir", + Poll: 12, + PrivateKey: "pk", + SCPExtraArgs: "scp-extra-args", + SFTPExtraArgs: "sftp-extra-args", + SSHCommonArgs: "ssh-common-args", + SSHExtraArgs: "ssh-extra-args", + SyntaxCheck: true, + Timeout: 10, + Tree: "tree", + User: "user", + VaultID: "asdf", + VaultPasswordFile: "/dev/null", + Verbose: true, + Version: true, + }, + res: " --args 'args' --ask-vault-password --background 11 --check --diff --extra-vars '{\"var1\":\"value1\",\"var2\":false}' --extra-vars @test/ansible/extra_vars.yml --forks 10 --inventory 127.0.0.1, --limit myhost --list-hosts --module-name module-name --module-path /dev/null --one-line --playbook-dir playbook-dir --poll 12 --syntax-check --tree tree --vault-id asdf --vault-password-file /dev/null -vvvv --version --ask-pass --connection local --private-key pk --scp-extra-args 'scp-extra-args' --sftp-extra-args 'sftp-extra-args' --ssh-common-args 'ssh-common-args' --ssh-extra-args 'ssh-extra-args' --timeout 10 --user user --ask-become-pass --become --become-method become-method --become-user become-user", + }, + { + desc: "Testing AnsibleAdhocOptions setting the VerboseV flag as true", + options: &AnsibleAdhocOptions{ + VerboseV: true, + }, + res: " -v", + }, + { + desc: "Testing AnsibleAdhocOptions setting the VerboseVV flag as true", + options: &AnsibleAdhocOptions{ + VerboseVV: true, + }, + res: " -vv", + }, + { + desc: "Testing AnsibleAdhocOptions setting the VerboseVVV flag as true", + options: &AnsibleAdhocOptions{ + VerboseVVV: true, + }, + res: " -vvv", + }, + { + desc: "Testing AnsibleAdhocOptions setting the VerboseVVVV flag as true", + options: &AnsibleAdhocOptions{ + VerboseVVVV: true, + }, + res: " -vvvv", }, - ExtraVarsFile: []string{"@test/ansible/extra_vars.yml"}, - Forks: "10", - Inventory: "127.0.0.1,", - Limit: "myhost", - ListHosts: true, - ModuleName: "module-name", - ModulePath: "/dev/null", - OneLine: true, - PlaybookDir: "playbook-dir", - Poll: 12, - PrivateKey: "pk", - SCPExtraArgs: "scp-extra-args", - SFTPExtraArgs: "sftp-extra-args", - SSHCommonArgs: "ssh-common-args", - SSHExtraArgs: "ssh-extra-args", - SyntaxCheck: true, - Timeout: 10, - Tree: "tree", - User: "user", - VaultID: "asdf", - VaultPasswordFile: "/dev/null", - Verbose: true, - Version: true, } - cmd := options.String() - - expected := " --args 'args' --ask-vault-password --background 11 --check --diff --extra-vars '{\"var1\":\"value1\",\"var2\":false}' --extra-vars @test/ansible/extra_vars.yml --forks 10 --inventory 127.0.0.1, --limit myhost --list-hosts --module-name module-name --module-path /dev/null --one-line --playbook-dir playbook-dir --poll 12 --syntax-check --tree tree --vault-id asdf --vault-password-file /dev/null -vvvv --version --ask-pass --connection local --private-key pk --scp-extra-args 'scp-extra-args' --sftp-extra-args 'sftp-extra-args' --ssh-common-args 'ssh-common-args' --ssh-extra-args 'ssh-extra-args' --timeout 10 --user user --ask-become-pass --become --become-method become-method --become-user become-user" + for _, test := range tests { + t.Run(test.desc, func(t *testing.T) { + res := test.options.String() + assert.Equal(t, test.res, res) + }) + } - assert.Equal(t, expected, cmd) } func TestAddExtraVar(t *testing.T) { diff --git a/pkg/playbook/ansiblePlaybookOptions.go b/pkg/playbook/ansiblePlaybookOptions.go index abb2acb..5737040 100644 --- a/pkg/playbook/ansiblePlaybookOptions.go +++ b/pkg/playbook/ansiblePlaybookOptions.go @@ -647,8 +647,9 @@ func (o *AnsiblePlaybookOptions) String() string { str = fmt.Sprintf("%s %s %s", str, VaultPasswordFileFlag, o.VaultPasswordFile) } - if o.Verbose { - str = fmt.Sprintf("%s %s", str, VerboseFlag) + verbosityString, _ := o.generateVerbosityFlag() + if verbosityString != "" { + str = fmt.Sprintf("%s %s", str, verbosityString) } if o.Version { diff --git a/pkg/playbook/ansiblePlaybookOptions_test.go b/pkg/playbook/ansiblePlaybookOptions_test.go index 05771ac..b7eb057 100644 --- a/pkg/playbook/ansiblePlaybookOptions_test.go +++ b/pkg/playbook/ansiblePlaybookOptions_test.go @@ -474,6 +474,34 @@ func TestAnsiblePlaybookOptionsString(t *testing.T) { }, res: " --ask-vault-password --check --diff --extra-vars '{\"extra\":\"var\"}' --extra-vars @test.yml --flush-cache --force-handlers --forks 10 --inventory inventory --limit limit --list-hosts --list-tags --list-tasks --module-path module-path --skip-tags skip-tags --start-at-task start-at-task --step --syntax-check --tags tags --vault-id vault-ID --vault-password-file vault-password-file -vvvv --version --ask-pass --connection local --private-key private-key --scp-extra-args 'scp-extra-args' --sftp-extra-args 'sftp-extra-args' --ssh-common-args 'ssh-common-args' --ssh-extra-args 'ssh-extra-args' --timeout 11 --user user --ask-become-pass --become --become-method become-method --become-user become-user", }, + { + desc: "Testing AnsiblePlaybookOptions setting the VerboseV flag as true", + ansiblePlaybookOptions: &AnsiblePlaybookOptions{ + VerboseV: true, + }, + res: " -v", + }, + { + desc: "Testing AnsiblePlaybookOptions setting the VerboseVV flag as true", + ansiblePlaybookOptions: &AnsiblePlaybookOptions{ + VerboseVV: true, + }, + res: " -vv", + }, + { + desc: "Testing AnsiblePlaybookOptions setting the VerboseVVV flag as true", + ansiblePlaybookOptions: &AnsiblePlaybookOptions{ + VerboseVVV: true, + }, + res: " -vvv", + }, + { + desc: "Testing AnsiblePlaybookOptions setting the VerboseVVVV flag as true", + ansiblePlaybookOptions: &AnsiblePlaybookOptions{ + VerboseVVVV: true, + }, + res: " -vvvv", + }, } for _, test := range tests {