From cae6a0ea4a261bfffd5398c74c0cb14c807e58f8 Mon Sep 17 00:00:00 2001 From: Larry Huang Date: Sun, 1 Sep 2019 17:24:38 +0800 Subject: [PATCH] add linode as one of cloud providers --- config.cfg | 3 ++ input.yml | 1 + roles/cloud-linode/defaults/main.yml | 2 + roles/cloud-linode/tasks/main.yml | 19 ++++++++++ roles/cloud-linode/tasks/prompts.yml | 55 ++++++++++++++++++++++++++++ 5 files changed, 80 insertions(+) create mode 100644 roles/cloud-linode/defaults/main.yml create mode 100644 roles/cloud-linode/tasks/main.yml create mode 100644 roles/cloud-linode/tasks/prompts.yml diff --git a/config.cfg b/config.cfg index 5172900..131fb8c 100644 --- a/config.cfg +++ b/config.cfg @@ -198,6 +198,9 @@ cloud_providers: vultr: os: Ubuntu 20.04 x64 size: 1024 MB RAM,25 GB SSD,1.00 TB BW + linode: + type: g6-nanode-1 + image: linode/ubuntu19.04 local: fail_hint: diff --git a/input.yml b/input.yml index 1b06dec..6415acc 100644 --- a/input.yml +++ b/input.yml @@ -21,6 +21,7 @@ - { name: Scaleway, alias: scaleway} - { name: OpenStack (DreamCompute optimised), alias: openstack } - { name: CloudStack (Exoscale optimised), alias: cloudstack } + - { name: Linode, alias: linode } - { name: "Install to existing Ubuntu 18.04 or 20.04 server (for more advanced users)", alias: local } vars_files: - config.cfg diff --git a/roles/cloud-linode/defaults/main.yml b/roles/cloud-linode/defaults/main.yml new file mode 100644 index 0000000..76a6249 --- /dev/null +++ b/roles/cloud-linode/defaults/main.yml @@ -0,0 +1,2 @@ +--- +linode_venv: "{{ playbook_dir }}/configs/.venvs/linode" diff --git a/roles/cloud-linode/tasks/main.yml b/roles/cloud-linode/tasks/main.yml new file mode 100644 index 0000000..5c500a4 --- /dev/null +++ b/roles/cloud-linode/tasks/main.yml @@ -0,0 +1,19 @@ +--- +- name: Include prompts + import_tasks: prompts.yml + +- name: "Creating an instance..." + linode_v4: + access_token: "{{ algo_linode_token }}" + label: "{{ algo_server_name }}" + state: present + region: "{{ algo_linode_region }}" + image: "{{ cloud_providers.linode.image }}" + type: "{{ cloud_providers.linode.type }}" + authorized_keys: "{{ public_key }}" + root_pass: "{{ algo_linode_password }}" + register: _linode + +- set_fact: + cloud_instance_ip: "{{ _linode.instance.ipv4[0] }}" + ansible_ssh_user: root diff --git a/roles/cloud-linode/tasks/prompts.yml b/roles/cloud-linode/tasks/prompts.yml new file mode 100644 index 0000000..2750792 --- /dev/null +++ b/roles/cloud-linode/tasks/prompts.yml @@ -0,0 +1,55 @@ +--- +- pause: + prompt: | + Enter your ACCESS token. (https://developers.linode.com/api/v4/#access-and-authentication): + echo: false + register: _linode_token + when: + - linode_token is undefined + - lookup('env','LINODE_API_TOKEN')|length <= 0 + +- name: Set the token as a fact + set_fact: + algo_linode_token: "{{ linode_token | default(_linode_token.user_input|default(None)) | default(lookup('env','linode_API_TOKEN'), true) }}" + +- name: Get regions + uri: + url: https://api.linode.com/v4/regions + method: GET + status_code: 200 + register: _linode_regions + +- name: Set facts about the regions + set_fact: + linode_regions: "{{ _linode_regions.json.data | sort(attribute='id') }}" + +- name: Set default region + set_fact: + default_region: 1 + +- pause: + prompt: | + What region should the server be located in? + {% for r in linode_regions %} + {{ loop.index }}. {{ r['country'] }} + {% endfor %} + + Enter the number of your desired region + [{{ default_region }}] + register: _algo_region + when: region is undefined + +- pause: + prompt: | + Enter root password of this instance. + echo: false + register: _linode_root_password + +- name: Set additional facts + set_fact: + algo_linode_region: >- + {% if region is defined %}{{ region }} + {%- elif _algo_region.user_input %}{{ linode_regions[_algo_region.user_input | int -1 ]['id'] }} + {%- else %}{{ linode_regions[default_region | int - 1]['id'] }}{% endif %} + algo_linode_password: "{{_linode_root_password.user_input}}" + public_key: "{{ lookup('file', '{{ SSH_keys.public }}') }}"