Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 89 additions & 0 deletions ansible/playbooks/deploy-nodes.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@
# Deploy nodes playbook: Deploy and manage Lean nodes
# Requires node_names to be specified (comma or space separated)
# This playbook runs on localhost to parse node names, then deploys to remote hosts
#
# Before deployment, it syncs essential config files from local to remote:
# - validator-config.yaml
# - node key files (*.key)
# - config.yaml, validators.yaml, nodes.yaml
# - genesis.ssz, genesis.json
# - hash-sig-keys/ directory (if exists, for qlean nodes)

- name: Parse and validate node names
hosts: localhost
Expand Down Expand Up @@ -82,6 +89,11 @@
groups: deployment_targets
loop: "{{ deploy_nodes }}"

- name: Store local genesis dir for remote plays
set_fact:
local_genesis_dir_path: "{{ genesis_dir }}"
cacheable: yes

- name: Deploy nodes on remote hosts
hosts: deployment_targets
gather_facts: yes
Expand All @@ -92,8 +104,85 @@
validator_config_file: "{{ genesis_dir }}/validator-config.yaml"
# node_name is set to inventory_hostname (which matches the node name)
node_name: "{{ inventory_hostname }}"
# Local genesis directory for syncing config files (from localhost play)
local_genesis_dir: "{{ hostvars['localhost']['local_genesis_dir_path'] }}"

tasks:
- name: Create remote genesis directory
file:
path: "{{ genesis_dir }}"
state: directory
mode: '0755'
tags:
- deploy
- sync

- name: Sync validator-config.yaml to remote host
copy:
src: "{{ local_genesis_dir }}/validator-config.yaml"
dest: "{{ genesis_dir }}/validator-config.yaml"
mode: '0644'
force: yes
tags:
- deploy
- sync

- name: Sync node key file to remote host
copy:
src: "{{ local_genesis_dir }}/{{ node_name }}.key"
dest: "{{ genesis_dir }}/{{ node_name }}.key"
mode: '0600'
force: yes
tags:
- deploy
- sync

- name: Sync essential genesis config files
copy:
src: "{{ local_genesis_dir }}/{{ item }}"
dest: "{{ genesis_dir }}/{{ item }}"
mode: '0644'
force: yes
loop:
- config.yaml
- validators.yaml
- nodes.yaml
- genesis.ssz
- genesis.json
tags:
- deploy
- sync

- name: Check if hash-sig-keys directory exists locally
stat:
path: "{{ local_genesis_dir }}/hash-sig-keys"
register: hash_sig_keys_local
delegate_to: localhost
tags:
- deploy
- sync

- name: Create hash-sig-keys directory on remote
file:
path: "{{ genesis_dir }}/hash-sig-keys"
state: directory
mode: '0755'
when: hash_sig_keys_local.stat.exists
tags:
- deploy
- sync

- name: Sync hash-sig-keys directory (for qlean nodes)
copy:
src: "{{ local_genesis_dir }}/hash-sig-keys/"
dest: "{{ genesis_dir }}/hash-sig-keys/"
mode: '0644'
force: yes
when: hash_sig_keys_local.stat.exists
tags:
- deploy
- sync

- name: Clean node data directory
raw: rm -rf {{ data_dir }}/{{ node_name }}
when:
Expand Down
10 changes: 6 additions & 4 deletions ansible/playbooks/helpers/deploy-single-node.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,22 @@
set_fact:
client_type: "{{ node_name.split('_')[0] }}"

- name: Set validator config file path
- name: Set validator config file paths
set_fact:
actual_validator_config_file: "{{ genesis_dir }}/validator-config.yaml"
local_validator_config_file: "{{ hostvars['localhost']['local_genesis_dir_path'] }}/validator-config.yaml"

- name: Extract node configuration
- name: Extract node configuration (from local config)
shell: |
yq eval ".validators[] | select(.name == \"{{ node_name }}\") | .name" {{ actual_validator_config_file }}
yq eval ".validators[] | select(.name == \"{{ node_name }}\") | .name" {{ local_validator_config_file }}
register: node_check
changed_when: false
failed_when: false
delegate_to: localhost

- name: Fail if node not found in config
fail:
msg: "Node '{{ node_name }}' not found in {{ actual_validator_config_file }}"
msg: "Node '{{ node_name }}' not found in {{ local_validator_config_file }}"
when: node_check.stdout == "" or node_check.rc != 0

- name: Set zeam validator config
Expand Down
3 changes: 2 additions & 1 deletion ansible/roles/ethlambda/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,10 @@

- name: Extract node configuration from validator-config.yaml
shell: |
yq eval ".validators[] | select(.name == \"{{ node_name }}\") | .{{ item }}" "{{ genesis_dir }}/validator-config.yaml"
yq eval ".validators[] | select(.name == \"{{ node_name }}\") | .{{ item }}" "{{ hostvars['localhost']['local_genesis_dir_path'] }}/validator-config.yaml"
register: ethlambda_node_config
changed_when: false
delegate_to: localhost
loop:
- enrFields.quic
- metricsPort
Expand Down
3 changes: 2 additions & 1 deletion ansible/roles/grandine/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,10 @@

- name: Extract node configuration from validator-config.yaml
shell: |
yq eval ".validators[] | select(.name == \"{{ node_name }}\") | .{{ item }}" "{{ genesis_dir }}/validator-config.yaml"
yq eval ".validators[] | select(.name == \"{{ node_name }}\") | .{{ item }}" "{{ hostvars['localhost']['local_genesis_dir_path'] }}/validator-config.yaml"
register: grandine_node_config
changed_when: false
delegate_to: localhost
loop:
- enrFields.quic
- privkey
Expand Down
3 changes: 2 additions & 1 deletion ansible/roles/lantern/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@

- name: Extract node configuration from validator-config.yaml
shell: |
yq eval ".validators[] | select(.name == \"{{ node_name }}\") | .{{ item }}" "{{ genesis_dir }}/validator-config.yaml"
yq eval ".validators[] | select(.name == \"{{ node_name }}\") | .{{ item }}" "{{ hostvars['localhost']['local_genesis_dir_path'] }}/validator-config.yaml"
register: lantern_node_config
changed_when: false
delegate_to: localhost
loop:
- enrFields.quic
- metricsPort
Expand Down
3 changes: 2 additions & 1 deletion ansible/roles/lighthouse/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@

- name: Extract node configuration from validator-config.yaml
shell: |
yq eval ".validators[] | select(.name == \"{{ node_name }}\") | .{{ item }}" "{{ genesis_dir }}/validator-config.yaml"
yq eval ".validators[] | select(.name == \"{{ node_name }}\") | .{{ item }}" "{{ hostvars['localhost']['local_genesis_dir_path'] }}/validator-config.yaml"
register: lighthouse_node_config
changed_when: false
delegate_to: localhost
loop:
- enrFields.quic
- metricsPort
Expand Down
6 changes: 4 additions & 2 deletions ansible/roles/qlean/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@

- name: Extract node configuration from validator-config.yaml
shell: |
yq eval ".validators[] | select(.name == \"{{ node_name }}\") | .{{ item }}" "{{ genesis_dir }}/validator-config.yaml"
yq eval ".validators[] | select(.name == \"{{ node_name }}\") | .{{ item }}" "{{ hostvars['localhost']['local_genesis_dir_path'] }}/validator-config.yaml"
register: qlean_node_config
changed_when: false
delegate_to: localhost
loop:
- enrFields.quic
- metricsPort
Expand All @@ -48,10 +49,11 @@

- name: Extract validator index from validators.yaml
shell: |
yq eval '."{{ node_name }}" | .[0]' "{{ genesis_dir }}/validators.yaml"
yq eval '."{{ node_name }}" | .[0]' "{{ hostvars['localhost']['local_genesis_dir_path'] }}/validators.yaml"
register: qlean_validator_index
changed_when: false
failed_when: false
delegate_to: localhost

- name: Set validator index
set_fact:
Expand Down
3 changes: 2 additions & 1 deletion ansible/roles/ream/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@

- name: Extract node configuration from validator-config.yaml
shell: |
yq eval ".validators[] | select(.name == \"{{ node_name }}\") | .{{ item }}" "{{ genesis_dir }}/validator-config.yaml"
yq eval ".validators[] | select(.name == \"{{ node_name }}\") | .{{ item }}" "{{ hostvars['localhost']['local_genesis_dir_path'] }}/validator-config.yaml"
register: ream_node_config
changed_when: false
delegate_to: localhost
loop:
- enrFields.quic
- metricsPort
Expand Down
3 changes: 2 additions & 1 deletion ansible/roles/zeam/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,10 @@

- name: Extract node configuration from validator-config.yaml
shell: |
yq eval ".validators[] | select(.name == \"{{ node_name }}\") | .{{ item }}" "{{ genesis_dir }}/validator-config.yaml"
yq eval ".validators[] | select(.name == \"{{ node_name }}\") | .{{ item }}" "{{ hostvars['localhost']['local_genesis_dir_path'] }}/validator-config.yaml"
register: node_config
changed_when: false
delegate_to: localhost
loop:
- metricsPort
- privkey
Expand Down
2 changes: 1 addition & 1 deletion client-cmds/grandine-cmd.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ node_binary="$grandine_bin \
--address 0.0.0.0 \
--hash-sig-key-dir $configDir/hash-sig-keys"

node_docker="sifrai/lean:unstable \
node_docker="sifrai/lean:devnet-2 \
--genesis /config/config.yaml \
--validator-registry-path /config/validators.yaml \
--bootnodes /config/nodes.yaml \
Expand Down
11 changes: 8 additions & 3 deletions spin-node.sh
Original file line number Diff line number Diff line change
Expand Up @@ -237,9 +237,14 @@ for item in "${spin_nodes[@]}"; do
# create and/or cleanup datadirs
itemDataDir="$dataDir/$item"
mkdir -p $itemDataDir
cmd="sudo rm -rf $itemDataDir/*"
echo $cmd
eval $cmd
if [ -n "$cleanData" ]; then
cmd="rm -rf \"$itemDataDir\"/*"
if [ -n "$dockerWithSudo" ]; then
cmd="sudo $cmd"
fi
echo "$cmd"
eval "$cmd"
fi

# parse validator-config.yaml for $item to load args values
source parse-vc.sh
Expand Down