85 lines
3.3 KiB
YAML
85 lines
3.3 KiB
YAML
---
|
|
# Linode/initial-infrastructure.yml
|
|
# This playbook only creates the Linode instances without trying to configure them
|
|
# This separation makes the deployment more reliable
|
|
|
|
- name: Create Linode infrastructure
|
|
hosts: localhost
|
|
gather_facts: false
|
|
connection: local
|
|
vars_files:
|
|
- vars.yaml
|
|
vars:
|
|
# Default values if not provided
|
|
ssh_user: "{{ ssh_user | default('root') }}"
|
|
linode_region: "{{ linode_region | default(region_choices | random) }}"
|
|
plan: "{{ plan | default('g6-standard-2') }}"
|
|
image: "{{ image | default('linode/kali') }}"
|
|
|
|
# Determine what to deploy based on configuration
|
|
deploy_redirector: "{{ not (c2_only | default(false)) }}"
|
|
deploy_c2: "{{ not (redirector_only | default(false)) }}"
|
|
|
|
# Generate random names if not provided
|
|
redirector_name: "{{ redirector_name | default('srv-' + 100000000 | random | to_uuid | hash('md5') | truncate(8, True, '')) }}"
|
|
c2_name: "{{ c2_name | default('node-' + 100000000 | random | to_uuid | hash('md5') | truncate(8, True, '')) }}"
|
|
|
|
tasks:
|
|
- name: Validate required Linode token
|
|
assert:
|
|
that:
|
|
- linode_token is defined and linode_token != ""
|
|
fail_msg: "Linode API token is required. Set linode_token in vars.yaml or via --linode-token."
|
|
|
|
- name: Create redirector Linode instance
|
|
community.general.linode_v4:
|
|
access_token: "{{ linode_token }}"
|
|
label: "{{ redirector_name }}"
|
|
type: "{{ plan }}"
|
|
region: "{{ linode_region }}"
|
|
image: "{{ image }}"
|
|
root_pass: "{{ lookup('password', '/dev/null length=24 chars=ascii_letters,digits') }}"
|
|
authorized_keys:
|
|
- "{{ lookup('file', ssh_key_path) }}"
|
|
state: present
|
|
register: redirector_instance
|
|
when: deploy_redirector
|
|
|
|
- name: Set redirector_ip for later use
|
|
set_fact:
|
|
redirector_instance_id: "{{ redirector_instance.instance.id }}"
|
|
redirector_ip: "{{ redirector_instance.instance.ipv4[0] }}"
|
|
when: deploy_redirector and redirector_instance is defined
|
|
|
|
- name: Create C2 Linode instance
|
|
community.general.linode_v4:
|
|
access_token: "{{ linode_token }}"
|
|
label: "{{ c2_name }}"
|
|
type: "{{ plan }}"
|
|
region: "{{ linode_region }}"
|
|
image: "{{ image }}"
|
|
root_pass: "{{ lookup('password', '/dev/null length=24 chars=ascii_letters,digits') }}"
|
|
authorized_keys:
|
|
- "{{ lookup('file', ssh_key_path) }}"
|
|
state: present
|
|
register: c2_instance
|
|
when: deploy_c2
|
|
|
|
- name: Set c2_ip for later use
|
|
set_fact:
|
|
c2_instance_id: "{{ c2_instance.instance.id }}"
|
|
c2_ip: "{{ c2_instance.instance.ipv4[0] }}"
|
|
when: deploy_c2 and c2_instance is defined
|
|
|
|
- name: Display instance information
|
|
debug:
|
|
msg:
|
|
- "Linode instances created successfully!"
|
|
- "Waiting for instances to initialize..."
|
|
- "{{ 'Redirector IP: ' + redirector_ip if redirector_ip is defined else 'No redirector deployed' }}"
|
|
- "{{ 'C2 Server IP: ' + c2_ip if c2_ip is defined else 'No C2 server deployed' }}"
|
|
|
|
- name: Wait for instances to initialize (30 seconds)
|
|
pause:
|
|
seconds: 30
|
|
when: (deploy_redirector and redirector_instance is defined) or (deploy_c2 and c2_instance is defined) |