dcos/tf_dcos_core

Name: tf_dcos_core

Owner: DC/OS

Description: A Terraform module to install, upgrade, and modify nodes for DC/OS clusters.

Created: 2018-03-07 00:15:14.0

Updated: 2018-05-21 17:32:04.0

Pushed: 2018-05-21 17:32:02.0

Homepage:

Size: 101

Language: Shell

GitHub Committers

UserMost Recent Commit# Commits

Other Committers

UserEmailMost Recent Commit# Commits

README

DC/OS terraform module

A Terraform module to install, upgrade, and modify nodes for DC/OS clusters in an automated fashion.

Module Input Variables

This long list of variables is required by DC/OS config.yaml for the bootstrap node. Any changes to DC/OS and its configs goes through a bootstrap node where its new configs are sourced from DC/OS master and agents nodes. By making changes to any of these flags allows for easier deployments that are supported by http://dcos.io and http://mesosphere.com official documentation. This gives birth for automated installs and upgrades with minimal commands.

Prerequisites Requirements

This tf_dcos_core module takes care of all the installation, modification, and upgrade instructions of DC/OS. Any prerequisites required to by tf_dcos_core will need to completed prior to this module being called. See documentation to see whats involved. It is required that the user running the commands executes the script as a super user.

Required Variables
Dependency Variables
Recommended Variables
Optional Variables
Usage
Bootstrap Node
eate DCOS Mesos Master Scripts to execute. Not all variables are required.
dule "dcos-bootstrap" {
source  = "./modules/dcos-core"
bootstrap_private_ip = "${aws_instance.bootstrap.private_ip}"
dcos_install_mode = "${var.state}"
dcos_version = "${var.dcos_version}"
role = "dcos-bootstrap"
dcos_bootstrap_port = "${var.custom_dcos_bootstrap_port}"
custom_dcos_download_path = "${var.custom_dcos_download_path}"
dcos_public_agent_list = "\n - ${join("\n - ", aws_instance.public-agent.*.private_ip)}"
dcos_audit_logging = "${var.dcos_audit_logging}"
dcos_auth_cookie_secure_flag = "${var.dcos_auth_cookie_secure_flag}"
dcos_aws_access_key_id = "${var.dcos_aws_access_key_id}"
dcos_aws_region = "${coalesce(var.dcos_aws_region, var.aws_region)}"
dcos_aws_secret_access_key = "${var.dcos_aws_secret_access_key}"
dcos_aws_template_storage_access_key_id = "${var.dcos_aws_template_storage_access_key_id}"
dcos_aws_template_storage_bucket = "${var.dcos_aws_template_storage_bucket}"
dcos_aws_template_storage_bucket_path = "${var.dcos_aws_template_storage_bucket_path}"
dcos_aws_template_storage_region_name = "${var.dcos_aws_template_storage_region_name}"
dcos_aws_template_storage_secret_access_key = "${var.dcos_aws_template_storage_secret_access_key}"
dcos_aws_template_upload = "${var.dcos_aws_template_upload}"
dcos_bouncer_expiration_auth_token_days = "${var.dcos_bouncer_expiration_auth_token_days}"
dcos_adminrouter_tls_1_0_enabled = "${var.dcos_adminrouter_tls_1_0_enabled}"
dcos_adminrouter_tls_1_1_enabled = "${var.dcos_adminrouter_tls_1_1_enabled}"
dcos_adminrouter_tls_1_2_enabled = "${var.dcos_adminrouter_tls_1_2_enabled}"
dcos_adminrouter_tls_cipher_suite= "${var.dcos_adminrouter_tls_cipher_suite}"
dcos_ca_certificate_chain_path = "${var.dcos_ca_certificate_chain_path}"
dcos_ca_certificate_key_path = "${var.dcos_ca_certificate_key_path}"
dcos_ca_certificate_path = "${var.dcos_ca_certificate_path}"
dcos_config= "${var.dcos_config}"
dcos_custom_checks = "${var.dcos_custom_checks}"
dcos_dns_bind_ip_blacklist = "${var.dcos_dns_bind_ip_blacklist}"
dcos_enable_docker_gc= "${var.dcos_enable_docker_gc}"
dcos_enable_gpu_isolation= "${var.dcos_enable_gpu_isolation}"
dcos_fault_domain_detect_contents= "${var.dcos_fault_domain_detect_contents}"
dcos_fault_domain_enabled= "${var.dcos_fault_domain_enabled}"
dcos_gpus_are_scarce = "${var.dcos_gpus_are_scarce}"
dcos_l4lb_enable_ipv6= "${var.dcos_l4lb_enable_ipv6}"
dcos_license_key_contents= "${var.dcos_license_key_contents}"
dcos_mesos_container_log_sink= "${var.dcos_mesos_container_log_sink}"
dcos_mesos_dns_set_truncate_bit= "${var.dcos_mesos_dns_set_truncate_bit}"
dcos_mesos_max_completed_tasks_per_framework = "${var.dcos_mesos_max_completed_tasks_per_framework}"
dcos_ucr_default_bridge_subnet = "${var.dcos_ucr_default_bridge_subnet}"
dcos_check_time = "${var.dcos_check_time}"
dcos_cluster_docker_credentials = "${var.dcos_cluster_docker_credentials}"
dcos_cluster_docker_credentials_dcos_owned = "${var.dcos_cluster_docker_credentials_dcos_owned}"
dcos_cluster_docker_credentials_enabled = "${var.dcos_cluster_docker_credentials_enabled}"
dcos_cluster_docker_credentials_write_to_etc = "${var.dcos_cluster_docker_credentials_write_to_etc}"
dcos_cluster_name  = "${coalesce(var.dcos_cluster_name, data.template_file.cluster-name.rendered)}"
dcos_customer_key = "${var.dcos_customer_key}"
dcos_dns_search = "${var.dcos_dns_search}"
dcos_dns_forward_zones = "${var.dcos_dns_forward_zones}"
dcos_docker_remove_delay = "${var.dcos_docker_remove_delay}"
dcos_exhibitor_address = "${aws_elb.internal-master-elb.dns_name}"
dcos_exhibitor_azure_account_key = "${var.dcos_exhibitor_azure_account_key}"
dcos_exhibitor_azure_account_name = "${var.dcos_exhibitor_azure_account_name}"
dcos_exhibitor_azure_prefix = "${var.dcos_exhibitor_azure_prefix}"
dcos_exhibitor_explicit_keys = "${var.dcos_exhibitor_explicit_keys}"
dcos_exhibitor_storage_backend = "${var.dcos_exhibitor_storage_backend}"
dcos_exhibitor_zk_hosts = "${var.dcos_exhibitor_zk_hosts}"
dcos_exhibitor_zk_path = "${var.dcos_exhibitor_zk_path}"
dcos_gc_delay = "${var.dcos_gc_delay}"
dcos_http_proxy = "${var.dcos_http_proxy}"
dcos_https_proxy = "${var.dcos_https_proxy}"
dcos_log_directory = "${var.dcos_log_directory}"
dcos_master_discovery = "${var.dcos_master_discovery}"
dcos_master_dns_bindall = "${var.dcos_master_dns_bindall}"
dcos_master_list = "\n - ${join("\n - ", aws_instance.master.*.private_ip)}"
dcos_no_proxy = "${var.dcos_no_proxy}"
dcos_num_masters = "${var.num_of_masters}"
dcos_oauth_enabled = "${var.dcos_oauth_enabled}"
dcos_overlay_config_attempts = "${var.dcos_overlay_config_attempts}"
dcos_overlay_enable = "${var.dcos_overlay_enable}"
dcos_overlay_mtu = "${var.dcos_overlay_mtu}"
dcos_overlay_network = "${var.dcos_overlay_network}"
dcos_process_timeout = "${var.dcos_process_timeout}"
dcos_previous_version = "${var.dcos_previous_version}"
dcos_agent_list = "\n - ${join("\n - ", aws_instance.agent.*.private_ip)}"
dcos_resolvers  = "\n - ${join("\n - ", var.dcos_resolvers)}"
dcos_rexray_config_filename = "${var.dcos_rexray_config_filename}"
dcos_rexray_config_method = "${var.dcos_rexray_config_method}"
dcos_s3_bucket = "${coalesce(var.dcos_s3_bucket, aws_s3_bucket.dcos_bucket.id)}"
dcos_s3_prefix = "${coalesce(var.dcos_s3_prefix, aws_s3_bucket.dcos_bucket.id)}"
dcos_security  = "${var.dcos_security}"
dcos_superuser_password_hash = "${var.dcos_superuser_password_hash}"
dcos_superuser_username = "${var.dcos_superuser_username}"
dcos_telemetry_enabled = "${var.dcos_telemetry_enabled}"
dcos_use_proxy = "${var.dcos_use_proxy}"
dcos_zk_agent_credentials = "${var.dcos_zk_agent_credentials}"
dcos_zk_master_credentials = "${var.dcos_zk_master_credentials}"
dcos_zk_super_credentials = "${var.dcos_zk_super_credentials}"
dcos_cluster_docker_registry_url = "${var.dcos_cluster_docker_registry_url}"
dcos_rexray_config = "${var.dcos_rexray_config}"
dcos_ip_detect_public_contents = "${var.dcos_ip_detect_public_contents}"
dcos_ip_detect_contents = "${var.dcos_ip_detect_contents}"
dcos_enable_docker_gc = "${var.dcos_enable_docker_gc}"
dcos_staged_package_storage_uri = "${var.dcos_staged_package_storage_uri}"
dcos_package_storage_uri = "${var.dcos_package_storage_uri}"


ource "null_resource" "bootstrap" {
Changes to any instance of the cluster requires re-provisioning. Not all variables are required.
iggers {
cluster_instance_ids = "${aws_instance.bootstrap.id}"
dcos_version = "${var.dcos_version}"
dcos_security = "${var.dcos_security}"
num_of_masters = "${var.num_of_masters}"
dcos_audit_logging = "${var.dcos_audit_logging}"
dcos_auth_cookie_secure_flag = "${var.dcos_auth_cookie_secure_flag}"
dcos_aws_access_key_id = "${var.dcos_aws_access_key_id}"
dcos_aws_region = "${coalesce(var.dcos_aws_region, var.aws_region)}"
dcos_aws_secret_access_key = "${var.dcos_aws_secret_access_key}"
dcos_aws_template_storage_access_key_id = "${var.dcos_aws_template_storage_access_key_id}"
dcos_aws_template_storage_bucket = "${var.dcos_aws_template_storage_bucket}"
dcos_aws_template_storage_bucket_path = "${var.dcos_aws_template_storage_bucket_path}"
dcos_aws_template_storage_region_name = "${var.dcos_aws_template_storage_region_name}"
dcos_aws_template_storage_secret_access_key = "${var.dcos_aws_template_storage_secret_access_key}"
dcos_aws_template_upload = "${var.dcos_aws_template_upload}"
dcos_bouncer_expiration_auth_token_days = "${var.dcos_bouncer_expiration_auth_token_days}"
dcos_check_time = "${var.dcos_check_time}"
dcos_cluster_docker_credentials = "${var.dcos_cluster_docker_credentials}"
dcos_cluster_docker_credentials_dcos_owned = "${var.dcos_cluster_docker_credentials_dcos_owned}"
dcos_cluster_docker_credentials_enabled = "${var.dcos_cluster_docker_credentials_enabled}"
dcos_cluster_docker_credentials_write_to_etc = "${var.dcos_cluster_docker_credentials_write_to_etc}"
dcos_customer_key = "${var.dcos_customer_key}"
dcos_dns_search = "${var.dcos_dns_search}"
dcos_dns_forward_zones = "${var.dcos_dns_forward_zones}"
dcos_docker_remove_delay = "${var.dcos_docker_remove_delay}"
dcos_exhibitor_address = "${aws_elb.internal-master-elb.dns_name}"
dcos_exhibitor_azure_account_key = "${var.dcos_exhibitor_azure_account_key}"
dcos_exhibitor_azure_account_name = "${var.dcos_exhibitor_azure_account_name}"
dcos_exhibitor_azure_prefix = "${var.dcos_exhibitor_azure_prefix}"
dcos_exhibitor_explicit_keys = "${var.dcos_exhibitor_explicit_keys}"
dcos_exhibitor_storage_backend = "${var.dcos_exhibitor_storage_backend}"
dcos_exhibitor_zk_hosts = "${var.dcos_exhibitor_zk_hosts}"
dcos_exhibitor_zk_path = "${var.dcos_exhibitor_zk_path}"
dcos_adminrouter_tls_1_0_enabled = "${var.dcos_adminrouter_tls_1_0_enabled}"
dcos_adminrouter_tls_1_1_enabled = "${var.dcos_adminrouter_tls_1_1_enabled}"
dcos_adminrouter_tls_1_2_enabled = "${var.dcos_adminrouter_tls_1_2_enabled}"
dcos_adminrouter_tls_cipher_suite= "${var.dcos_adminrouter_tls_cipher_suite}"
dcos_ca_certificate_chain_path = "${var.dcos_ca_certificate_chain_path}"
dcos_ca_certificate_key_path = "${var.dcos_ca_certificate_key_path}"
dcos_ca_certificate_path = "${var.dcos_ca_certificate_path}"
dcos_config= "${var.dcos_config}"
dcos_custom_checks = "${var.dcos_custom_checks}"
dcos_cluster_name  = "${coalesce(var.dcos_cluster_name, data.template_file.cluster-name.rendered)}"
dcos_dns_bind_ip_blacklist = "${var.dcos_dns_bind_ip_blacklist}"
dcos_enable_docker_gc= "${var.dcos_enable_docker_gc}"
dcos_enable_gpu_isolation= "${var.dcos_enable_gpu_isolation}"
dcos_fault_domain_detect_contents= "${var.dcos_fault_domain_detect_contents}"
dcos_fault_domain_enabled= "${var.dcos_fault_domain_enabled}"
dcos_gpus_are_scarce = "${var.dcos_gpus_are_scarce}"
dcos_l4lb_enable_ipv6= "${var.dcos_l4lb_enable_ipv6}"
dcos_license_key_contents= "${var.dcos_license_key_contents}"
dcos_mesos_container_log_sink= "${var.dcos_mesos_container_log_sink}"
dcos_mesos_dns_set_truncate_bit= "${var.dcos_mesos_dns_set_truncate_bit}"
dcos_mesos_max_completed_tasks_per_framework = "${var.dcos_mesos_max_completed_tasks_per_framework}"
dcos_ucr_default_bridge_subnet = "${var.dcos_ucr_default_bridge_subnet}"
dcos_gc_delay = "${var.dcos_gc_delay}"
dcos_http_proxy = "${var.dcos_http_proxy}"
dcos_https_proxy = "${var.dcos_https_proxy}"
dcos_log_directory = "${var.dcos_log_directory}"
dcos_master_discovery = "${var.dcos_master_discovery}"
dcos_master_dns_bindall = "${var.dcos_master_dns_bindall}"
dcos_no_proxy = "${var.dcos_no_proxy}"
dcos_num_masters = "${var.num_of_masters}"
dcos_oauth_enabled = "${var.dcos_oauth_enabled}"
dcos_overlay_config_attempts = "${var.dcos_overlay_config_attempts}"
dcos_overlay_enable = "${var.dcos_overlay_enable}"
dcos_overlay_mtu = "${var.dcos_overlay_mtu}"
dcos_overlay_network = "${var.dcos_overlay_network}"
dcos_process_timeout = "${var.dcos_process_timeout}"
dcos_previous_version = "${var.dcos_previous_version}"
dcos_resolvers  = "\n - ${join("\n - ", var.dcos_resolvers)}"
dcos_rexray_config_filename = "${var.dcos_rexray_config_filename}"
dcos_rexray_config_method = "${var.dcos_rexray_config_method}"
dcos_s3_bucket = "${coalesce(var.dcos_s3_bucket, aws_s3_bucket.dcos_bucket.id)}"
dcos_s3_prefix = "${coalesce(var.dcos_s3_prefix, aws_s3_bucket.dcos_bucket.id)}"
dcos_security  = "${var.dcos_security}"
dcos_superuser_password_hash = "${var.dcos_superuser_password_hash}"
dcos_superuser_username = "${var.dcos_superuser_username}"
dcos_telemetry_enabled = "${var.dcos_telemetry_enabled}"
dcos_use_proxy = "${var.dcos_use_proxy}"
dcos_zk_agent_credentials = "${var.dcos_zk_agent_credentials}"
dcos_zk_master_credentials = "${var.dcos_zk_master_credentials}"
dcos_zk_super_credentials = "${var.dcos_zk_super_credentials}"
dcos_cluster_docker_registry_url = "${var.dcos_cluster_docker_registry_url}"
dcos_rexray_config = "${var.dcos_rexray_config}"
dcos_ip_detect_public_contents = "${var.dcos_ip_detect_public_contents}"
dcos_ip_detect_contents = "${var.dcos_ip_detect_contents}"
dcos_enable_docker_gc = "${var.dcos_enable_docker_gc}"
dcos_staged_package_storage_uri = "${var.dcos_staged_package_storage_uri}"
dcos_package_storage_uri = "${var.dcos_package_storage_uri}"

nnection {
host = "${element(aws_instance.bootstrap.*.public_ip, 0)}"
user = "${module.aws-tested-oses.user}"


Generate and upload bootstrap script to node
ovisioner "file" {
content     = "${module.dcos-bootstrap.script}"
destination = "run.sh"


Install Bootstrap Script
ovisioner "remote-exec" {
inline = [
  "sudo chmod +x run.sh",
  "sudo ./run.sh",
]


Master Nodes
eate DCOS Mesos Master Scripts to execute
le "dcos-mesos-master" {
urce               = "github.com/bernadinm/tf_dcos_core"
otstrap_private_ip = "${aws_instance.bootstrap.private_ip}"
os_install_mode    = "${var.state}"
os_version         = "${var.dcos_version}"
os_skip_checks     = "${var.dcos_skip_checks}"
le                 = "dcos-mesos-master"


urce "null_resource" "master" {
iggers {
cluster_instance_ids = "${null_resource.bootstrap.id}"
current_ec2_instance_id = "${aws_instance.master.*.id[count.index]}"

nnection {
host = "${element(aws_instance.master.*.public_ip, count.index)}"
user = "${module.aws-tested-oses.user}"

unt = "${var.num_of_masters}"

Generate and upload Master script to node
ovisioner "file" {
content     = "${module.dcos-mesos-master.script}"
destination = "run.sh"


Wait for bootstrapnode to be ready
ovisioner "remote-exec" {
inline = [
 "until $(curl --output /dev/null --silent --head --fail http://${aws_instance.bootstrap.private_ip}/dcos_install.sh); do printf 'waiting for bootstrap node to serve...'; sleep 20; done"
]


Install Master Script
ovisioner "remote-exec" {
inline = [
  "sudo chmod +x run.sh",
  "sudo ./run.sh",
]


Agents

Use this to make any type of Mesos agent you desire. In this example below is a public agent. You can have gpu agents, private agents, etc. They will be either use the dcos-mesos-agent or dcos-mesos-agent-public role.

eate DCOS Mesos Public Agent Scripts to execute
le "dcos-mesos-agent-public" {
urce               = "github.com/bernadinm/tf_dcos_core"
otstrap_private_ip = "${aws_instance.bootstrap.private_ip}"
os_install_mode    = "${var.state}"
os_version         = "${var.dcos_version}"
os_skip_checks     = "${var.dcos_skip_checks}"
le                 = "dcos-mesos-agent-public"


ecute generated script on agent
urce "null_resource" "agent" {
iggers {
cluster_instance_ids = "${null_resource.bootstrap.id}"
current_ec2_instance_id = "${aws_instance.agent.*.id[count.index]}"

nnection {
host = "${element(aws_instance.agent.*.public_ip, count.index)}"
user = "${module.aws-tested-oses.user}"

unt = "${var.num_of_private_agents}"

Generate and upload Agent script to node
ovisioner "file" {
content     = "${module.dcos-mesos-agent.script}"
destination = "run.sh"


Wait for bootstrapnode to be ready
ovisioner "remote-exec" {
inline = [
 "until $(curl --output /dev/null --silent --head --fail http://${aws_instance.bootstrap.private_ip}/dcos_install.sh); do printf 'waiting for bootstrap node to serve...'; sleep 20; done"
]


Install Slave Node
ovisioner "remote-exec" {
inline = [
  "sudo chmod +x run.sh",
  "sudo ./run.sh",
]


Outputs

Authors

Originally created and maintained by Miguel Bernadin.

License

Apache 2 Licensed. See LICENSE for full details.


This work is supported by the National Institutes of Health's National Center for Advancing Translational Sciences, Grant Number U24TR002306. This work is solely the responsibility of the creators and does not necessarily represent the official views of the National Institutes of Health.