Hi Juju,

I'm curious how you run playbook from charms?

Here are two approaches I have done so far. It gets me going. But I'm
wondering whether there is a better way to do this. Comments?

------------------------------------------------------------------

Previously I have been using charms.ansible
<https://github.com/chuckbutler/charms.ansible>. But I always felt
calling CLI isn't as flexible as using a programming API. Inspired by
this blog
<https://serversforhackers.com/running-ansible-2-programmatically>, I
created a new layer-ansible that takes advantage of the Ansible Python
API <http://docs.ansible.com/ansible/dev_guide/developing_api.html>.

I have posted the code here <https://github.com/lenovo/charms.ansible>,
which is forked from original one and two methods are completely
compatible (two code bases don't really overlap). By pointing LAYER_PATH
to this clone, I can use either method to run playbook. I kept both in
one repo for convenience.

To use it in charm is pretty simple (see details
<https://github.com/lenovo/charms.ansible#charm-integration>):

1.

   Include layer. In|layer.yaml|:

   includes:
      -'layer:basic'
      -'layer:ansible'

2.

   Create a|playbooks|folder and place /playbooks here:

   |. ├── config.yaml ├── icon.svg ├── layer.yaml ├── metadata.yaml ├──
   playbooks │   └── test.yaml └── reactive └── solution.py |

3.

   Using|config.yaml|to pass in playbook for each action that is
   defined in the charm states. For example, define|test.yaml|for an
   action in|state-0|:

   options:
      state-0-playbook:
        type:string
        default:"test.yaml"
        description:"Playbook for..."

4.

   Define the playbook. For example, a/hello world/that will create a
   file `/tmp/testfile.txt'.

   -name:This is a hello-world example
      hosts:127.0.0.1
      tasks:
      -name:Create a file called '/tmp/testfile.txt' with the content 'hello 
world'.
        copy:content="hello world\n" dest=/tmp/testfile.txt
        tags:
          -sth

   Note that|tags|value|sth|must match playbook run call (see below).

5.

   In charm|.py|file,|from charms.layer.task import Runner|, then
   in|state-0|to call given playbook:

   playbook=  config['state-0-playbook']
   runner=  Runner(
        tags  =  'sth',# <-- must match the tag in the playbook
        connection  =  'local',# <-- must be "local"
        hostnames  =  '127.0.0.1',# <-- assuming execution in localhost
        playbooks  =  [playbook],
        private_key_file  =  '',
        run_data  =  {},
        become_pass  =  '',
        verbosity  =  0
   )
   stats=  runner.run()

--
Feng xia
Engineer
Lenovo USA

Phone: 5088011794
fx...@lenovo.com

Lenovo.com
Twitter | Facebook | Instagram | Blogs | Forums

-- 
Juju mailing list
Juju@lists.ubuntu.com
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/juju

Reply via email to