module Tfctl::Generator

Public Instance Methods

make(account:, config:) click to toggle source
# File lib/tfctl/generator.rb, line 17
def make(account:, config:)
    target_dir = "#{PROJECT_ROOT}/.tfctl/#{config[:config_name]}/#{account[:name]}"
    tf_state_prefix = config.fetch(:tf_state_prefix, '').delete_suffix('/')
    tf_version = config.fetch(:tf_required_version, '>= 0.12.29')
    aws_provider_version = config.fetch(:aws_provider_version, '>= 2.14')

    FileUtils.mkdir_p target_dir

    terraform_block = {
        'terraform' => {
            'required_version'   => tf_version,
            'required_providers' => {
                'aws' => {
                    'source'  => 'hashicorp/aws',
                    'version' => aws_provider_version,
                },
            },
            'backend'            => {
                's3' => {
                    'bucket'         => config[:tf_state_bucket],
                    'key'            => [tf_state_prefix, account[:name], 'tfstate'].join('/').delete_prefix('/'),
                    'region'         => config[:tf_state_region],
                    'role_arn'       => config[:tf_state_role_arn],
                    'dynamodb_table' => config[:tf_state_dynamodb_table],
                    'encrypt'        => 'true',
                },
            },
        },
    }
    write_json_block("#{target_dir}/terraform.tf.json", terraform_block)

    provider_block = {
        'provider' => {
            'aws' => {
                'region'       => account[:region],
                'assume_role'  => {
                    'role_arn' => "arn:aws:iam::#{account[:id]}:role/#{account[:tf_execution_role]}",
                },
                'default_tags' => {
                    'tags' => config.fetch(:default_tags, {}),
                },
            },
        },
    }
    write_json_block("#{target_dir}/provider.tf.json", provider_block)

    vars_block = {
        'variable' => {
            'config' => {
                'type' => 'string',
            },
        },
    }
    write_json_block("#{target_dir}/vars.tf.json", vars_block)

    # config is passed to profiles as a json encoded string.  It can be
    # decoded in profile using jsondecode() function.
    config_block = { 'config' => config.to_json }
    write_json_block("#{target_dir}/config.auto.tfvars.json", config_block)

    FileUtils.rm Dir.glob("#{target_dir}/profile_*.tf.json")

    account[:profiles].each do |profile|
        profile_block = {
            'module' => {
                profile => {
                    'source'    => "../../../profiles/#{profile}",
                    'config'    => '${var.config}',
                    'providers' => {
                        'aws' => 'aws',
                    },
                },
            },
        }

        write_json_block("#{target_dir}/profile_#{profile}.tf.json", profile_block)
    end

end
write_json_block(path, block) click to toggle source
# File lib/tfctl/generator.rb, line 11
def write_json_block(path, block)
    File.open(path, 'w') do |f|
        f.write("#{JSON.pretty_generate(block)}\n")
    end
end