diff --git a/it/server/src/test/java/com/walmartlabs/concord/it/server/AnsibleIT.java b/it/server/src/test/java/com/walmartlabs/concord/it/server/AnsibleIT.java index 6dc21768dd..9e3442270d 100644 --- a/it/server/src/test/java/com/walmartlabs/concord/it/server/AnsibleIT.java +++ b/it/server/src/test/java/com/walmartlabs/concord/it/server/AnsibleIT.java @@ -62,6 +62,26 @@ public void testHello() throws Exception { assertLog(".*\"msg\":.*Hello, world.*", ab); } + @Test + public void testConfigFile() throws Exception { + URI dir = AnsibleIT.class.getResource("ansibleConfigFile").toURI(); + byte[] payload = archive(dir); + + // --- + + StartProcessResponse spr = start(payload); + + // --- + + ProcessEntry pir = waitForCompletion(getApiClient(), spr.getInstanceId()); + assertEquals(ProcessEntry.StatusEnum.FINISHED, pir.getStatus()); + + // --- + + byte[] ab = getLog(pir.getInstanceId()); + assertLog(".*\"msg\":.*Hello, world.*", ab); + } + @Test public void testSkipTags() throws Exception { URI dir = AnsibleIT.class.getResource("ansibleSkipTags").toURI(); diff --git a/it/server/src/test/resources/com/walmartlabs/concord/it/server/ansibleConfigFile/concord.yml b/it/server/src/test/resources/com/walmartlabs/concord/it/server/ansibleConfigFile/concord.yml new file mode 100644 index 0000000000..13f6631616 --- /dev/null +++ b/it/server/src/test/resources/com/walmartlabs/concord/it/server/ansibleConfigFile/concord.yml @@ -0,0 +1,13 @@ +configuration: + dependencies: + - mvn://com.walmartlabs.concord.plugins.basic:ansible-tasks:PROJECT_VERSION + runtime: "concord-v2" + +flows: + default: + - task: ansible + in: + playbook: playbook/hello.yml + configFile: user.cfg + extraVars: + greetings: "Hello, world" diff --git a/it/server/src/test/resources/com/walmartlabs/concord/it/server/ansibleConfigFile/myInventory.ini b/it/server/src/test/resources/com/walmartlabs/concord/it/server/ansibleConfigFile/myInventory.ini new file mode 100644 index 0000000000..8a9c63a55f --- /dev/null +++ b/it/server/src/test/resources/com/walmartlabs/concord/it/server/ansibleConfigFile/myInventory.ini @@ -0,0 +1,2 @@ +[local] +127.0.0.1 ansible_connection=local diff --git a/it/server/src/test/resources/com/walmartlabs/concord/it/server/ansibleConfigFile/playbook/hello.yml b/it/server/src/test/resources/com/walmartlabs/concord/it/server/ansibleConfigFile/playbook/hello.yml new file mode 100644 index 0000000000..ec8d37c6bb --- /dev/null +++ b/it/server/src/test/resources/com/walmartlabs/concord/it/server/ansibleConfigFile/playbook/hello.yml @@ -0,0 +1,6 @@ +--- +- hosts: local + tasks: + - debug: + msg: "{{ greetings }}" + verbosity: 0 diff --git a/it/server/src/test/resources/com/walmartlabs/concord/it/server/ansibleConfigFile/user.cfg b/it/server/src/test/resources/com/walmartlabs/concord/it/server/ansibleConfigFile/user.cfg new file mode 100644 index 0000000000..ec9a1397c8 --- /dev/null +++ b/it/server/src/test/resources/com/walmartlabs/concord/it/server/ansibleConfigFile/user.cfg @@ -0,0 +1,2 @@ +[defaults] +inventory = ./myInventory.ini diff --git a/plugins/tasks/ansible/src/main/java/com/walmartlabs/concord/plugins/ansible/AnsibleInventory.java b/plugins/tasks/ansible/src/main/java/com/walmartlabs/concord/plugins/ansible/AnsibleInventory.java index bed14373fd..f6391e62e6 100644 --- a/plugins/tasks/ansible/src/main/java/com/walmartlabs/concord/plugins/ansible/AnsibleInventory.java +++ b/plugins/tasks/ansible/src/main/java/com/walmartlabs/concord/plugins/ansible/AnsibleInventory.java @@ -35,9 +35,9 @@ public class AnsibleInventory { - public static void process(AnsibleContext context, PlaybookScriptBuilder playbook) throws IOException { + public static void process(AnsibleContext context, AnsibleConfig cfg, PlaybookScriptBuilder playbook) throws IOException { List inventories = new AnsibleInventory(context.workDir(), context.tmpDir(), context.debug()) - .write(context.args()); + .write(context.args(), cfg); playbook.withInventories(inventories); } @@ -54,8 +54,8 @@ public AnsibleInventory(Path workDir, Path tmpDir, boolean debug) { this.debug = debug; } - public List write(Map args) throws IOException { - List paths = writeInventory(args); + public List write(Map args, AnsibleConfig cfg) throws IOException { + List paths = writeInventory(args, cfg); if (debug) { for (Path p : paths) { @@ -70,7 +70,7 @@ public List write(Map args) throws IOException { } @SuppressWarnings("unchecked") - private List writeInventory(Map args) throws IOException { + private List writeInventory(Map args, AnsibleConfig cfg) throws IOException { // try an "inline" inventory Object v = MapUtils.get(args, TaskParams.INVENTORY_KEY.getKey(), null); @@ -144,6 +144,17 @@ private List writeInventory(Map args) throws IOException { return Collections.singletonList(p); } + // try the defaults from the configuration file + v = cfg.getDefaults().getString("inventory"); + if (v != null) { + p = workDir.resolve(v.toString()); + if (Files.exists(p)) { + Utils.updateScriptPermissions(p); + log.info("Using the inventory specified in the configuration file: {}", p); + return Collections.singletonList(p); + } + } + // we can't continue without an inventory throw new IOException("'" + TaskParams.INVENTORY_KEY.getKey() + "', '" + TaskParams.INVENTORY_FILE_KEY.getKey() + "' or '" + TaskParams.DYNAMIC_INVENTORY_FILE_KEY.getKey() + "' parameter is required"); diff --git a/plugins/tasks/ansible/src/main/java/com/walmartlabs/concord/plugins/ansible/AnsibleTask.java b/plugins/tasks/ansible/src/main/java/com/walmartlabs/concord/plugins/ansible/AnsibleTask.java index 99e44fca07..ef96e93b42 100644 --- a/plugins/tasks/ansible/src/main/java/com/walmartlabs/concord/plugins/ansible/AnsibleTask.java +++ b/plugins/tasks/ansible/src/main/java/com/walmartlabs/concord/plugins/ansible/AnsibleTask.java @@ -85,7 +85,7 @@ public TaskResult.SimpleResult run(AnsibleContext context, PlaybookScriptBuilder b = new PlaybookScriptBuilder(context, playbook); - AnsibleInventory.process(context, b); + AnsibleInventory.process(context, cfg, b); AnsibleVaultId.process(context, b); diff --git a/plugins/tasks/ansible/src/main/java/com/walmartlabs/concord/plugins/ansible/ConfigSection.java b/plugins/tasks/ansible/src/main/java/com/walmartlabs/concord/plugins/ansible/ConfigSection.java index f6265e3ade..75dcf35d5f 100644 --- a/plugins/tasks/ansible/src/main/java/com/walmartlabs/concord/plugins/ansible/ConfigSection.java +++ b/plugins/tasks/ansible/src/main/java/com/walmartlabs/concord/plugins/ansible/ConfigSection.java @@ -22,8 +22,6 @@ import java.util.Map; -import static com.walmartlabs.concord.sdk.MapUtils.getString; - public class ConfigSection { private final Map items; @@ -33,7 +31,7 @@ public ConfigSection(Map items) { } public ConfigSection prependPath(String key, String path) { - String current = getString(items, key); + String current = getString(key); if (current != null) { items.put(key, path + ":" + current); } else { @@ -46,4 +44,15 @@ public ConfigSection put(String key, String value) { items.put(key, value); return this; } + + public String getString(String key) { + Object v = items.get(key); + if (v == null) { + return null; + } + if (v instanceof String s) { + return s; + } + throw new RuntimeException("Expected a string value in '%s', got %s (%s)".formatted(key, v, v.getClass())); + } }