You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2016/02/19 11:07:42 UTC

[5/7] brooklyn-library git commit: Add effector for ad-hoc ansible commands.

Add effector for ad-hoc ansible commands.

For example (using the command line):

    br app utest ent apc effector ansibleCommand invoke -P module=shell -P args='curl http://myhost:8080/additional.html > /var/www/html/additional.html'

This invokes the ad-hoc ansible command to add a file to an Apache documents folder.


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/8de0e9fd
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/8de0e9fd
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/8de0e9fd

Branch: refs/heads/master
Commit: 8de0e9fdf1c894da6c949ccfd75c77e9d24badf4
Parents: d5026df
Author: Geoff Macartney <ge...@cloudsoftcorp.com>
Authored: Tue Feb 9 17:28:44 2016 +0000
Committer: Yavor Yanchev <ya...@yanchev.com>
Committed: Wed Feb 17 11:43:03 2016 +0200

----------------------------------------------------------------------
 .../brooklyn/entity/cm/ansible/AnsibleEntity.java   | 14 ++++++++++++++
 .../entity/cm/ansible/AnsibleEntityImpl.java        | 16 +++++++++++++++-
 .../entity/cm/ansible/AnsiblePlaybookTasks.java     | 14 ++++++++++++--
 3 files changed, 41 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/8de0e9fd/software/cm/src/main/java/org/apache/brooklyn/entity/cm/ansible/AnsibleEntity.java
----------------------------------------------------------------------
diff --git a/software/cm/src/main/java/org/apache/brooklyn/entity/cm/ansible/AnsibleEntity.java b/software/cm/src/main/java/org/apache/brooklyn/entity/cm/ansible/AnsibleEntity.java
index 0124854..a2c9676 100644
--- a/software/cm/src/main/java/org/apache/brooklyn/entity/cm/ansible/AnsibleEntity.java
+++ b/software/cm/src/main/java/org/apache/brooklyn/entity/cm/ansible/AnsibleEntity.java
@@ -19,8 +19,22 @@
 package org.apache.brooklyn.entity.cm.ansible;
 
 import org.apache.brooklyn.api.entity.ImplementedBy;
+import org.apache.brooklyn.core.annotation.Effector;
+import org.apache.brooklyn.core.annotation.EffectorParam;
+import org.apache.brooklyn.core.effector.MethodEffector;
 import org.apache.brooklyn.entity.software.base.SoftwareProcess;
 
 @ImplementedBy(AnsibleEntityImpl.class)
 public interface AnsibleEntity extends SoftwareProcess, AnsibleConfig {
+
+    MethodEffector<String> ANSIBLE_COMMAND = new MethodEffector<>(AnsibleEntity.class, "ansibleCommand");
+
+    @Effector(description = "Invoke an arbitrary Ansible command, optionally specifying the module (default is 'command')")
+    String ansibleCommand(
+        @EffectorParam(name="module", description = "Name of the Ansible module to invoke", defaultValue = "command")
+        String module,
+        @EffectorParam(name="args", description = "Arguments for the ansible command")
+        String args
+    );
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/8de0e9fd/software/cm/src/main/java/org/apache/brooklyn/entity/cm/ansible/AnsibleEntityImpl.java
----------------------------------------------------------------------
diff --git a/software/cm/src/main/java/org/apache/brooklyn/entity/cm/ansible/AnsibleEntityImpl.java b/software/cm/src/main/java/org/apache/brooklyn/entity/cm/ansible/AnsibleEntityImpl.java
index bd797e6..b34603e 100644
--- a/software/cm/src/main/java/org/apache/brooklyn/entity/cm/ansible/AnsibleEntityImpl.java
+++ b/software/cm/src/main/java/org/apache/brooklyn/entity/cm/ansible/AnsibleEntityImpl.java
@@ -19,6 +19,8 @@
 package org.apache.brooklyn.entity.cm.ansible;
 
 import org.apache.brooklyn.entity.stock.EffectorStartableImpl;
+import org.apache.brooklyn.util.core.task.DynamicTasks;
+import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
 import org.apache.brooklyn.util.text.Strings;
 
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -37,5 +39,17 @@ public class AnsibleEntityImpl extends EffectorStartableImpl implements AnsibleE
     @Override
     public void populateServiceNotUpDiagnostics() {
         // TODO no-op currently; should check ssh'able etc
-    }    
+    }
+
+    @Override
+    public String ansibleCommand(String module, String args) {
+        final ProcessTaskWrapper<Integer> command = DynamicTasks.queue(AnsiblePlaybookTasks.moduleCommand(module, args));
+                command.asTask().blockUntilEnded();
+                if (0 == command.getExitCode()) {
+                        return command.getStdout();
+                    } else {
+                        throw new RuntimeException("Command (" + args + ") in module " + module
+                            +  " failed with stderr:\n" + command.getStderr() + "\n");
+                    }
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/8de0e9fd/software/cm/src/main/java/org/apache/brooklyn/entity/cm/ansible/AnsiblePlaybookTasks.java
----------------------------------------------------------------------
diff --git a/software/cm/src/main/java/org/apache/brooklyn/entity/cm/ansible/AnsiblePlaybookTasks.java b/software/cm/src/main/java/org/apache/brooklyn/entity/cm/ansible/AnsiblePlaybookTasks.java
index 1579e2d..29924d4 100644
--- a/software/cm/src/main/java/org/apache/brooklyn/entity/cm/ansible/AnsiblePlaybookTasks.java
+++ b/software/cm/src/main/java/org/apache/brooklyn/entity/cm/ansible/AnsiblePlaybookTasks.java
@@ -19,17 +19,21 @@
 package org.apache.brooklyn.entity.cm.ansible;
 
 import org.apache.brooklyn.api.entity.Entity;
-
 import org.apache.brooklyn.api.mgmt.TaskFactory;
 import org.apache.brooklyn.core.effector.EffectorTasks;
 import org.apache.brooklyn.core.effector.ssh.SshEffectorTasks;
 import org.apache.brooklyn.util.core.ResourceUtils;
 import org.apache.brooklyn.util.core.task.Tasks;
+import org.apache.brooklyn.util.core.task.system.ProcessTaskFactory;
 import org.apache.brooklyn.util.net.Urls;
 import org.apache.brooklyn.util.ssh.BashCommands;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Map;
+
+import static org.apache.brooklyn.util.ssh.BashCommands.sudo;
+
 public class AnsiblePlaybookTasks {
     private static final Logger LOG = LoggerFactory.getLogger(AnsiblePlaybookTasks.class);
 
@@ -68,5 +72,11 @@ public class AnsiblePlaybookTasks {
         return SshEffectorTasks.ssh(cdAndRun(ansibleDirectory, cmd)).
                 summary("run ansible playbook for " + playbookName).requiringExitCodeZero();
     }
-    
+
+    public static ProcessTaskFactory<Integer> moduleCommand(String module, String args) {
+        final String command = "ansible localhost -m '" + module + "' -a '" + args + "'";
+        return SshEffectorTasks.ssh(sudo(command))
+            .summary("ad-hoc: " + command).requiringExitCodeZero();
+    }
 }
+