1
1
mirror of https://github.com/adammck/terraform-inventory synced 2024-11-26 07:43:46 +01:00

Showing Terraform outputs as "global" variables in the Ansible dynamic inventory json.

This commit is contained in:
Lazar Travica 2016-02-16 12:12:49 +01:00
parent 229202334c
commit 6ead28eee6
4 changed files with 55 additions and 6 deletions

15
cli.go

@ -7,19 +7,26 @@ import (
) )
func cmdList(stdout io.Writer, stderr io.Writer, s *state) int { func cmdList(stdout io.Writer, stderr io.Writer, s *state) int {
groups := make(map[string][]string, 0) groups := make(map[string]interface{}, 0)
for _, res := range s.resources() { for _, res := range s.resources() {
for _, grp := range res.Groups() { for _, grp := range res.Groups() {
tmpGroup := []string{}
_, ok := groups[grp] _, ok := groups[grp]
if !ok { if ok {
groups[grp] = []string{} tmpGroup = groups[grp].([]string)
} }
groups[grp] = append(groups[grp], res.Address()) tmpGroup = append(tmpGroup, res.Address())
groups[grp] = tmpGroup
} }
} }
groups["all"] = make(map[string]string, 0)
for _, out := range s.outputs() {
groups["all"].(map[string]string)[out.keyName] = out.value
}
return output(stdout, stderr, groups) return output(stdout, stderr, groups)
} }

@ -6,7 +6,9 @@
"path": [ "path": [
"root" "root"
], ],
"outputs": {}, "outputs": {
"datacenter": "mydc"
},
"resources": { "resources": {
"aws_instance.alpha.0": { "aws_instance.alpha.0": {
"type": "aws_instance", "type": "aws_instance",

26
output.go Normal file

@ -0,0 +1,26 @@
package main
import (
"fmt"
)
type Output struct {
// The keyName and value of the output
keyName string
value string
}
func NewOutput(keyName string, value string) (*Output, error) {
// TODO: Warn instead of silently ignore error?
if len(keyName) == 0 {
return nil, fmt.Errorf("couldn't parse keyName: %s", keyName)
}
return &Output{
keyName: keyName,
value: value,
}, nil
}

@ -29,6 +29,20 @@ func (s *state) read(stateFile io.Reader) error {
return nil return nil
} }
// outputs returns a slice of the Outputs found in the statefile.
func (s *state) outputs() []*Output {
inst := make([]*Output, 0)
for _, m := range s.Modules {
for k, v := range m.Outputs {
o, _ := NewOutput(k, v)
inst = append(inst, o)
}
}
return inst
}
// resources returns a slice of the Resources found in the statefile. // resources returns a slice of the Resources found in the statefile.
func (s *state) resources() []*Resource { func (s *state) resources() []*Resource {
inst := make([]*Resource, 0) inst := make([]*Resource, 0)
@ -43,7 +57,6 @@ func (s *state) resources() []*Resource {
if err != nil { if err != nil {
continue continue
} }
if r.IsSupported() { if r.IsSupported() {
inst = append(inst, r) inst = append(inst, r)
} }
@ -55,6 +68,7 @@ func (s *state) resources() []*Resource {
type moduleState struct { type moduleState struct {
ResourceStates map[string]resourceState `json:"resources"` ResourceStates map[string]resourceState `json:"resources"`
Outputs map[string]string `json:"outputs"`
} }
// resourceKeys returns a sorted slice of the key names of the resources in this // resourceKeys returns a sorted slice of the key names of the resources in this