Compare commits
	
		
			1 Commits
		
	
	
		
			devel
			...
			b6895bd3e7
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| b6895bd3e7 | 
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -7,5 +7,3 @@ playbooks/testing.yml | ||||
| .venv/ | ||||
| .ansible/ | ||||
| .tox/ | ||||
| .terraform/ | ||||
| .terraform.lock.* | ||||
|   | ||||
| @@ -32,11 +32,3 @@ repos: | ||||
|           - "--wrap=90" | ||||
|         types: | ||||
|           - markdown | ||||
|  | ||||
|       - id: terraform | ||||
|         name: terraform format | ||||
|         entry: terraform | ||||
|         language: system | ||||
|         args: | ||||
|           - fmt | ||||
|         files: ".*\\.tf$" | ||||
|   | ||||
| @@ -1,166 +0,0 @@ | ||||
| --- | ||||
| workstation: | ||||
|   hosts: | ||||
|     voyager: | ||||
|       skylab_description: Personal Workstation | ||||
|       skylab_hostname: voyager.skylab.enp.one | ||||
|       skylab_targets: [workstation] | ||||
|  | ||||
| en1: | ||||
|   vars: | ||||
|     skylab_location: Newton MA | ||||
|     skylab_dashboard: info.en1.local | ||||
|     # gross hack for now, will be refactored later | ||||
|     _skylab_adguard_nat_rule: 9 | ||||
|  | ||||
|   hosts: | ||||
|     core: | ||||
|       ansible_host: 10.42.101.1 | ||||
|       ansible_port: 4242 | ||||
|       ansible_network_os: edgeos | ||||
|       skylab_description: EN1 Core Router | ||||
|  | ||||
|     iridium: | ||||
|       ansible_host: 10.42.101.200 | ||||
|       skylab_description: Local Monitor Node | ||||
|       skylab_hostname: iridium.skylab.enp.one | ||||
|       skylab_targets: [network] | ||||
|       skylab_networking: | ||||
|         enp4s0: | ||||
|           firewall: internal | ||||
|           dhcp: false | ||||
|           gateway: 10.42.101.1/24 | ||||
|           dns: | ||||
|             - 10.42.101.1 | ||||
|           addresses: | ||||
|             - 10.42.101.200/24 | ||||
|  | ||||
|   children: | ||||
|  | ||||
|     cluster: | ||||
|       vars: | ||||
|         skylab_targets: [cluster, datastore] | ||||
|         skylab_compose_version: 3.8 | ||||
|         skylab_compose_dir: "{{ skylab_state_dir }}/compose" | ||||
|  | ||||
|       hosts: | ||||
|         pegasus:  # jupiter | ||||
|           ansible_host: 10.42.101.100 | ||||
|           skylab_hostname: pegasus.skylab.enp.one | ||||
|           skylab_legacy_names: | ||||
|             - jupiter.net.enp.one | ||||
|             - jupiter.svr.local | ||||
|           skylab_description: Arbiter Node | ||||
|           skylab_cluster: | ||||
|             address: | ||||
|               access: 10.42.101.10/24 | ||||
|               internal: 192.168.42.10/24 | ||||
|             interface: | ||||
|               access: bond0 | ||||
|               internal: bond0.99 | ||||
|           skylab_datastore_device: sdb | ||||
|           skylab_networking: | ||||
|             eno1: | ||||
|               bond: bond0 | ||||
|             eno2: | ||||
|               bond: bond0 | ||||
|             bond0: | ||||
|               device: bond | ||||
|               firewall: internal | ||||
|               gateway: 10.42.101.1/24 | ||||
|               dns: | ||||
|                 - 10.42.101.1 | ||||
|               addresses: | ||||
|                 - 10.42.101.100/24 | ||||
|                 - 192.168.255.255/32 | ||||
|               dhcp: false | ||||
|             bond0.99: | ||||
|               device: vlan | ||||
|               firewall: trusted | ||||
|               addresses: | ||||
|                 - 192.168.42.10/24 | ||||
|               dhcp: false | ||||
|  | ||||
|         saturn:  # remus | ||||
|           ansible_host: 10.42.101.110 | ||||
|           skylab_hostname: saturn.skylab.enp.one | ||||
|           skylab_legacy_names: | ||||
|             - remus.net.enp.one | ||||
|             - remus.svr.local | ||||
|           skylab_description: Operational Node | ||||
|           skylab_cluster: | ||||
|             address: | ||||
|               access: 10.42.101.11/24 | ||||
|               internal: 192.168.42.20/24 | ||||
|             interface: | ||||
|               access: bond0 | ||||
|               internal: bond0.99 | ||||
|           skylab_networking: | ||||
|             eno1: | ||||
|               bond: bond0 | ||||
|             eno2: | ||||
|               bond: bond0 | ||||
|             bond0: | ||||
|               device: bond | ||||
|               firewall: internal | ||||
|               dhcp: false | ||||
|               gateway: 10.42.101.1/24 | ||||
|               addresses: | ||||
|                 - 10.42.101.110/24 | ||||
|                 - 192.168.255.255/32 | ||||
|               dns: | ||||
|                 - 10.42.101.1 | ||||
|             bond0.99: | ||||
|               device: vlan | ||||
|               firewall: trusted | ||||
|               dhcp: false | ||||
|               addresses: | ||||
|                 - 192.168.42.20/24 | ||||
|  | ||||
|         orion:  # romulus | ||||
|           ansible_host: 10.42.101.120 | ||||
|           skylab_hostname: orion.skylab.enp.one | ||||
|           skylab_legacy_names: | ||||
|             - romulus.net.enp.one | ||||
|             - romulus.svr.local | ||||
|           skylab_description: Operational Node | ||||
|           skylab_cluster: | ||||
|             address: | ||||
|               access: 10.42.101.12/24 | ||||
|               internal: 192.168.42.30/24 | ||||
|             interface: | ||||
|               access: bond0 | ||||
|               internal: bond0.99 | ||||
|           skylab_datastore_device: sdb | ||||
|           skylab_networking: | ||||
|             eno1: | ||||
|               bond: bond0 | ||||
|             eno2: | ||||
|               bond: bond0 | ||||
|             bond0: | ||||
|               device: bond | ||||
|               firewall: internal | ||||
|               gateway: 10.42.101.1/24 | ||||
|               dns: | ||||
|                 - 10.42.101.1 | ||||
|               addresses: | ||||
|                 - 10.42.101.120/24 | ||||
|                 - 192.168.255.255/32 | ||||
|               dhcp: false | ||||
|             bond0.99: | ||||
|               device: vlan | ||||
|               firewall: trusted | ||||
|               addresses: | ||||
|                 - 192.168.42.30/24 | ||||
|               dhcp: false | ||||
|  | ||||
| en2: | ||||
|   vars: | ||||
|     skylab_location: DigitalOcean TOR1 | ||||
|  | ||||
|   hosts: | ||||
|     hubble: | ||||
|       ansible_host: en2a.enp.one | ||||
|       skylab_hostname: hubble.en2.enp.one | ||||
|       skylab_description: Cloud Web Server | ||||
|       skylab_targets: [cloud] | ||||
| @@ -1,51 +1,175 @@ | ||||
| --- | ||||
| en1: | ||||
|  | ||||
| all: | ||||
|   vars: | ||||
|     skylab_location: Cambridge | ||||
|     skylab_state_dir: /var/lib/skylab | ||||
|     skylab_ansible_venv: "{{ skylab_state_dir }}/ansible-runtime" | ||||
|     skylab_pip_version: 19.3.1 | ||||
|     ansible_user: ansible | ||||
|     ansible_ssh_common_args: "-o ControlMaster=auto -o ControlPersist=60s -o ForwardAgent=yes" | ||||
|  | ||||
| workstation: | ||||
|   hosts: | ||||
|     voyager: | ||||
|       skylab_description: Personal Workstation | ||||
|       skylab_hostname: voyager.skylab.enp.one | ||||
|       skylab_targets: [workstation] | ||||
|  | ||||
|  | ||||
| en1: | ||||
|   vars: | ||||
|     skylab_location: Newton MA | ||||
|     skylab_dashboard: info.en1.local | ||||
|     # gross hack for now, will be refactored later | ||||
|     _skylab_adguard_nat_rule: 9 | ||||
|  | ||||
|   hosts: | ||||
|     core: | ||||
|       ansible_host: 10.42.101.1 | ||||
|       ansible_port: 4242 | ||||
|       ansible_network_os: edgeos | ||||
|       skylab_description: EN1 Core Router | ||||
|  | ||||
|     iridium: | ||||
|       ansible_host: 10.42.101.200 | ||||
|       skylab_description: Local Monitor Node | ||||
|       skylab_hostname: iridium.skylab.enp.one | ||||
|       skylab_targets: [network] | ||||
|       skylab_networking: | ||||
|         enp4s0: | ||||
|           firewall: internal | ||||
|           dhcp: false | ||||
|           gateway: 10.42.101.1/24 | ||||
|           dns: | ||||
|             - 10.42.101.1 | ||||
|           addresses: | ||||
|             - 10.42.101.200/24 | ||||
|  | ||||
|   children: | ||||
|     domain: | ||||
|       children: | ||||
|  | ||||
|         cluster: | ||||
|           hosts: | ||||
|             canaveral: | ||||
|               ansible_host: 10.42.101.10 | ||||
|               skylab_description: Compute and Storage Node | ||||
|             baikonur: | ||||
|               ansible_host: 10.42.101.11 | ||||
|               skylab_description: Compute and Storage Node | ||||
|             vandenberg: | ||||
|               ansible_host: 10.42.101.12 | ||||
|               skylab_description: Compute and Storage Node | ||||
|             andoya: | ||||
|               ansible_host: 10.42.101.13 | ||||
|               skylab_description: Auxilary Compute Node | ||||
|             jiuquan: | ||||
|               ansible_host: 10.42.101.14 | ||||
|               skylab_description: Auxilary Compute Node | ||||
|     cluster: | ||||
|       vars: | ||||
|         skylab_targets: [cluster, datastore] | ||||
|         skylab_compose_version: 3.8 | ||||
|         skylab_compose_dir: "{{ skylab_state_dir }}/compose" | ||||
|  | ||||
|         datastore: | ||||
|           hosts: | ||||
|             canaveral: | ||||
|               skylab_datastore_block: /dev/sda | ||||
|             baikonur: | ||||
|               skylab_datastore_block: /dev/sda | ||||
|             vandenberg: | ||||
|               skylab_datastore_block: /dev/sda | ||||
|  | ||||
|         hosts: | ||||
|           3d-printer: {} | ||||
|           mediastore: {} | ||||
|           backstore: {} | ||||
|  | ||||
|     local: | ||||
|       hosts: | ||||
|         core: {} | ||||
|         switch-1: {} | ||||
|         switch-2: {} | ||||
|         wap-1: {} | ||||
|         wap-2: {} | ||||
|         wap-3: {} | ||||
|         printer: {} | ||||
|         pegasus:  # jupiter | ||||
|           ansible_host: 10.42.101.100 | ||||
|           skylab_hostname: pegasus.skylab.enp.one | ||||
|           skylab_legacy_names: | ||||
|             - jupiter.net.enp.one | ||||
|             - jupiter.svr.local | ||||
|           skylab_description: Arbiter Node | ||||
|           skylab_cluster: | ||||
|             address: | ||||
|               access: 10.42.101.10/24 | ||||
|               internal: 192.168.42.10/24 | ||||
|             interface: | ||||
|               access: bond0 | ||||
|               internal: bond0.99 | ||||
|           skylab_datastore_device: sdb | ||||
|           skylab_networking: | ||||
|             eno1: | ||||
|               bond: bond0 | ||||
|             eno2: | ||||
|               bond: bond0 | ||||
|             bond0: | ||||
|               device: bond | ||||
|               firewall: internal | ||||
|               gateway: 10.42.101.1/24 | ||||
|               dns: | ||||
|                 - 10.42.101.1 | ||||
|               addresses: | ||||
|                 - 10.42.101.100/24 | ||||
|                 - 192.168.255.255/32 | ||||
|               dhcp: false | ||||
|             bond0.99: | ||||
|               device: vlan | ||||
|               firewall: trusted | ||||
|               addresses: | ||||
|                 - 192.168.42.10/24 | ||||
|               dhcp: false | ||||
|  | ||||
|         saturn:  # remus | ||||
|           ansible_host: 10.42.101.110 | ||||
|           skylab_hostname: saturn.skylab.enp.one | ||||
|           skylab_legacy_names: | ||||
|             - remus.net.enp.one | ||||
|             - remus.svr.local | ||||
|           skylab_description: Operational Node | ||||
|           skylab_cluster: | ||||
|             address: | ||||
|               access: 10.42.101.11/24 | ||||
|               internal: 192.168.42.20/24 | ||||
|             interface: | ||||
|               access: bond0 | ||||
|               internal: bond0.99 | ||||
|           skylab_networking: | ||||
|             eno1: | ||||
|               bond: bond0 | ||||
|             eno2: | ||||
|               bond: bond0 | ||||
|             bond0: | ||||
|               device: bond | ||||
|               firewall: internal | ||||
|               dhcp: false | ||||
|               gateway: 10.42.101.1/24 | ||||
|               addresses: | ||||
|                 - 10.42.101.110/24 | ||||
|                 - 192.168.255.255/32 | ||||
|               dns: | ||||
|                 - 10.42.101.1 | ||||
|             bond0.99: | ||||
|               device: vlan | ||||
|               firewall: trusted | ||||
|               dhcp: false | ||||
|               addresses: | ||||
|                 - 192.168.42.20/24 | ||||
|  | ||||
|         orion:  # romulus | ||||
|           ansible_host: 10.42.101.120 | ||||
|           skylab_hostname: orion.skylab.enp.one | ||||
|           skylab_legacy_names: | ||||
|             - romulus.net.enp.one | ||||
|             - romulus.svr.local | ||||
|           skylab_description: Operational Node | ||||
|           skylab_cluster: | ||||
|             address: | ||||
|               access: 10.42.101.12/24 | ||||
|               internal: 192.168.42.30/24 | ||||
|             interface: | ||||
|               access: bond0 | ||||
|               internal: bond0.99 | ||||
|           skylab_datastore_device: sdb | ||||
|           skylab_networking: | ||||
|             eno1: | ||||
|               bond: bond0 | ||||
|             eno2: | ||||
|               bond: bond0 | ||||
|             bond0: | ||||
|               device: bond | ||||
|               firewall: internal | ||||
|               gateway: 10.42.101.1/24 | ||||
|               dns: | ||||
|                 - 10.42.101.1 | ||||
|               addresses: | ||||
|                 - 10.42.101.120/24 | ||||
|                 - 192.168.255.255/32 | ||||
|               dhcp: false | ||||
|             bond0.99: | ||||
|               device: vlan | ||||
|               firewall: trusted | ||||
|               addresses: | ||||
|                 - 192.168.42.30/24 | ||||
|               dhcp: false | ||||
|  | ||||
| en2: | ||||
|   vars: | ||||
|     skylab_location: DigitalOcean TOR1 | ||||
|  | ||||
|   hosts: | ||||
|     hubble: | ||||
|       ansible_host: en2a.enp.one | ||||
|       skylab_hostname: hubble.en2.enp.one | ||||
|       skylab_description: Cloud Web Server | ||||
|       skylab_targets: [cloud] | ||||
|   | ||||
| @@ -1,39 +1,4 @@ | ||||
| --- | ||||
| ansible_user: ansible | ||||
|  | ||||
| ansible_port: 4242 | ||||
|  | ||||
| skylab_state_dir: /var/lib/skylab | ||||
|  | ||||
| skylab_ansible_venv: "{{ skylab_state_dir }}/ansible-runtime" | ||||
|  | ||||
| skylab_ansible_vault_password: !vault | | ||||
|           $ANSIBLE_VAULT;1.1;AES256 | ||||
|           61323762623165383963316238343539346336663864366631616339356564346636373561616237 | ||||
|           6666363531393234636337656431366365343236346536320a346163353935366636303131313661 | ||||
|           32623635363063383039363539303135393838376264356463646465376435616363376163373663 | ||||
|           6366633665373939380a373234633365376632376433643034336539346338613566353537663731 | ||||
|           34323464633165626133306464363464333539363761343831316565356266373833 | ||||
|  | ||||
| skylab_tfstate_backend: | ||||
|   hostname: cluster.lab.enp.one | ||||
|   username: terraform | ||||
|   schema: terraform | ||||
|   port: 32421 | ||||
|   password: !vault | | ||||
|           $ANSIBLE_VAULT;1.1;AES256 | ||||
|           30313365393065316563323363663135313438616461356439366632303636343735653033363930 | ||||
|           6334613931376566363064663539643639326363663933610a306138616362376435386466306538 | ||||
|           30626330613932363339363438356430613461313335333536623931343436353330393433373630 | ||||
|           3631343463616631380a386661336534663033383637666538316665303962353034376232356235 | ||||
|           65323339353563623431666535366465353133343137653232326534326436323661636536373564 | ||||
|           3466633762303966366366653531613261336561356531636461 | ||||
|  | ||||
| skylab_mgmt: | ||||
|   sshport: 4242 | ||||
|   group: skylab | ||||
|   user: ansible | ||||
|   id: 1400 | ||||
|   sshkeys: | ||||
|   - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP5TGKururOa1Y+cbv8AWXYI5zhfZCDV0fsBG+33IYUc enpaul@ansible.voyager | ||||
|   - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBf7i/8hSJDYnoD95noCJJVtSxxCp9N5EmnshALufiwm enpaul@ansible.opportunity | ||||
| skylab_mgmt_keys: | ||||
| - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP5TGKururOa1Y+cbv8AWXYI5zhfZCDV0fsBG+33IYUc enpaul@ansible.voyager | ||||
| - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBf7i/8hSJDYnoD95noCJJVtSxxCp9N5EmnshALufiwm enpaul@ansible.opportunity | ||||
|   | ||||
| @@ -11,6 +11,4 @@ tags: [] | ||||
| repository: https://vcs.enp.one/skylab/skylab-ansible/ | ||||
| build_ignore: [] | ||||
|  | ||||
| dependencies: | ||||
|   community.general: ">=6.5.0,<7.0" | ||||
|   ansible.posix: ">=1.5.1,<2.0" | ||||
| dependencies: {} | ||||
|   | ||||
| @@ -28,23 +28,21 @@ | ||||
|       ansible_ssh_pass: "{{ bootstrap_password }}" | ||||
|       ansible_port: "{{ bootstrap_port }}" | ||||
|  | ||||
|   - name: Test connection | ||||
|     delegate_to: bootstrap | ||||
|     delegate_facts: true | ||||
|     vars: | ||||
|       ansible_host_key_checking: false | ||||
|     ansible.builtin.ping: {} | ||||
|  | ||||
| - name: Bootstrap remote | ||||
|   hosts: bootstrap | ||||
|   vars: | ||||
|     ansible_host_key_checking: false | ||||
|   vars_prompt: | ||||
|   - name: skylab_ansible_vault_password | ||||
|   - name: vault_password | ||||
|     prompt: Enter Ansible vault password for generating user secrets | ||||
|     private: true | ||||
|     confirm: true | ||||
|   tasks: | ||||
|   - name: Fetch install path | ||||
|     ansible.builtin.stat: | ||||
|       path: /var/lib/skylab | ||||
|     register: _skylab_install_path | ||||
|  | ||||
|   - name: Check OS requirements | ||||
|     ansible.builtin.assert: | ||||
|       that: | ||||
| @@ -56,75 +54,68 @@ | ||||
|         Unsupported operating system ({{ ansible_distribution }} {{ ansible_distribution_major_version }}), | ||||
|         only RockyLinux 8 and RockyLinux 9 are supported. | ||||
|  | ||||
|   - name: Check boostrap state | ||||
|     ansible.builtin.assert: | ||||
|       that: | ||||
|       - not _skylab_install_path.stat.exists | ||||
|       success_msg: >- | ||||
|         Host is ready for boostrapping | ||||
|       fail_msg: >- | ||||
|         Host has already been boostrapped | ||||
|  | ||||
|   - name: Check that management keys are defined | ||||
|     ansible.builtin.assert: | ||||
|       that: | ||||
|         - skylab_mgmt is defined | ||||
|         - skylab_mgmt.sshkeys != [] | ||||
|         - skylab_mgmt_keys is defined | ||||
|         - skylab_mgmt_keys != [] | ||||
|       success_msg: >- | ||||
|         Found {{ skylab_mgmt.sshkeys | length }} SSH keys to install to the Ansible management user | ||||
|         Found {{ skylab_mgmt_keys | length }} SSH keys to install to the Ansible management user | ||||
|       fail_msg: >- | ||||
|         No management keys were found for installation to the Ansible management user. Aborting to avoid | ||||
|         locking out SSH access to the boostrap host. Please define the 'skylab_mgmt.sshkeys' variable with | ||||
|         locking out SSH access to the boostrap host. Please define the 'skylab_mgmt_keys' variable with | ||||
|         a list of SSH public keys to install to the Ansible management user. | ||||
|  | ||||
|   - name: Install RockyLinux python bindings | ||||
|     become: true | ||||
|     ansible.builtin.dnf: | ||||
|       state: present | ||||
|       name: | ||||
|         - libffi-devel | ||||
|         - python3-devel | ||||
|         - python3-libselinux | ||||
|         - python3-policycoreutils | ||||
|         - python3-firewall | ||||
|  | ||||
|   - name: Create mgmt group | ||||
|     become: true | ||||
|   - name: Create skylab group | ||||
|     ansible.builtin.group: | ||||
|       name: "{{ skylab_mgmt.group }}" | ||||
|       name: skylab | ||||
|       state: present | ||||
|       gid: "{{ skylab_mgmt.id }}" | ||||
|       gid: 1400 | ||||
|  | ||||
|   - name: Generate mgmt user account password | ||||
|   - name: Update ansible user authorized keys | ||||
|     ansible.posix.authorized_key: | ||||
|       user: ansible | ||||
|       exclusive: true | ||||
|       key: "{{ skylab_mgmt_keys | join('\n') }}" | ||||
|  | ||||
|   - name: Generate ansible user account password | ||||
|     delegate_to: localhost | ||||
|     no_log: true | ||||
|     changed_when: false | ||||
|     ansible.builtin.shell: | ||||
|       cmd: > | ||||
|         command mpw -qq -F none -t max -u {{ skylab_mgmt.user }} {{ ansible_host }} -p <<< | ||||
|         '{{ skylab_ansible_vault_password }}' | | ||||
|         command mpw -qq -F none -t max -u ansible {{ ansible_host }} -p <<< | ||||
|         '{{ vault_password }}' | | ||||
|         python3 -c 'import crypt; print(crypt.crypt(input(), crypt.mksalt(crypt.METHOD_SHA512)))' | ||||
|       executable: /bin/bash | ||||
|     register: _password_mgmt | ||||
|     register: _password_ansible | ||||
|  | ||||
|   - name: Update mgmt user account | ||||
|     become: true | ||||
|   - name: Update ansible user account | ||||
|     ansible.builtin.user: | ||||
|       name: "{{ skylab_mgmt.user }}" | ||||
|       name: ansible | ||||
|       state: present | ||||
|       group: "{{ skylab_mgmt.group }}" | ||||
|       group: skylab | ||||
|       groups: | ||||
|         - "{{ skylab_mgmt.group }}" | ||||
|         - skylab | ||||
|         - wheel | ||||
|       uid: "{{ skylab_mgmt.id }}" | ||||
|       password: "{{ _password_mgmt.stdout }}" | ||||
|       uid: 1400 | ||||
|       password: "{{ _password_ansible.stdout }}" | ||||
|  | ||||
|   - name: Update mgmt user authorized keys | ||||
|     become: true | ||||
|     ansible.posix.authorized_key: | ||||
|       user: "{{ skylab_mgmt.user }}" | ||||
|       exclusive: true | ||||
|       key: "{{ skylab_mgmt.sshkeys | join('\n') }}" | ||||
|  | ||||
|   - name: Remove mgmt user group | ||||
|     become: true | ||||
|   - name: Remove ansible user group | ||||
|     ansible.builtin.group: | ||||
|       name: "{{ skylab_mgmt.user }}" | ||||
|       name: ansible | ||||
|       state: absent | ||||
|  | ||||
|   - name: Update root user authorized keys | ||||
|     become: true | ||||
|     ansible.posix.authorized_key: | ||||
|       user: root | ||||
|       exclusive: true | ||||
| @@ -136,66 +127,22 @@ | ||||
|       content: "%wheel ALL=(ALL) NOPASSWD: ALL" | ||||
|       dest: /etc/sudoers.d/30-wheel | ||||
|       owner: root | ||||
|       group: "{{ skylab_mgmt.group }}" | ||||
|       group: skylab | ||||
|       mode: 0644 | ||||
|  | ||||
|   - name: Disable SSHD password auth | ||||
|     become: true | ||||
|     ansible.builtin.replace: | ||||
|       path: /etc/ssh/sshd_config | ||||
|       regexp: '^(#?)PasswordAuthentication .*$' | ||||
|       replace: PasswordAuthentication no | ||||
|       replace: 'PasswordAuthentication no' | ||||
|  | ||||
|   - name: Disable SSHD root login | ||||
|     become: true | ||||
|     ansible.builtin.replace: | ||||
|       path: /etc/ssh/sshd_config | ||||
|       regexp: '^(#?)PermitRootLogin .*$' | ||||
|       replace: PermitRootLogin no | ||||
|  | ||||
|   - name: Update SSHD mgmt port | ||||
|     become: true | ||||
|     ansible.builtin.replace: | ||||
|       path: /etc/ssh/sshd_config | ||||
|       regexp: '^(#?)Port .*$' | ||||
|       replace: Port {{ skylab_mgmt.sshport }} | ||||
|  | ||||
|   - name: Grant SSHD permissions on the mgmt port | ||||
|     become: true | ||||
|     community.general.seport: | ||||
|       ports: "{{ skylab_mgmt.sshport }}" | ||||
|       proto: tcp | ||||
|       setype: ssh_port_t | ||||
|       state: present | ||||
|  | ||||
|   - name: Install Firewalld | ||||
|     become: true | ||||
|     ansible.builtin.dnf: | ||||
|       name: firewalld | ||||
|       state: present | ||||
|  | ||||
|   - name: Enable Firewalld | ||||
|     become: true | ||||
|     ansible.builtin.service: | ||||
|       name: firewalld | ||||
|       enabled: true | ||||
|  | ||||
|   - name: Grant SSHD firewall access to the mgmt port | ||||
|     become: true | ||||
|     ansible.posix.firewalld: | ||||
|       port: "{{ skylab_mgmt.sshport }}/tcp" | ||||
|       state: enabled | ||||
|       permanent: true | ||||
|  | ||||
|   - name: Revoke SSHD firewall access to default port | ||||
|     become: true | ||||
|     ansible.posix.firewalld: | ||||
|       service: ssh | ||||
|       permanent: true | ||||
|       state: disabled | ||||
|       replace: 'PermitRootLogin no' | ||||
|  | ||||
|   - name: Update OS | ||||
|     become: true | ||||
|     ansible.builtin.dnf: | ||||
|       name: "*" | ||||
|       state: latest | ||||
| @@ -207,24 +154,22 @@ | ||||
|     changed_when: false | ||||
|     ansible.builtin.shell: | ||||
|       cmd: > | ||||
|         command mpw -qq -F none -t max -u root {{ ansible_host }} -p <<< | ||||
|         '{{ skylab_ansible_vault_password }}' | | ||||
|         command mpw -qq -F none -t max -u ansible {{ ansible_host }} -p <<< | ||||
|         '{{ vault_password }}' | | ||||
|         python3 -c 'import crypt; print(crypt.crypt(input(), crypt.mksalt(crypt.METHOD_SHA512)))' | ||||
|       executable: /bin/bash | ||||
|     register: _password_root | ||||
|  | ||||
|   - name: Update root user account | ||||
|     become: true | ||||
|     ansible.builtin.user: | ||||
|       name: root | ||||
|       state: present | ||||
|       password: "{{ _password_root.stdout }}" | ||||
|  | ||||
|   - name: Create SkyLab directory | ||||
|     become: true | ||||
|     ansible.builtin.file: | ||||
|       state: directory | ||||
|       path: "{{ skylab_state_dir }}" | ||||
|       owner: "{{ skylab_mgmt.user }}" | ||||
|       group: "{{ skylab_mgmt.group }}" | ||||
|       path: /var/lib/skylab | ||||
|       owner: ansible | ||||
|       group: skylab | ||||
|       mode: 0750 | ||||
|   | ||||
| @@ -1,46 +0,0 @@ | ||||
| --- | ||||
| - name: Provision DigitalOcean cloud | ||||
|   hosts: localhost | ||||
|   vars: | ||||
|     terraform_backend: "postgres://{{ skylab_tfstate_backend.username }}:{{ skylab_tfstate_backend.password }}@{{ skylab_tfstate_backend.hostname }}:{{ skylab_tfstate_backend.port }}/{{ skylab_tfstate_backend.schema }}" | ||||
|   tasks: | ||||
|   - name: Deploy terraform config | ||||
|     block: | ||||
|     - name: Create temp plan file | ||||
|       changed_when: false | ||||
|       ansible.builtin.tempfile: | ||||
|         state: file | ||||
|         prefix: skylab | ||||
|         suffix: tfplan | ||||
|       register: _tfplan_tempfile | ||||
|  | ||||
|     # Generating a plan file before yeeting a deployment into the | ||||
|     # wind helps to ensure that the syntax is correct, backend and | ||||
|     # state are valid, and all the plumbing is working as expected. | ||||
|     # We don't want errors when we deploy, so it's better to | ||||
|     # generate the plan first | ||||
|     - name: Initialize terraform backend and generate plan file | ||||
|       community.general.terraform: | ||||
|         state: planned | ||||
|         project_path: terraform/ | ||||
|         backend_config: | ||||
|           conn_str: "{{ terraform_backend }}" | ||||
|         force_init: true | ||||
|         init_reconfigure: true | ||||
|         plan_file: "{{ _tfplan_tempfile.path }}" | ||||
|  | ||||
|     # TODO: update to take DO token from invocation args rather than | ||||
|     # implicit env var | ||||
|     - name: Apply terraform plan | ||||
|       community.general.terraform: | ||||
|         state: present | ||||
|         project_path: terraform/ | ||||
|         backend_config: | ||||
|           conn_str: "{{ terraform_backend }}" | ||||
|         plan_file: "{{ _tfplan_tempfile.path }}" | ||||
|     always: | ||||
|     - name: Remove temp plan file | ||||
|       changed_when: false | ||||
|       ansible.builtin.file: | ||||
|         path: "{{ _tfplan_tempfile.path }}" | ||||
|         state: absent | ||||
| @@ -1,72 +0,0 @@ | ||||
| resource "digitalocean_domain" "scipiocapital" { | ||||
|   name = "scipiocapital.us" | ||||
| } | ||||
|  | ||||
| # ========================================================================== | ||||
| # Standard hostname configuration | ||||
| resource "digitalocean_record" "scipiocapital" { | ||||
|   domain = digitalocean_domain.scipiocapital.id | ||||
|   type   = "A" | ||||
|   name   = "@" | ||||
|   value  = digitalocean_record.enp.value | ||||
|   ttl    = 3600 | ||||
| } | ||||
|  | ||||
| resource "digitalocean_record" "scipiocapital_app" { | ||||
|   domain = digitalocean_domain.scipiocapital.id | ||||
|   type   = "CNAME" | ||||
|   name   = "app" | ||||
|   value  = "${digitalocean_record.enp_en1.fqdn}." | ||||
|   ttl    = 43200 | ||||
| } | ||||
|  | ||||
| resource "digitalocean_record" "scipiocapital_notify" { | ||||
|   domain = digitalocean_domain.scipiocapital.id | ||||
|   type   = "CNAME" | ||||
|   name   = "notify" | ||||
|   value  = "${digitalocean_record.enp_en1.fqdn}." | ||||
|   ttl    = 43200 | ||||
| } | ||||
|  | ||||
| resource "digitalocean_record" "scipiocapital_docs" { | ||||
|   domain = digitalocean_domain.scipiocapital.id | ||||
|   type   = "CNAME" | ||||
|   name   = "docs" | ||||
|   value  = "${digitalocean_record.enp_en1.fqdn}." | ||||
|   ttl    = 43200 | ||||
| } | ||||
|  | ||||
| resource "digitalocean_record" "scipiocapital_auth" { | ||||
|   domain = digitalocean_domain.scipiocapital.id | ||||
|   type   = "CNAME" | ||||
|   name   = "auth" | ||||
|   value  = "${digitalocean_record.enp_en1.fqdn}." | ||||
|   ttl    = 43200 | ||||
| } | ||||
|  | ||||
| # ========================================================================== | ||||
| # Standard DO configuration for all managed domains, includes | ||||
| # NS records and SOA | ||||
| resource "digitalocean_record" "scipiocapital_ns1" { | ||||
|   domain = digitalocean_domain.scipiocapital.id | ||||
|   type   = "NS" | ||||
|   name   = "@" | ||||
|   value  = "ns1.digitalocean.com." | ||||
|   ttl    = 1800 | ||||
| } | ||||
|  | ||||
| resource "digitalocean_record" "scipiocapital_ns2" { | ||||
|   domain = digitalocean_domain.scipiocapital.id | ||||
|   type   = "NS" | ||||
|   name   = "@" | ||||
|   value  = "ns2.digitalocean.com." | ||||
|   ttl    = 1800 | ||||
| } | ||||
|  | ||||
| resource "digitalocean_record" "scipiocapital_ns3" { | ||||
|   domain = digitalocean_domain.scipiocapital.id | ||||
|   type   = "NS" | ||||
|   name   = "@" | ||||
|   value  = "ns3.digitalocean.com." | ||||
|   ttl    = 1800 | ||||
| } | ||||
| @@ -1,13 +0,0 @@ | ||||
| resource "digitalocean_project" "scipio" { | ||||
|   name        = "Scipio Capital" | ||||
|   description = "Eventual home of Scipio Capital systems" | ||||
|   purpose     = "Service or API" | ||||
|   environment = "Production" | ||||
| } | ||||
|  | ||||
| resource "digitalocean_project_resources" "scipio" { | ||||
|   project = digitalocean_project.scipio.id | ||||
|   resources = [ | ||||
|     digitalocean_domain.scipiocapital.urn, | ||||
|   ] | ||||
| } | ||||
| @@ -1,17 +0,0 @@ | ||||
| resource "digitalocean_project" "skylab" { | ||||
|   name        = "SkyLab" | ||||
|   description = "SkyLab resources, with emphasis on Sky" | ||||
|   purpose     = "Operational / Developer tooling" | ||||
|   environment = "Development" | ||||
|   is_default  = true | ||||
| } | ||||
|  | ||||
| resource "digitalocean_project_resources" "skylab" { | ||||
|   project = digitalocean_project.skylab.id | ||||
|   resources = [ | ||||
|     digitalocean_domain.allaroundhere.urn, | ||||
|     digitalocean_domain.enpaul.urn, | ||||
|     digitalocean_domain.enp.urn, | ||||
|     digitalocean_spaces_bucket.enp_cdn.urn | ||||
|   ] | ||||
| } | ||||
| @@ -1,18 +0,0 @@ | ||||
| resource "digitalocean_spaces_bucket" "enp_cdn" { | ||||
|   name          = "en2-cdn" | ||||
|   region        = "nyc3" | ||||
|   acl           = "public-read" | ||||
|   force_destroy = false | ||||
| } | ||||
|  | ||||
| resource "digitalocean_certificate" "enp_cdn" { | ||||
|   name    = "CDN" | ||||
|   type    = "lets_encrypt" | ||||
|   domains = ["cdn.enp.one", "enp.one"] | ||||
| } | ||||
|  | ||||
| resource "digitalocean_cdn" "enp" { | ||||
|   origin           = digitalocean_spaces_bucket.enp_cdn.bucket_domain_name | ||||
|   custom_domain    = "cdn.enp.one" | ||||
|   certificate_name = digitalocean_certificate.enp_cdn.name | ||||
| } | ||||
							
								
								
									
										26
									
								
								terra/.terraform.lock.hcl
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								terra/.terraform.lock.hcl
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| # This file is maintained automatically by "terraform init". | ||||
| # Manual edits may be lost in future updates. | ||||
|  | ||||
| provider "registry.terraform.io/digitalocean/digitalocean" { | ||||
|   version     = "2.27.1" | ||||
|   constraints = "~> 2.0" | ||||
|   hashes = [ | ||||
|     "h1:C9/+kSYQoJZiYEQdu83BYHxuMaKxkg6jWGu6Xl338wA=", | ||||
|     "zh:000e6ab646f619062d3c81bff550cb88fbd51054b5eaaeecfd09ccfa991b1165", | ||||
|     "zh:11cbd9605789ab9960c0ea685d1259c0b10da6046f1bfa3223013c1fc9599025", | ||||
|     "zh:1d8194ab489bc291e7929f8fba7efa75be7d92f43406236e05df2a6adb0f2555", | ||||
|     "zh:2a2a4a9b914519fdc2dbce6d118c0a00bb5b0c7007d3b3542ee4bba790a818f9", | ||||
|     "zh:341bb1cfde82dc8c581f96248b8884f4726976fe84186b0a8062652f36c2a67e", | ||||
|     "zh:3aaffdb5a7a36c3874da3871ac054cf6a06676802222e9098953139c1a504507", | ||||
|     "zh:5af7eb37d76670c057e2a0aab80440a254d13210b3455c320e87e512e58341bb", | ||||
|     "zh:66bee2592bc329056253e29036ff301d0583027965f3a04bd9674eea33a1ab40", | ||||
|     "zh:90a71eaca6b9dcb5ac4c74d4d6c9783ba4f41d02dcb5e3b1f0acc9d229cadb60", | ||||
|     "zh:91d2c510a4435888b751eaf29740539de01aea1144b0a3a249e5728dc996b55d", | ||||
|     "zh:a422008859b5e176ce432c86cf7b4fb8780e20c6c13e1af037652f56266139c1", | ||||
|     "zh:ac008994c99b14fdd70de4ccf12f768491462318156f507986200baa648b844b", | ||||
|     "zh:c1b04e9bd9423569a06c6ce3ca3faf64ecce2d6b1e704033c184dd2b2b6c7b65", | ||||
|     "zh:ce613909b1f389f3f97fcd12453dee820d321afc0c3377d04f8c8f28a7ececa1", | ||||
|     "zh:e07af88df670bb98d7300af529db24bec1652ff3c9d6928b181132d416727c3f", | ||||
|     "zh:ff4fd186e484c933796fd56329902507c2439a6783829080aa02ea719d8e7d47", | ||||
|   ] | ||||
| } | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1,373 @@ | ||||
| Mozilla Public License Version 2.0 | ||||
| ================================== | ||||
|  | ||||
| 1. Definitions | ||||
| -------------- | ||||
|  | ||||
| 1.1. "Contributor" | ||||
|     means each individual or legal entity that creates, contributes to | ||||
|     the creation of, or owns Covered Software. | ||||
|  | ||||
| 1.2. "Contributor Version" | ||||
|     means the combination of the Contributions of others (if any) used | ||||
|     by a Contributor and that particular Contributor's Contribution. | ||||
|  | ||||
| 1.3. "Contribution" | ||||
|     means Covered Software of a particular Contributor. | ||||
|  | ||||
| 1.4. "Covered Software" | ||||
|     means Source Code Form to which the initial Contributor has attached | ||||
|     the notice in Exhibit A, the Executable Form of such Source Code | ||||
|     Form, and Modifications of such Source Code Form, in each case | ||||
|     including portions thereof. | ||||
|  | ||||
| 1.5. "Incompatible With Secondary Licenses" | ||||
|     means | ||||
|  | ||||
|     (a) that the initial Contributor has attached the notice described | ||||
|         in Exhibit B to the Covered Software; or | ||||
|  | ||||
|     (b) that the Covered Software was made available under the terms of | ||||
|         version 1.1 or earlier of the License, but not also under the | ||||
|         terms of a Secondary License. | ||||
|  | ||||
| 1.6. "Executable Form" | ||||
|     means any form of the work other than Source Code Form. | ||||
|  | ||||
| 1.7. "Larger Work" | ||||
|     means a work that combines Covered Software with other material, in | ||||
|     a separate file or files, that is not Covered Software. | ||||
|  | ||||
| 1.8. "License" | ||||
|     means this document. | ||||
|  | ||||
| 1.9. "Licensable" | ||||
|     means having the right to grant, to the maximum extent possible, | ||||
|     whether at the time of the initial grant or subsequently, any and | ||||
|     all of the rights conveyed by this License. | ||||
|  | ||||
| 1.10. "Modifications" | ||||
|     means any of the following: | ||||
|  | ||||
|     (a) any file in Source Code Form that results from an addition to, | ||||
|         deletion from, or modification of the contents of Covered | ||||
|         Software; or | ||||
|  | ||||
|     (b) any new file in Source Code Form that contains any Covered | ||||
|         Software. | ||||
|  | ||||
| 1.11. "Patent Claims" of a Contributor | ||||
|     means any patent claim(s), including without limitation, method, | ||||
|     process, and apparatus claims, in any patent Licensable by such | ||||
|     Contributor that would be infringed, but for the grant of the | ||||
|     License, by the making, using, selling, offering for sale, having | ||||
|     made, import, or transfer of either its Contributions or its | ||||
|     Contributor Version. | ||||
|  | ||||
| 1.12. "Secondary License" | ||||
|     means either the GNU General Public License, Version 2.0, the GNU | ||||
|     Lesser General Public License, Version 2.1, the GNU Affero General | ||||
|     Public License, Version 3.0, or any later versions of those | ||||
|     licenses. | ||||
|  | ||||
| 1.13. "Source Code Form" | ||||
|     means the form of the work preferred for making modifications. | ||||
|  | ||||
| 1.14. "You" (or "Your") | ||||
|     means an individual or a legal entity exercising rights under this | ||||
|     License. For legal entities, "You" includes any entity that | ||||
|     controls, is controlled by, or is under common control with You. For | ||||
|     purposes of this definition, "control" means (a) the power, direct | ||||
|     or indirect, to cause the direction or management of such entity, | ||||
|     whether by contract or otherwise, or (b) ownership of more than | ||||
|     fifty percent (50%) of the outstanding shares or beneficial | ||||
|     ownership of such entity. | ||||
|  | ||||
| 2. License Grants and Conditions | ||||
| -------------------------------- | ||||
|  | ||||
| 2.1. Grants | ||||
|  | ||||
| Each Contributor hereby grants You a world-wide, royalty-free, | ||||
| non-exclusive license: | ||||
|  | ||||
| (a) under intellectual property rights (other than patent or trademark) | ||||
|     Licensable by such Contributor to use, reproduce, make available, | ||||
|     modify, display, perform, distribute, and otherwise exploit its | ||||
|     Contributions, either on an unmodified basis, with Modifications, or | ||||
|     as part of a Larger Work; and | ||||
|  | ||||
| (b) under Patent Claims of such Contributor to make, use, sell, offer | ||||
|     for sale, have made, import, and otherwise transfer either its | ||||
|     Contributions or its Contributor Version. | ||||
|  | ||||
| 2.2. Effective Date | ||||
|  | ||||
| The licenses granted in Section 2.1 with respect to any Contribution | ||||
| become effective for each Contribution on the date the Contributor first | ||||
| distributes such Contribution. | ||||
|  | ||||
| 2.3. Limitations on Grant Scope | ||||
|  | ||||
| The licenses granted in this Section 2 are the only rights granted under | ||||
| this License. No additional rights or licenses will be implied from the | ||||
| distribution or licensing of Covered Software under this License. | ||||
| Notwithstanding Section 2.1(b) above, no patent license is granted by a | ||||
| Contributor: | ||||
|  | ||||
| (a) for any code that a Contributor has removed from Covered Software; | ||||
|     or | ||||
|  | ||||
| (b) for infringements caused by: (i) Your and any other third party's | ||||
|     modifications of Covered Software, or (ii) the combination of its | ||||
|     Contributions with other software (except as part of its Contributor | ||||
|     Version); or | ||||
|  | ||||
| (c) under Patent Claims infringed by Covered Software in the absence of | ||||
|     its Contributions. | ||||
|  | ||||
| This License does not grant any rights in the trademarks, service marks, | ||||
| or logos of any Contributor (except as may be necessary to comply with | ||||
| the notice requirements in Section 3.4). | ||||
|  | ||||
| 2.4. Subsequent Licenses | ||||
|  | ||||
| No Contributor makes additional grants as a result of Your choice to | ||||
| distribute the Covered Software under a subsequent version of this | ||||
| License (see Section 10.2) or under the terms of a Secondary License (if | ||||
| permitted under the terms of Section 3.3). | ||||
|  | ||||
| 2.5. Representation | ||||
|  | ||||
| Each Contributor represents that the Contributor believes its | ||||
| Contributions are its original creation(s) or it has sufficient rights | ||||
| to grant the rights to its Contributions conveyed by this License. | ||||
|  | ||||
| 2.6. Fair Use | ||||
|  | ||||
| This License is not intended to limit any rights You have under | ||||
| applicable copyright doctrines of fair use, fair dealing, or other | ||||
| equivalents. | ||||
|  | ||||
| 2.7. Conditions | ||||
|  | ||||
| Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted | ||||
| in Section 2.1. | ||||
|  | ||||
| 3. Responsibilities | ||||
| ------------------- | ||||
|  | ||||
| 3.1. Distribution of Source Form | ||||
|  | ||||
| All distribution of Covered Software in Source Code Form, including any | ||||
| Modifications that You create or to which You contribute, must be under | ||||
| the terms of this License. You must inform recipients that the Source | ||||
| Code Form of the Covered Software is governed by the terms of this | ||||
| License, and how they can obtain a copy of this License. You may not | ||||
| attempt to alter or restrict the recipients' rights in the Source Code | ||||
| Form. | ||||
|  | ||||
| 3.2. Distribution of Executable Form | ||||
|  | ||||
| If You distribute Covered Software in Executable Form then: | ||||
|  | ||||
| (a) such Covered Software must also be made available in Source Code | ||||
|     Form, as described in Section 3.1, and You must inform recipients of | ||||
|     the Executable Form how they can obtain a copy of such Source Code | ||||
|     Form by reasonable means in a timely manner, at a charge no more | ||||
|     than the cost of distribution to the recipient; and | ||||
|  | ||||
| (b) You may distribute such Executable Form under the terms of this | ||||
|     License, or sublicense it under different terms, provided that the | ||||
|     license for the Executable Form does not attempt to limit or alter | ||||
|     the recipients' rights in the Source Code Form under this License. | ||||
|  | ||||
| 3.3. Distribution of a Larger Work | ||||
|  | ||||
| You may create and distribute a Larger Work under terms of Your choice, | ||||
| provided that You also comply with the requirements of this License for | ||||
| the Covered Software. If the Larger Work is a combination of Covered | ||||
| Software with a work governed by one or more Secondary Licenses, and the | ||||
| Covered Software is not Incompatible With Secondary Licenses, this | ||||
| License permits You to additionally distribute such Covered Software | ||||
| under the terms of such Secondary License(s), so that the recipient of | ||||
| the Larger Work may, at their option, further distribute the Covered | ||||
| Software under the terms of either this License or such Secondary | ||||
| License(s). | ||||
|  | ||||
| 3.4. Notices | ||||
|  | ||||
| You may not remove or alter the substance of any license notices | ||||
| (including copyright notices, patent notices, disclaimers of warranty, | ||||
| or limitations of liability) contained within the Source Code Form of | ||||
| the Covered Software, except that You may alter any license notices to | ||||
| the extent required to remedy known factual inaccuracies. | ||||
|  | ||||
| 3.5. Application of Additional Terms | ||||
|  | ||||
| You may choose to offer, and to charge a fee for, warranty, support, | ||||
| indemnity or liability obligations to one or more recipients of Covered | ||||
| Software. However, You may do so only on Your own behalf, and not on | ||||
| behalf of any Contributor. You must make it absolutely clear that any | ||||
| such warranty, support, indemnity, or liability obligation is offered by | ||||
| You alone, and You hereby agree to indemnify every Contributor for any | ||||
| liability incurred by such Contributor as a result of warranty, support, | ||||
| indemnity or liability terms You offer. You may include additional | ||||
| disclaimers of warranty and limitations of liability specific to any | ||||
| jurisdiction. | ||||
|  | ||||
| 4. Inability to Comply Due to Statute or Regulation | ||||
| --------------------------------------------------- | ||||
|  | ||||
| If it is impossible for You to comply with any of the terms of this | ||||
| License with respect to some or all of the Covered Software due to | ||||
| statute, judicial order, or regulation then You must: (a) comply with | ||||
| the terms of this License to the maximum extent possible; and (b) | ||||
| describe the limitations and the code they affect. Such description must | ||||
| be placed in a text file included with all distributions of the Covered | ||||
| Software under this License. Except to the extent prohibited by statute | ||||
| or regulation, such description must be sufficiently detailed for a | ||||
| recipient of ordinary skill to be able to understand it. | ||||
|  | ||||
| 5. Termination | ||||
| -------------- | ||||
|  | ||||
| 5.1. The rights granted under this License will terminate automatically | ||||
| if You fail to comply with any of its terms. However, if You become | ||||
| compliant, then the rights granted under this License from a particular | ||||
| Contributor are reinstated (a) provisionally, unless and until such | ||||
| Contributor explicitly and finally terminates Your grants, and (b) on an | ||||
| ongoing basis, if such Contributor fails to notify You of the | ||||
| non-compliance by some reasonable means prior to 60 days after You have | ||||
| come back into compliance. Moreover, Your grants from a particular | ||||
| Contributor are reinstated on an ongoing basis if such Contributor | ||||
| notifies You of the non-compliance by some reasonable means, this is the | ||||
| first time You have received notice of non-compliance with this License | ||||
| from such Contributor, and You become compliant prior to 30 days after | ||||
| Your receipt of the notice. | ||||
|  | ||||
| 5.2. If You initiate litigation against any entity by asserting a patent | ||||
| infringement claim (excluding declaratory judgment actions, | ||||
| counter-claims, and cross-claims) alleging that a Contributor Version | ||||
| directly or indirectly infringes any patent, then the rights granted to | ||||
| You by any and all Contributors for the Covered Software under Section | ||||
| 2.1 of this License shall terminate. | ||||
|  | ||||
| 5.3. In the event of termination under Sections 5.1 or 5.2 above, all | ||||
| end user license agreements (excluding distributors and resellers) which | ||||
| have been validly granted by You or Your distributors under this License | ||||
| prior to termination shall survive termination. | ||||
|  | ||||
| ************************************************************************ | ||||
| *                                                                      * | ||||
| *  6. Disclaimer of Warranty                                           * | ||||
| *  -------------------------                                           * | ||||
| *                                                                      * | ||||
| *  Covered Software is provided under this License on an "as is"       * | ||||
| *  basis, without warranty of any kind, either expressed, implied, or  * | ||||
| *  statutory, including, without limitation, warranties that the       * | ||||
| *  Covered Software is free of defects, merchantable, fit for a        * | ||||
| *  particular purpose or non-infringing. The entire risk as to the     * | ||||
| *  quality and performance of the Covered Software is with You.        * | ||||
| *  Should any Covered Software prove defective in any respect, You     * | ||||
| *  (not any Contributor) assume the cost of any necessary servicing,   * | ||||
| *  repair, or correction. This disclaimer of warranty constitutes an   * | ||||
| *  essential part of this License. No use of any Covered Software is   * | ||||
| *  authorized under this License except under this disclaimer.         * | ||||
| *                                                                      * | ||||
| ************************************************************************ | ||||
|  | ||||
| ************************************************************************ | ||||
| *                                                                      * | ||||
| *  7. Limitation of Liability                                          * | ||||
| *  --------------------------                                          * | ||||
| *                                                                      * | ||||
| *  Under no circumstances and under no legal theory, whether tort      * | ||||
| *  (including negligence), contract, or otherwise, shall any           * | ||||
| *  Contributor, or anyone who distributes Covered Software as          * | ||||
| *  permitted above, be liable to You for any direct, indirect,         * | ||||
| *  special, incidental, or consequential damages of any character      * | ||||
| *  including, without limitation, damages for lost profits, loss of    * | ||||
| *  goodwill, work stoppage, computer failure or malfunction, or any    * | ||||
| *  and all other commercial damages or losses, even if such party      * | ||||
| *  shall have been informed of the possibility of such damages. This   * | ||||
| *  limitation of liability shall not apply to liability for death or   * | ||||
| *  personal injury resulting from such party's negligence to the       * | ||||
| *  extent applicable law prohibits such limitation. Some               * | ||||
| *  jurisdictions do not allow the exclusion or limitation of           * | ||||
| *  incidental or consequential damages, so this exclusion and          * | ||||
| *  limitation may not apply to You.                                    * | ||||
| *                                                                      * | ||||
| ************************************************************************ | ||||
|  | ||||
| 8. Litigation | ||||
| ------------- | ||||
|  | ||||
| Any litigation relating to this License may be brought only in the | ||||
| courts of a jurisdiction where the defendant maintains its principal | ||||
| place of business and such litigation shall be governed by laws of that | ||||
| jurisdiction, without reference to its conflict-of-law provisions. | ||||
| Nothing in this Section shall prevent a party's ability to bring | ||||
| cross-claims or counter-claims. | ||||
|  | ||||
| 9. Miscellaneous | ||||
| ---------------- | ||||
|  | ||||
| This License represents the complete agreement concerning the subject | ||||
| matter hereof. If any provision of this License is held to be | ||||
| unenforceable, such provision shall be reformed only to the extent | ||||
| necessary to make it enforceable. Any law or regulation which provides | ||||
| that the language of a contract shall be construed against the drafter | ||||
| shall not be used to construe this License against a Contributor. | ||||
|  | ||||
| 10. Versions of the License | ||||
| --------------------------- | ||||
|  | ||||
| 10.1. New Versions | ||||
|  | ||||
| Mozilla Foundation is the license steward. Except as provided in Section | ||||
| 10.3, no one other than the license steward has the right to modify or | ||||
| publish new versions of this License. Each version will be given a | ||||
| distinguishing version number. | ||||
|  | ||||
| 10.2. Effect of New Versions | ||||
|  | ||||
| You may distribute the Covered Software under the terms of the version | ||||
| of the License under which You originally received the Covered Software, | ||||
| or under the terms of any subsequent version published by the license | ||||
| steward. | ||||
|  | ||||
| 10.3. Modified Versions | ||||
|  | ||||
| If you create software not governed by this License, and you want to | ||||
| create a new license for such software, you may create and use a | ||||
| modified version of this License if you rename the license and remove | ||||
| any references to the name of the license steward (except to note that | ||||
| such modified license differs from this License). | ||||
|  | ||||
| 10.4. Distributing Source Code Form that is Incompatible With Secondary | ||||
| Licenses | ||||
|  | ||||
| If You choose to distribute Source Code Form that is Incompatible With | ||||
| Secondary Licenses under the terms of this version of the License, the | ||||
| notice described in Exhibit B of this License must be attached. | ||||
|  | ||||
| Exhibit A - Source Code Form License Notice | ||||
| ------------------------------------------- | ||||
|  | ||||
|   This Source Code Form is subject to the terms of the Mozilla Public | ||||
|   License, v. 2.0. If a copy of the MPL was not distributed with this | ||||
|   file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||||
|  | ||||
| If it is not possible or desirable to put the notice in a particular | ||||
| file, then You may include the notice in a location (such as a LICENSE | ||||
| file in a relevant directory) where a recipient would be likely to look | ||||
| for such a notice. | ||||
|  | ||||
| You may add additional accurate notices of copyright ownership. | ||||
|  | ||||
| Exhibit B - "Incompatible With Secondary Licenses" Notice | ||||
| --------------------------------------------------------- | ||||
|  | ||||
|   This Source Code Form is "Incompatible With Secondary Licenses", as | ||||
|   defined by the Mozilla Public License, v. 2.0. | ||||
| @@ -0,0 +1,36 @@ | ||||
| # DigitalOcean Terraform Provider | ||||
|  | ||||
| - Documentation: | ||||
|   https://registry.terraform.io/providers/digitalocean/digitalocean/latest/docs | ||||
|  | ||||
| ## Requirements | ||||
|  | ||||
| - [Terraform](https://www.terraform.io/downloads.html) 0.10.x | ||||
| - [Go](https://golang.org/doc/install) 1.14 (to build the provider plugin) | ||||
|  | ||||
| ## Building The Provider | ||||
|  | ||||
| Clone repository to: `$GOPATH/src/github.com/digitalocean/terraform-provider-digitalocean` | ||||
|  | ||||
| ```sh | ||||
| $ mkdir -p $GOPATH/src/github.com/digitalocean; cd $GOPATH/src/github.com/digitalocean | ||||
| $ git clone git@github.com:digitalocean/terraform-provider-digitalocean | ||||
| ``` | ||||
|  | ||||
| Enter the provider directory and build the provider | ||||
|  | ||||
| ```sh | ||||
| $ cd $GOPATH/src/github.com/digitalocean/terraform-provider-digitalocean | ||||
| $ make build | ||||
| ``` | ||||
|  | ||||
| ## Using the provider | ||||
|  | ||||
| See the | ||||
| [DigitalOcean Provider documentation](https://registry.terraform.io/providers/digitalocean/digitalocean/latest/docs) | ||||
| to get started using the DigitalOcean provider. | ||||
|  | ||||
| ## Developing the Provider | ||||
|  | ||||
| See [CONTRIBUTING.md](./CONTRIBUTING.md) for information about contributing to this | ||||
| project. | ||||
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										26
									
								
								terra/.terraform/terraform.tfstate
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								terra/.terraform/terraform.tfstate
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| { | ||||
|     "version": 3, | ||||
|     "serial": 1, | ||||
|     "lineage": "f217ec0d-a470-a8a1-bfb2-ddb62841c654", | ||||
|     "backend": { | ||||
|         "type": "pg", | ||||
|         "config": { | ||||
|             "conn_str": "postgres://terraform:B1GvfpLAtIIrA6urlZHL6dzemMYFvgmi@cluster.lab.enp.one:32421/terraform", | ||||
|             "schema_name": null, | ||||
|             "skip_index_creation": null, | ||||
|             "skip_schema_creation": null, | ||||
|             "skip_table_creation": null | ||||
|         }, | ||||
|         "hash": 1576758174 | ||||
|     }, | ||||
|     "modules": [ | ||||
|         { | ||||
|             "path": [ | ||||
|                 "root" | ||||
|             ], | ||||
|             "outputs": {}, | ||||
|             "resources": {}, | ||||
|             "depends_on": [] | ||||
|         } | ||||
|     ] | ||||
| } | ||||
| @@ -17,7 +17,7 @@ resource "digitalocean_record" "enp_en1" { | ||||
|   domain = digitalocean_domain.enp.id | ||||
|   type   = "A" | ||||
|   name   = "en1" | ||||
|   value  = digitalocean_record.enp.value | ||||
|   value  = "24.2.156.189" | ||||
|   ttl    = 3600 | ||||
| } | ||||
| 
 | ||||
| @@ -28,7 +28,7 @@ resource "digitalocean_record" "enp_vcs" { | ||||
|   domain = digitalocean_domain.enp.id | ||||
|   type   = "CNAME" | ||||
|   name   = "vcs" | ||||
|   value  = "${digitalocean_record.enp_en1.fqdn}." | ||||
|   value  = "en1.enp.one." | ||||
|   ttl    = 10600 | ||||
| } | ||||
| 
 | ||||
| @@ -36,7 +36,7 @@ resource "digitalocean_record" "enp_ssv" { | ||||
|   domain = digitalocean_domain.enp.id | ||||
|   type   = "CNAME" | ||||
|   name   = "ssv" | ||||
|   value  = "${digitalocean_record.enp_en1.fqdn}." | ||||
|   value  = "en1.enp.one." | ||||
|   ttl    = 10600 | ||||
| } | ||||
| 
 | ||||
| @@ -44,7 +44,7 @@ resource "digitalocean_record" "enp_pms" { | ||||
|   domain = digitalocean_domain.enp.id | ||||
|   type   = "CNAME" | ||||
|   name   = "pms" | ||||
|   value  = "${digitalocean_record.enp_en1.fqdn}." | ||||
|   value  = "en1.enp.one." | ||||
|   ttl    = 10600 | ||||
| } | ||||
| 
 | ||||
| @@ -52,7 +52,7 @@ resource "digitalocean_record" "enp_cdn" { | ||||
|   domain = digitalocean_domain.enp.id | ||||
|   type   = "CNAME" | ||||
|   name   = "cdn" | ||||
|   value  = "${digitalocean_cdn.enp.endpoint}." | ||||
|   value  = "en2-cdn.nyc3.cdn.digitaloceanspaces.com." | ||||
|   ttl    = 3600 | ||||
| } | ||||
| 
 | ||||
| @@ -60,15 +60,15 @@ resource "digitalocean_record" "enp_vpn" { | ||||
|   domain = digitalocean_domain.enp.id | ||||
|   type   = "CNAME" | ||||
|   name   = "vpn" | ||||
|   value  = "${digitalocean_record.enp_en1.fqdn}." | ||||
|   value  = "en1.enp.one." | ||||
|   ttl    = 10600 | ||||
| } | ||||
| 
 | ||||
| resource "digitalocean_record" "enp_www" { | ||||
| resource "digitalocean_record" "enp_web" { | ||||
|   domain = digitalocean_domain.enp.id | ||||
|   type   = "CNAME" | ||||
|   name   = "www" | ||||
|   value  = "${digitalocean_record.enp_en1.fqdn}." | ||||
|   name   = "web" | ||||
|   value  = "en1.enp.one." | ||||
|   ttl    = 10600 | ||||
| } | ||||
| 
 | ||||
| @@ -76,15 +76,7 @@ resource "digitalocean_record" "enp_sso" { | ||||
|   domain = digitalocean_domain.enp.id | ||||
|   type   = "CNAME" | ||||
|   name   = "sso" | ||||
|   value  = "${digitalocean_record.enp_en1.fqdn}." | ||||
|   ttl    = 10600 | ||||
| } | ||||
| 
 | ||||
| resource "digitalocean_record" "enp_img" { | ||||
|   domain = digitalocean_domain.enp.id | ||||
|   type   = "CNAME" | ||||
|   name   = "img" | ||||
|   value  = "${digitalocean_record.enp_en1.fqdn}." | ||||
|   value  = "en1.enp.one." | ||||
|   ttl    = 10600 | ||||
| } | ||||
| 
 | ||||
| @@ -160,41 +152,41 @@ resource "digitalocean_record" "enp_mx" { | ||||
| } | ||||
| 
 | ||||
| resource "digitalocean_record" "enp_spf" { | ||||
|   domain = digitalocean_domain.enp.id | ||||
|   type   = "TXT" | ||||
|   name   = "@" | ||||
|   value  = "v=spf1 include:spf.tutanota.de -all" | ||||
|   ttl    = 3600 | ||||
|   domain   = digitalocean_domain.enp.id | ||||
|   type     = "TXT" | ||||
|   name     = "@" | ||||
|   value    = "v=spf1 include:spf.tutanota.de -all" | ||||
|   ttl      = 3600 | ||||
| } | ||||
| 
 | ||||
| resource "digitalocean_record" "enp_domainkey1" { | ||||
|   domain = digitalocean_domain.enp.id | ||||
|   type   = "CNAME" | ||||
|   name   = "s1._domainkey" | ||||
|   value  = "s1._domainkey.tutanota.de." | ||||
|   ttl    = 10600 | ||||
|   domain   = digitalocean_domain.enp.id | ||||
|   type     = "CNAME" | ||||
|   name     = "s1._domainkey" | ||||
|   value    = "s1._domainkey.tutanota.de." | ||||
|   ttl      = 10600 | ||||
| } | ||||
| 
 | ||||
| resource "digitalocean_record" "enp_domainkey2" { | ||||
|   domain = digitalocean_domain.enp.id | ||||
|   type   = "CNAME" | ||||
|   name   = "s2._domainkey" | ||||
|   value  = "s2._domainkey.tutanota.de." | ||||
|   ttl    = 10600 | ||||
|   domain   = digitalocean_domain.enp.id | ||||
|   type     = "CNAME" | ||||
|   name     = "s2._domainkey" | ||||
|   value    = "s2._domainkey.tutanota.de." | ||||
|   ttl      = 10600 | ||||
| } | ||||
| 
 | ||||
| resource "digitalocean_record" "enp_mta1" { | ||||
|   domain = digitalocean_domain.enp.id | ||||
|   type   = "CNAME" | ||||
|   name   = "_mta-sts" | ||||
|   value  = "_mta-sts.tutanota.com." | ||||
|   ttl    = 10600 | ||||
|   domain   = digitalocean_domain.enp.id | ||||
|   type     = "CNAME" | ||||
|   name     = "_mta-sts" | ||||
|   value    = "_mta-sts.tutanota.com." | ||||
|   ttl      = 10600 | ||||
| } | ||||
| 
 | ||||
| resource "digitalocean_record" "enp_mta2" { | ||||
|   domain = digitalocean_domain.enp.id | ||||
|   type   = "CNAME" | ||||
|   name   = "mta-sts" | ||||
|   value  = "mta-sts.tutanota.com." | ||||
|   ttl    = 10600 | ||||
|   domain   = digitalocean_domain.enp.id | ||||
|   type     = "CNAME" | ||||
|   name     = "mta-sts" | ||||
|   value    = "mta-sts.tutanota.com." | ||||
|   ttl      = 10600 | ||||
| } | ||||
| @@ -9,7 +9,7 @@ resource "digitalocean_record" "enpaul" { | ||||
|   domain = digitalocean_domain.enpaul.id | ||||
|   type   = "A" | ||||
|   name   = "@" | ||||
|   value  = digitalocean_record.enp.value | ||||
|   value  = "24.2.156.189" | ||||
|   ttl    = 3600 | ||||
| } | ||||
| 
 | ||||
| @@ -83,41 +83,41 @@ resource "digitalocean_record" "enpaul_mx" { | ||||
| } | ||||
| 
 | ||||
| resource "digitalocean_record" "enpaul_spf" { | ||||
|   domain = digitalocean_domain.enpaul.id | ||||
|   type   = "TXT" | ||||
|   name   = "@" | ||||
|   value  = "v=spf1 include:spf.tutanota.de -all" | ||||
|   ttl    = 3600 | ||||
|   domain   = digitalocean_domain.enpaul.id | ||||
|   type     = "TXT" | ||||
|   name     = "@" | ||||
|   value    = "v=spf1 include:spf.tutanota.de -all" | ||||
|   ttl      = 3600 | ||||
| } | ||||
| 
 | ||||
| resource "digitalocean_record" "enpaul_domainkey1" { | ||||
|   domain = digitalocean_domain.enpaul.id | ||||
|   type   = "CNAME" | ||||
|   name   = "s1._domainkey" | ||||
|   value  = "s1._domainkey.tutanota.de." | ||||
|   ttl    = 10600 | ||||
|   domain   = digitalocean_domain.enpaul.id | ||||
|   type     = "CNAME" | ||||
|   name     = "s1._domainkey" | ||||
|   value    = "s1._domainkey.tutanota.de." | ||||
|   ttl      = 10600 | ||||
| } | ||||
| 
 | ||||
| resource "digitalocean_record" "enpaul_domainkey2" { | ||||
|   domain = digitalocean_domain.enpaul.id | ||||
|   type   = "CNAME" | ||||
|   name   = "s2._domainkey" | ||||
|   value  = "s2._domainkey.tutanota.de." | ||||
|   ttl    = 10600 | ||||
|   domain   = digitalocean_domain.enpaul.id | ||||
|   type     = "CNAME" | ||||
|   name     = "s2._domainkey" | ||||
|   value    = "s2._domainkey.tutanota.de." | ||||
|   ttl      = 10600 | ||||
| } | ||||
| 
 | ||||
| resource "digitalocean_record" "enpaul_mta1" { | ||||
|   domain = digitalocean_domain.enpaul.id | ||||
|   type   = "CNAME" | ||||
|   name   = "_mta-sts" | ||||
|   value  = "_mta-sts.tutanota.com." | ||||
|   ttl    = 10600 | ||||
|   domain   = digitalocean_domain.enpaul.id | ||||
|   type     = "CNAME" | ||||
|   name     = "_mta-sts" | ||||
|   value    = "_mta-sts.tutanota.com." | ||||
|   ttl      = 10600 | ||||
| } | ||||
| 
 | ||||
| resource "digitalocean_record" "enpaul_mta2" { | ||||
|   domain = digitalocean_domain.enpaul.id | ||||
|   type   = "CNAME" | ||||
|   name   = "mta-sts" | ||||
|   value  = "mta-sts.tutanota.com." | ||||
|   ttl    = 10600 | ||||
|   domain   = digitalocean_domain.enpaul.id | ||||
|   type     = "CNAME" | ||||
|   name     = "mta-sts" | ||||
|   value    = "mta-sts.tutanota.com." | ||||
|   ttl      = 10600 | ||||
| } | ||||
| @@ -1,5 +1,7 @@ | ||||
| terraform { | ||||
|   backend "pg" {} | ||||
|   backend "pg" { | ||||
|     conn_str = "postgres://terraform@cluster.lab.enp.one:32421/terraform" | ||||
|   } | ||||
| 
 | ||||
|   required_providers { | ||||
|     digitalocean = { | ||||
		Reference in New Issue
	
	Block a user