class Terrafying::Components::Ignition

Constants

FILE_REQUIRED_KEYS
UNIT_REQUIRED_KEYS

Public Class Methods

container_unit(name, image, options = {}) click to toggle source
# File lib/terrafying/components/ignition.rb, line 12
      def self.container_unit(name, image, options = {})
        options = {
          volumes: [],
          environment_variables: [],
          arguments: [],
          ports: [],
          require_units: [],
          host_networking: false,
          privileged: false
        }.merge(options)

        if options[:require_units].count > 0
          require_units = options[:require_units].join(' ')
          require = <<~EOF
            After=#{require_units}
            Requires=#{require_units}
          EOF
        end

        docker_options = []

        docker_options += options[:environment_variables].map { |var| "-e #{var}" }
        docker_options += options[:volumes].map { |volume| "-v #{volume}" }
        docker_options += options[:ports].map { |port| "-p #{port}:#{port}" }

        docker_options << '--net=host' if options[:host_networking]

        docker_options << '--privileged' if options[:privileged]

        docker_options_str = " \\\n" + docker_options.join(" \\\n")

        if options[:arguments].count > 0
          arguments = " \\\n" + options[:arguments].join(" \\\n")
        end

        {
          name: "#{name}.service",
          contents: <<~EOF
            [Install]
            WantedBy=multi-user.target

            [Unit]
            Description=#{name}
            #{require}

            [Service]
            ExecStartPre=-/usr/bin/docker rm -f #{name}
            ExecStart=/usr/bin/docker run --name #{name} #{docker_options_str} \
            #{image} #{arguments}
            Restart=always
            RestartSec=30

          EOF
        }
      end
generate(options = {}) click to toggle source
# File lib/terrafying/components/ignition.rb, line 68
def self.generate(options = {})
  options = {
    keypairs: [],
    volumes: [],
    files: [],
    units: [],
    users: [],
    networkd_units: [],
    ssh_group: 'cloud',
    disable_update_engine: false,
    region: Terrafying::Generator.aws.region
  }.merge(options)

  unless options[:units].all? { |u| UNIT_REQUIRED_KEYS.all? { |key| u.key?(key) } }
    raise "All units require the following keys: #{UNIT_REQUIRED_KEYS}"
  end

  unless options[:units].all? { |u| u.key?(:contents) || u.key?(:dropins) || u.fetch(:enabled, true) == false || u.fetch(:mask, false) == true }
    raise 'All enabled unmasked units have to have contents and/or dropins'
  end

  unless options[:files].all? { |f| FILE_REQUIRED_KEYS.all? { |key| f.key?(key) } }
    raise "All files require the following keys: #{FILE_REQUIRED_KEYS}"
  end

  options[:cas] = options[:keypairs].map { |kp| kp[:ca] }.compact.sort.uniq

  erb_path = File.join(File.dirname(__FILE__), 'templates/ignition.yaml')
  erb = ERB.new(IO.read(erb_path))

  yaml = erb.result(OpenStruct.new(options).instance_eval { binding })

  Terrafying::Util.to_ignition(yaml)
end