roster

command module
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 30, 2015 License: BSD-3-Clause Imports: 23 Imported by: 0

README

Roster is a tool for working transforming Terraform state information into
other forms (it's original calling was as an Ansible dynamic inventory
provider).

It uses terraform routines to work with the state information, which seems
better than reverse engineering the state files themselves. But, these
routines are not mainstream, so we'll have to see what happens going
forward. More info in [terraform issue
3405](https://github.com/hashicorp/terraform/issues/3405).

It uses Go templates to generate it's output. One can dump out these
templates, e.g.:

    $ ./roster dump-template /templates/dynamic-inventory

and see what it's doing. One can also supply one's own templates

    $ ./roster execute-template myTemplate.txt

The input to the template is a slice of *instanceInfo. There are two helper
functions, groups and hostvars that make templates less nasty by
transforming the instanceInfo into slices of Group and HostVar,
respectively. Slices are used so that it is easier to avoid trailing commas
when generating JSON, using [this
technique]()http://stackoverflow.com/questions/21305865/golang-separating-items-with-comma-in-template).

Roster parses state data for instances from:

      OpenStack
      - the instance name is used as the Name
      - the access_ip_v4 is used as the Address
      - host_vars and groups can be specified in the resource configuration
        metadata section like so:

          metadata {
              ansible_groups = "foo,  bar"
         			ansible_host_vars = "color=red, importance=high"
          }

      parsing those strings is very unsophisticated, I'm waiting for better
      use cases before I get fancy.

      DigitalOcean
      - the name is used as the Name
      - the ipv4address is used as the Address
      - there is no support for groups or hostvars

      Cloudstack
      - the name is used as the Name
      - the ipaddress is used as the address
      - there is no support for groups or hostvars

      AWS
      - I have preliminary support for AWS instances, BUT
      - Every instance is named "moose", I can't figure out what info to use
        as the Name.
      - If an instance has a public_ip, that is used as the Address, if not
        and it has a private_ip then that is used.

    Usage:

      These two invocations support the standard Ansible dynamic
      inventory calling conventions, returning a dynamic inventory and
      an (empty) host specific inventory as required by the
      specification.

      $ ./roster --list
      $ ./roster --host MyHostName

      Beyond that:

      $ ./roster --help
      usage: roster [--version] [--help] <command> [<args>]

      Available commands are:
          dump-template       Dump one of roster's built in templates.
          execute-template    Execute a user supplied template.
          hosts               Generate an /etc/hosts fragment for the Terraform instances
          inventory           Generate an Ansible dynamic inventory

      $ ./roster inventory --help
      Usage of inventory:
        -dir string
          	The path to the terraform directory (default ".")
        -host string
          	Generate a host-specific inventory for this host.
        -list
          	Generate a full inventory (the default behavior).
      $ ./roster hosts --help
      Usage of inventory:
        -dir string
          	The path to the terraform directory (default ".")

      $ ./roster dump-template --help
      Usage of inventory:
        -dir string
          	The path to the terraform directory (default ".")
        -template string
          	The name of the template to dump.

      $ ./roster dump-template --help
      Usage of inventory:
        -dir string
          	The path to the terraform directory (default ".")
        -template string
          	The name of the template to dump: /templates/{dynamic-inventory,etc-hosts}.

      $ ./roster execute-template --help
      Usage of inventory:
        -dir string
          	The path to the terraform directory (default ".")
        -template string
          	The filename of the template to dump.

Documentation

Overview

Roster is a tool for working transforming Terraform state information into other forms (it's original calling was as an Ansible dynamic inventory provider).

It uses terraform routines to work with the state information, which seems better than reverse engineering the state files themselves. But, these routines are not mainstream, so we'll have to see what happens going forward. More info in [terraform issue 3405](https://github.com/hashicorp/terraform/issues/3405).

It uses Go templates to generate it's output. One can dump out these templates, e.g.:

$ ./roster dump-template /templates/dynamic-inventory

and see what it's doing. One can also supply one's own templates

$ ./roster execute-template myTemplate.txt

The input to the template is a slice of *instanceInfo. There are two helper functions, groups and hostvars that make templates less nasty by transforming the instanceInfo into slices of Group and HostVar, respectively. Slices are used so that it is easier to avoid trailing commas when generating JSON, using [this technique]()http://stackoverflow.com/questions/21305865/golang-separating-items-with-comma-in-template).

Roster parses state data for instances from:

  OpenStack
  - the instance name is used as the Name
  - the access_ip_v4 is used as the Address
  - host_vars and groups can be specified in the resource configuration
    metadata section like so:

      metadata {
          ansible_groups = "foo,  bar"
     			ansible_host_vars = "color=red, importance=high"
      }

  parsing those strings is very unsophisticated, I'm waiting for better
  use cases before I get fancy.

  DigitalOcean
  - the name is used as the Name
  - the ipv4address is used as the Address
  - there is no support for groups or hostvars

  Cloudstack
  - the name is used as the Name
  - the ipaddress is used as the address
  - there is no support for groups or hostvars

  AWS
  - I have preliminary support for AWS instances, BUT
  - Every instance is named "moose", I can't figure out what info to use
    as the Name.
  - If an instance has a public_ip, that is used as the Address, if not
    and it has a private_ip then that is used.

Usage:

  These two invocations support the standard Ansible dynamic
  inventory calling conventions, returning a dynamic inventory and
  an (empty) host specific inventory as required by the
  specification.

  $ ./roster --list
  $ ./roster --host MyHostName

  Beyond that:

  $ ./roster --help
  usage: roster [--version] [--help] <command> [<args>]

  Available commands are:
      dump-template       Dump one of roster's built in templates.
      execute-template    Execute a user supplied template.
      hosts               Generate an /etc/hosts fragment for the Terraform instances
      inventory           Generate an Ansible dynamic inventory

  $ ./roster inventory --help
  Usage of inventory:
    -dir string
      	The path to the terraform directory (default ".")
    -host string
      	Generate a host-specific inventory for this host.
    -list
      	Generate a full inventory (the default behavior).
  $ ./roster hosts --help
  Usage of inventory:
    -dir string
      	The path to the terraform directory (default ".")

  $ ./roster dump-template --help
  Usage of inventory:
    -dir string
      	The path to the terraform directory (default ".")
    -template string
      	The name of the template to dump.

  $ ./roster dump-template --help
  Usage of inventory:
    -dir string
      	The path to the terraform directory (default ".")
    -template string
      	The name of the template to dump: /templates/{dynamic-inventory,etc-hosts}.

  $ ./roster execute-template --help
  Usage of inventory:
    -dir string
      	The path to the terraform directory (default ".")
    -template string
      	The filename of the template to dump.

Notes

Bugs

  • parse_aws_instance doesn't do anything sensible with for an instance name. What to do?

  • figure out a better way to handle "singleton groups"

Directories

Path Synopsis
Package inventory contains types and functions to manage an Ansible inventory (the bits that roster uses, for now).
Package inventory contains types and functions to manage an Ansible inventory (the bits that roster uses, for now).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL