...
Key | Purpose | Default |
host | IP or resolvable domain of management server | localhost |
port | Api server port, 8080 is encouraged over 8096 | 8080 |
apikey | User api key | "" |
secretkey | User secret key | "" |
prompt | cloudmonkey prompt, default prompt has a UTF-8 char which can be an issue | 🵠cloudmonkey> |
asyncblock | Poll for async commands, making it false will cause cloudmonkey to return jobid | true |
timeout | Timeout interval for polling async commands | 3600 |
color | Enable coloured output, set to false to disable | true |
log_file | Log file | ~/.cloudmonkey_log |
history_file | History file | ~/.cloudmonkey_history |
...
First set your host, port, apikey and secretkey using set. Api and Secret keys can be created via CloudStack management server UI, Accounts->Users->Generate keys.
Code Block |
---|
> set host 192.168.56.1
> set port 8080
> set apikey <put-your-api-key-for-your-user>
> set secretkey <put-your-secret-key-for-your-user>
> set prompt mycloudmonkey>
|
Make sure your management server is running, try out some commands:
Code Block |
---|
> list users
> list users <tab><tab>
|
Help for any command can be obtained using help <cmd> or ?<cmd> or <cmd> --help, examples:
Code Block |
---|
> help list
> help list users
> ?list
> ?list users
> list users --help
|
A typical help doc for an api will list all available acceptable arguments and required arguments.
Use cloudmonkey as a command line tool, by passing args to cloudmonkey. Example:
Code Block |
---|
$ cloudmonkey list users
$ cloudmonkey list zones
|
The follow example illustrates how one can use cloudmonkey to automate their deployments, this one deploys a basic zone:
Code Block |
---|
#!/bin/bash
cli=cloudmonkey
dns_ext=8.8.8.8
dns_int=10.147.28.6
gw=10.147.28.1
nmask=255.255.255.0
hpvr=XenServer
pod_start=10.147.28.225
pod_end=10.147.28.234
vlan_start=10.147.28.235
vlan_end=10.147.28.254
#Put space separated host ips in following
host_ips=10.147.28.60
host_user=root
host_passwd=password
sec_storage=nfs://10.147.28.7/export/home/rohit/secondary
prm_storage=nfs://10.147.28.7/export/home/rohit/primary
zone_id=`$cli create zone dns1=$dns_ext internaldns1=$dns_int name=MyZone networktype=Basic | grep ^id\ = | awk '{print $3}'`
echo "Created zone" $zone_id
phy_id=`$cli create physicalnetwork name=phy-network zoneid=$zone_id | grep ^id\ = | awk '{print $3}'`
echo "Created physical network" $phy_id
$cli add traffictype traffictype=Guest physicalnetworkid=$phy_id
echo "Added guest traffic"
$cli add traffictype traffictype=Management physicalnetworkid=$phy_id
echo "Added mgmt traffic"
$cli update physicalnetwork state=Enabled id=$phy_id
echo "Enabled physicalnetwork"
nsp_id=`$cli list networkserviceproviders name=VirtualRouter physicalnetworkid=$phy_id | grep ^id\ = | awk '{print $3}'`
vre_id=`$cli list virtualrouterelements nspid=$nsp_id | grep ^id\ = | awk '{print $3}'`
$cli api configureVirtualRouterElement enabled=true id=$vre_id
$cli update networkserviceprovider state=Enabled id=$nsp_id
echo "Enabled virtual router element and network service provider"
nsp_sg_id=`$cli list networkserviceproviders name=SecurityGroupProvider physicalnetworkid=$phy_id | grep ^id\ = | awk '{print $3}'`
$cli update networkserviceprovider state=Enabled id=$nsp_sg_id
echo "Enabled security group provider"
netoff_id=`$cli list networkofferings name=DefaultSharedNetworkOfferingWithSGService | grep ^id\ = | awk '{print $3}'`
net_id=`$cli create network zoneid=$zone_id name=guestNetworkForBasicZone displaytext=guestNetworkForBasicZone networkofferingid=$netoff_id | grep ^id\ = | awk '{print $3}'`
echo "Created network $net_id for zone" $zone_id
pod_id=`$cli create pod name=MyPod zoneid=$zone_id gateway=$gw netmask=$nmask startip=$pod_start endip=$pod_end | grep ^id\ = | awk '{print $3}'`
echo "Created pod"
$cli create vlaniprange podid=$pod_id networkid=$net_id gateway=$gw netmask=$nmask startip=$vlan_start endip=$vlan_end forvirtualnetwork=false
echo "Created IP ranges for instances"
cluster_id=`$cli add cluster zoneid=$zone_id hypervisor=$hpvr clustertype=CloudManaged podid=$pod_id clustername=MyCluster | grep ^id\ = | awk '{print $3}'`
echo "Created cluster" $cluster_id
#Put loop here if more than one
for host_ip in $host_ips;
do
$cli add host zoneid=$zone_id podid=$pod_id clusterid=$cluster_id hypervisor=$hpvr username=$host_user password=$host_passwd url=http://$host_ip;
echo "Added host" $host_ip;
done;
#$cli create storagepool zoneid=$zone_id podid=$pod_id clusterid=$cluster_id name=MyNFSPrimary url=$prm_storage
#echo "Added primary storage"
$cli add secondarystorage zoneid=$zone_id url=$sec_storage
echo "Added secondary storage"
$cli update zone allocationstate=Enabled id=$zone_id
echo "Basic zone deloyment completed!"
|
Text processing is very easy, one can pipe the data and call their favourite text processors, be it awk, sed or grep.
Examples:
Code Block |
---|
> list accounts listall=true | grep ^id\ =
> list users | wc -l
> list routers | more
|
Automation can be done using shell or ! followed by shell commands. For example:
Code Block |
---|
> shell ls -lahi
> shell whoami
> shell ssh root@<ip>
> !date
> !ping google.com
|
For example if one has to create 100 users, one can execute cloudmonkey with args in a loop:
Code Block |
---|
> !for((i=0;i<100;i++)); do cloudmonkey create user username=user$i account=admin firstname=user$i lastname=user$i password=password$i email=user$i@domain.org; done;
|
There are two kinds of apis in CloudStack, one are blocking or synchronous and other one is non-blocking or asynchronous. By default for async apis like deploying a vm ec. are polled by cloudmonkey, one can set cloudmonkey not to poll or wait till the api is finished using:
Code Block |
---|
> set asyncblock false
|
This causes an async command in cloudmonkey to return a jobid which can be used to poll the completion of that command. This is particularly useful if one wants to starts a lot of VMs without having to wait for the commands to complete. The job can be polled using query async job command, like:
Code Block |
---|
> query asyncjobresult jobid=<job-id>
|
1. Reverse search
2. Bash/zsh completion
3. Documentation
...