diff --git a/ansible/ansible.cfg b/ansible/ansible.cfg index 4081958..90182ed 100644 --- a/ansible/ansible.cfg +++ b/ansible/ansible.cfg @@ -1,7 +1,7 @@ [defaults] ansible_managed = Ansible managed. Don't change this file manually. Template info: {{{{ (template_fullpath | replace(playbook_dir,'')) }}}} stdout_callback = yaml -inventory = inventories/devnet-4/inventory.ini, inventories/devnet-4/hetzner_inventory.ini +inventory = inventories/devnet-5/inventory.ini, inventories/devnet-5/hetzner_inventory.ini, inventories/devnet-5/hive_inventory.ini roles_path = vendor/roles/:roles collections_path = vendor/collections forks = 50 @@ -16,7 +16,7 @@ fact_caching = jsonfile # Keep facts forever fact_caching_timeout = 0 # Where to store the fact cache -fact_caching_connection = tmp/devnet-4/ +fact_caching_connection = tmp/devnet-5/ [inventory] enable_plugins = script, yaml, ini diff --git a/ansible/inventories/devnet-4/inventory.ini b/ansible/inventories/devnet-4/inventory.ini deleted file mode 100755 index 1037e14..0000000 --- a/ansible/inventories/devnet-4/inventory.ini +++ /dev/null @@ -1,266 +0,0 @@ -localhost - -[all:vars] -ethereum_network_name=pectra-devnet-4 - -[bootnode] -bootnode-1 ansible_host=209.38.212.82 ipv6=2a03:b0c0:3:f0::1c31:f000 cloud=digitalocean cloud_region=fra1 - -[grandine_besu] -grandine-besu-1 ansible_host=157.230.126.12 ipv6=2a03:b0c0:3:f0::1c32:e000 cloud=digitalocean cloud_region=fra1 validator_start=9840 validator_end=9920 - -[grandine_erigon] -grandine-erigon-1 ansible_host=46.101.187.231 ipv6=2a03:b0c0:3:f0::1c32:c000 cloud=digitalocean cloud_region=fra1 validator_start=9920 validator_end=10000 - -[grandine_ethereumjs] -grandine-ethereumjs-1 ansible_host=46.101.182.113 ipv6=2a03:b0c0:3:f0::1c32:b000 cloud=digitalocean cloud_region=fra1 validator_start=9750 validator_end=9760 - -[grandine_geth] -grandine-geth-1 ansible_host=64.226.98.213 ipv6=2a03:b0c0:3:f0::1c32:6000 cloud=digitalocean cloud_region=fra1 validator_start=9000 validator_end=9250 -grandine-geth-2 ansible_host=188.166.66.14 ipv6=2a03:b0c0:2:f0::11f4:7001 cloud=digitalocean cloud_region=ams3 validator_start=9250 validator_end=9500 - -[grandine_nethermind] -grandine-nethermind-1 ansible_host=68.183.67.170 ipv6=2a03:b0c0:3:f0::1c32:8000 cloud=digitalocean cloud_region=fra1 validator_start=9500 validator_end=9750 - -[grandine_reth] -grandine-reth-1 ansible_host=46.101.181.121 ipv6=2a03:b0c0:3:f0::1c32:a000 cloud=digitalocean cloud_region=fra1 validator_start=9760 validator_end=9840 - -[lighthouse_besu] -lighthouse-besu-1 ansible_host=165.22.71.145 ipv6=2a03:b0c0:3:f0::1c33:d000 cloud=digitalocean cloud_region=fra1 validator_start=4600 validator_end=4800 - -[lighthouse_erigon] -lighthouse-erigon-1 ansible_host=64.226.91.18 ipv6=2a03:b0c0:3:f0::1c31:a000 cloud=digitalocean cloud_region=fra1 validator_start=4800 validator_end=5000 - -[lighthouse_ethereumjs] -lighthouse-ethereumjs-1 ansible_host=134.122.88.5 ipv6=2a03:b0c0:3:f0::1c31:6000 cloud=digitalocean cloud_region=fra1 validator_start=4375 validator_end=4400 - -[lighthouse_geth] -lighthouse-geth-1 ansible_host=134.122.90.191 ipv6=2a03:b0c0:3:f0::1c31:5000 cloud=digitalocean cloud_region=fra1 validator_start=2500 validator_end=2750 -lighthouse-geth-2 ansible_host=152.42.136.171 ipv6=2a03:b0c0:2:f0::11f4:d001 cloud=digitalocean cloud_region=ams3 validator_start=2750 validator_end=3000 -lighthouse-geth-3 ansible_host=209.38.167.98 ipv6=2a03:b0c0:1:e0::1275:1 cloud=digitalocean cloud_region=lon1 validator_start=3000 validator_end=3250 -lighthouse-geth-4 ansible_host=206.189.141.51 ipv6=2400:6180:100:d0::2300:f001 cloud=digitalocean cloud_region=blr1 validator_start=3250 validator_end=3500 -lighthouse-geth-5 ansible_host=143.198.129.174 ipv6=2604:a880:4:1d0::1667:e000 cloud=digitalocean cloud_region=sfo3 validator_start=3500 validator_end=3750 - -[lighthouse_nethermind] -lighthouse-nethermind-1 ansible_host=207.154.199.216 ipv6=2a03:b0c0:3:f0::1c31:2000 cloud=digitalocean cloud_region=fra1 validator_start=3750 validator_end=3959 -lighthouse-nethermind-2 ansible_host=159.223.217.228 ipv6=2a03:b0c0:2:f0::11f4:6001 cloud=digitalocean cloud_region=ams3 validator_start=3959 validator_end=4167 -lighthouse-nethermind-3 ansible_host=178.62.103.204 ipv6=2a03:b0c0:1:e0::1275:4001 cloud=digitalocean cloud_region=lon1 validator_start=4167 validator_end=4375 - -[lighthouse_nimbusel] -lighthouse-nimbusel-1 ansible_host=104.248.134.180 ipv6=2a03:b0c0:3:f0::2208:2000 cloud=digitalocean cloud_region=fra1 - -[lighthouse_reth] -lighthouse-reth-1 ansible_host=46.101.218.168 ipv6=2a03:b0c0:3:f0::1c33:4000 cloud=digitalocean cloud_region=fra1 validator_start=4400 validator_end=4600 - -[lodestar_besu] -lodestar-besu-1 ansible_host=104.248.37.253 ipv6=2a03:b0c0:3:f0::1c33:5000 cloud=digitalocean cloud_region=fra1 validator_start=7840 validator_end=7920 - -[lodestar_erigon] -lodestar-erigon-1 ansible_host=64.226.106.119 ipv6=2a03:b0c0:3:f0::1c32:d000 cloud=digitalocean cloud_region=fra1 validator_start=7920 validator_end=8000 - -[lodestar_ethereumjs] -lodestar-ethereumjs-1 ansible_host=68.183.74.159 ipv6=2a03:b0c0:3:f0::1c32:7000 cloud=digitalocean cloud_region=fra1 validator_start=7750 validator_end=7760 - -[lodestar_geth] -lodestar-geth-1 ansible_host=164.92.200.236 ipv6=2a03:b0c0:3:f0::1c33:9000 cloud=digitalocean cloud_region=fra1 validator_start=7000 validator_end=7250 -lodestar-geth-2 ansible_host=167.71.66.31 ipv6=2a03:b0c0:2:f0::11f4:b001 cloud=digitalocean cloud_region=ams3 validator_start=7250 validator_end=7500 - -[lodestar_nethermind] -lodestar-nethermind-1 ansible_host=138.68.106.63 ipv6=2a03:b0c0:3:f0::1c31:3000 cloud=digitalocean cloud_region=fra1 validator_start=7500 validator_end=7750 - -[lodestar_reth] -lodestar-reth-1 ansible_host=167.172.170.199 ipv6=2a03:b0c0:3:f0::1c32:f000 cloud=digitalocean cloud_region=fra1 validator_start=7760 validator_end=7840 - -[nimbus_besu] -nimbus-besu-1 ansible_host=164.92.251.42 ipv6=2a03:b0c0:3:f0::1c32:0 cloud=digitalocean cloud_region=fra1 validator_start=8840 validator_end=8920 - -[nimbus_erigon] -nimbus-erigon-1 ansible_host=46.101.167.161 ipv6=2a03:b0c0:3:f0::1c33:b000 cloud=digitalocean cloud_region=fra1 validator_start=8920 validator_end=9000 - -[nimbus_ethereumjs] -nimbus-ethereumjs-1 ansible_host=209.38.211.167 ipv6=2a03:b0c0:3:f0::1c33:6000 cloud=digitalocean cloud_region=fra1 validator_start=8750 validator_end=8760 - -[nimbus_geth] -nimbus-geth-1 ansible_host=64.226.109.85 ipv6=2a03:b0c0:3:f0::1c32:9000 cloud=digitalocean cloud_region=fra1 validator_start=8000 validator_end=8250 -nimbus-geth-2 ansible_host=209.38.39.57 ipv6=2a03:b0c0:2:f0::11f4:e001 cloud=digitalocean cloud_region=ams3 validator_start=8250 validator_end=8500 - -[nimbus_nethermind] -nimbus-nethermind-1 ansible_host=209.38.233.13 ipv6=2a03:b0c0:3:f0::1c32:1000 cloud=digitalocean cloud_region=fra1 validator_start=8500 validator_end=8750 - -[nimbus_reth] -nimbus-reth-1 ansible_host=46.101.168.228 ipv6=2a03:b0c0:3:f0::1c33:c000 cloud=digitalocean cloud_region=fra1 validator_start=8760 validator_end=8840 - -[prysm_besu] -prysm-besu-1 ansible_host=64.226.89.138 ipv6=2a03:b0c0:3:f0::1c32:3000 cloud=digitalocean cloud_region=fra1 validator_start=2100 validator_end=2300 - -[prysm_erigon] -prysm-erigon-1 ansible_host=64.226.87.210 ipv6=2a03:b0c0:3:f0::1c31:b000 cloud=digitalocean cloud_region=fra1 validator_start=2300 validator_end=2500 - -[prysm_ethereumjs] -prysm-ethereumjs-1 ansible_host=209.38.210.120 ipv6=2a03:b0c0:3:f0::1c31:9000 cloud=digitalocean cloud_region=fra1 validator_start=1875 validator_end=1900 - -[prysm_geth] -prysm-geth-1 ansible_host=159.65.117.74 ipv6=2a03:b0c0:3:f0::1c34:0 cloud=digitalocean cloud_region=fra1 validator_start=0 validator_end=250 -prysm-geth-2 ansible_host=159.223.224.155 ipv6=2a03:b0c0:2:f0::11f4:8001 cloud=digitalocean cloud_region=ams3 validator_start=250 validator_end=500 -prysm-geth-3 ansible_host=138.68.145.75 ipv6=2a03:b0c0:1:e0::1275:3001 cloud=digitalocean cloud_region=lon1 validator_start=500 validator_end=750 -prysm-geth-4 ansible_host=143.244.133.173 ipv6=2400:6180:100:d0::2301:1001 cloud=digitalocean cloud_region=blr1 validator_start=750 validator_end=1000 -prysm-geth-5 ansible_host=64.23.245.252 ipv6=2604:a880:4:1d0::1667:f000 cloud=digitalocean cloud_region=sfo3 validator_start=1000 validator_end=1250 - -[prysm_nethermind] -prysm-nethermind-1 ansible_host=165.232.115.241 ipv6=2a03:b0c0:3:f0::1c33:f000 cloud=digitalocean cloud_region=fra1 validator_start=1250 validator_end=1459 -prysm-nethermind-2 ansible_host=128.199.46.94 ipv6=2a03:b0c0:2:f0::11f4:c001 cloud=digitalocean cloud_region=ams3 validator_start=1459 validator_end=1667 -prysm-nethermind-3 ansible_host=64.227.45.213 ipv6=2a03:b0c0:1:e0::1275:2001 cloud=digitalocean cloud_region=lon1 validator_start=1667 validator_end=1875 - -[prysm_reth] -prysm-reth-1 ansible_host=165.227.163.101 ipv6=2a03:b0c0:3:f0::1c33:0 cloud=digitalocean cloud_region=fra1 validator_start=1900 validator_end=2100 - -[teku_besu] -teku-besu-1 ansible_host=164.92.226.184 ipv6=2a03:b0c0:3:f0::1c33:a000 cloud=digitalocean cloud_region=fra1 validator_start=6680 validator_end=6840 - -[teku_erigon] -teku-erigon-1 ansible_host=159.89.0.19 ipv6=2a03:b0c0:3:f0::1c33:2000 cloud=digitalocean cloud_region=fra1 validator_start=6840 validator_end=7000 - -[teku_ethereumjs] -teku-ethereumjs-1 ansible_host=164.92.132.61 ipv6=2a03:b0c0:3:f0::1c32:5000 cloud=digitalocean cloud_region=fra1 validator_start=6500 validator_end=6520 - -[teku_geth] -teku-geth-1 ansible_host=68.183.221.117 ipv6=2a03:b0c0:3:f0::1c31:7000 cloud=digitalocean cloud_region=fra1 validator_start=5000 validator_end=5250 -teku-geth-2 ansible_host=178.62.235.174 ipv6=2a03:b0c0:2:f0::11f4:f001 cloud=digitalocean cloud_region=ams3 validator_start=5250 validator_end=5500 -teku-geth-3 ansible_host=167.99.199.167 ipv6=2a03:b0c0:1:e0::1275:1001 cloud=digitalocean cloud_region=lon1 validator_start=5500 validator_end=5750 -teku-geth-4 ansible_host=64.227.151.87 ipv6=2400:6180:100:d0::2301:1 cloud=digitalocean cloud_region=blr1 validator_start=5750 validator_end=6000 - -[teku_nethermind] -teku-nethermind-1 ansible_host=64.226.127.29 ipv6=2a03:b0c0:3:f0::1c34:1000 cloud=digitalocean cloud_region=fra1 validator_start=6000 validator_end=6250 -teku-nethermind-2 ansible_host=206.189.0.32 ipv6=2a03:b0c0:2:f0::11f4:9001 cloud=digitalocean cloud_region=ams3 validator_start=6250 validator_end=6500 - -[teku_reth] -teku-reth-1 ansible_host=207.154.199.155 ipv6=2a03:b0c0:3:f0::1c31:4000 cloud=digitalocean cloud_region=fra1 validator_start=6520 validator_end=6680 - -[xatu] -xatu-1 ansible_host=159.89.1.233 ipv6=2a03:b0c0:3:f0::1c33:3000 cloud=digitalocean cloud_region=fra1 - - -# Consensus client groups - -[lighthouse:children] -lighthouse_besu -lighthouse_erigon -lighthouse_ethereumjs -lighthouse_geth -lighthouse_nethermind -lighthouse_nimbusel -lighthouse_reth -[lodestar:children] -lodestar_besu -lodestar_erigon -lodestar_ethereumjs -lodestar_geth -lodestar_nethermind -lodestar_reth -[nimbus:children] -nimbus_besu -nimbus_erigon -nimbus_ethereumjs -nimbus_geth -nimbus_nethermind -nimbus_reth -[teku:children] -teku_besu -teku_erigon -teku_ethereumjs -teku_geth -teku_nethermind -teku_reth -[prysm:children] -prysm_besu -prysm_erigon -prysm_ethereumjs -prysm_geth -prysm_nethermind -prysm_reth -[grandine:children] -grandine_besu -grandine_erigon -grandine_ethereumjs -grandine_geth -grandine_nethermind -grandine_reth - -# Execution client groups - -[besu:children] -grandine_besu -lighthouse_besu -lodestar_besu -nimbus_besu -prysm_besu -teku_besu -[ethereumjs:children] -grandine_ethereumjs -lighthouse_ethereumjs -lodestar_ethereumjs -nimbus_ethereumjs -prysm_ethereumjs -teku_ethereumjs -[geth:children] -grandine_geth -lighthouse_geth -lodestar_geth -nimbus_geth -prysm_geth -teku_geth -[nethermind:children] -grandine_nethermind -lighthouse_nethermind -lodestar_nethermind -nimbus_nethermind -prysm_nethermind -teku_nethermind -[erigon:children] -grandine_erigon -lighthouse_erigon -lodestar_erigon -nimbus_erigon -prysm_erigon -teku_erigon -[reth:children] -grandine_reth -lighthouse_reth -lodestar_reth -nimbus_reth -prysm_reth -teku_reth -[nimbusel:children] -lighthouse_nimbusel - -# Global groups - -[consensus_node:children] -grandine -lighthouse -lodestar -nimbus -prysm -teku - -[execution_node:children] -besu -erigon -ethereumjs -geth -nethermind -nimbusel -reth - -[ethereum_node:children] -consensus_node -execution_node - -[tx_fuzz_blobs:children] -bootnode - -[tx_fuzz_txs:children] -bootnode - -[goomy:children] -bootnode \ No newline at end of file diff --git a/ansible/inventories/devnet-5/group_vars/all/00-defaults.yaml b/ansible/inventories/devnet-5/group_vars/all/00-defaults.yaml new file mode 100644 index 0000000..2f9e5e3 --- /dev/null +++ b/ansible/inventories/devnet-5/group_vars/all/00-defaults.yaml @@ -0,0 +1,61 @@ +ansible_user: devops +ansible_python_interpreter: /usr/bin/python3 +devnet_name: pectra + +# IPv6 Specific configuration +global_ipv6_enabled: true +global_ipv6_subnet_ranges: + hetzner: "64" + digitalocean: "124" + +###################################################### +## +## Role specific overwrites +## +###################################################### + +# role: ethpandaops.general.bootstrap +bootstrap_user: root +bootstrap_default_user_authorized_keys_github: + # - barnabasbusa + # - parithosh + # - samcm + # - savid + # - skylenet + +# role: robertdebock.fail2ban +fail2ban_loglevel: INFO +fail2ban_logtarget: /var/log/fail2ban.log +fail2ban_maxretry: 10 +fail2ban_bantime: 600 +fail2ban_ignoreips: + - "127.0.0.1/8 ::1" + - "{{ lookup('ansible.builtin.url', 'http://ifconfig.me/ip', split_lines=False) }}/32" # Avoid banning ourself + + +# role: ethpandaops.general.docker_network +docker_network_name: shared +docker_network_enable_ipv6: "{{ global_ipv6_enabled }}" +docker_network_ipam_config: >- + {{ global_ipv6_enabled | ternary( + [ { 'subnet': ansible_default_ipv6.address | ansible.utils.ipsubnet(global_ipv6_subnet_ranges[hostvars[inventory_hostname]['cloud']]) } ] + , []) + }} + +docker_networks_shared: + - name: "{{ docker_network_name }}" + +# role: geerlingguy.docker +docker_users: + - devops +docker_daemon_options: + "log-driver": "json-file" + "log-opts": + "max-size": "250m" + "max-file": "2" + +# role: ethpandaops.general.prometheus +prometheus_container_networks: "{{ docker_networks_shared }}" + +# role: ethpandaops.general.ethereum_node +ethereum_node_images_always_pull: true diff --git a/ansible/inventories/devnet-5/group_vars/all/all.sops.yaml b/ansible/inventories/devnet-5/group_vars/all/all.sops.yaml new file mode 100644 index 0000000..0a55bc6 --- /dev/null +++ b/ansible/inventories/devnet-5/group_vars/all/all.sops.yaml @@ -0,0 +1,157 @@ +secret_zerossl: + ACME_EAB_KID: ENC[AES256_GCM,data:NZhVa284ThSPL6QgW6hul8ARiL027A==,iv:A6gf7vpEL0lpxY4WBmWgYE/6HPGRtnYyh4eLUr7j+TI=,tag:MVH4F9syIzvDsbTrLM2gZg==,type:str] + ACME_EAB_HMAC_KEY: ENC[AES256_GCM,data:6pMk3Y2+o9awMgWtpdqU9gkCS3l8Dj8lYNMZi2vln2kweFbBrhgnuN3vBOqbN04rZJA3vx0CjcUmSqAasB8edp4kLjFPuoMNyc30umHufkQptPhrQYc=,iv:f+OmczQTmEHCsAWj7vLpcvflA/ceplQRarFivXJz40o=,tag:9BQXFzK+tgGgd6yLckytlw==,type:str] +secret_prometheus_remote_write: + username: ENC[AES256_GCM,data:+DWCI7Nn3coqJUymu/w8,iv:8PdwM2L5R6rFfyqePBT0YH+LSF1zfgmL667oyG/CyJY=,tag:bq29JLJDh7sb+jbOXHb+PQ==,type:str] + password: ENC[AES256_GCM,data:TxbhJ9EwjTD3SQykFrSeqww0RRXqopWqxlgIbFLl2p+1L4xi,iv:8kEvWNussOdss0H6r5aM7hyUMLMeoTXfoHOpb3Pc1Ew=,tag:LxW1NpYawic1OOzoH0raQA==,type:str] +secret_loki: + endpoint: ENC[AES256_GCM,data:G/7+A80nNGaH5FFI6aOkXgfc6moleUry5cuxTVWPCzXIpUHomJDiZc8ydYQR4b0+czll/WO0CmY=,iv:uIXo4SFwDNFkQphYdm7PP/2v9YrY28wFH13JpoBQFQU=,tag:1039du7h+aUcypSWLK7jVw==,type:str] + username: ENC[AES256_GCM,data:RVgitvXxxlour8Onn2e0,iv:JQR899UGlqaEmqb08Wq0N6c4ja6rXb2QFZpkQeLcclQ=,tag:0PeB2v1C/0APJ8Z3NxDmnw==,type:str] + password: ENC[AES256_GCM,data:D0Jljolf2rYAZFvFdgWmYEv3ZY2S8NcdfUJ1AV2muzztoUV9,iv:L7S5BJ/iE3c6KJq6f2mEbvHpbZzILhMnvm4wtpc4O+4=,tag:JNwuscEUgxr/+Xi6FKsw/w==,type:str] +secret_nginx_shared_basic_auth: + name: ENC[AES256_GCM,data:bjlM,iv:DiOGlqfOfrDlt7X4OGY27OYlkDDEHguv+kg1zRhBek0=,tag:ZPlucwl2PNXeXcOc8PmCBQ==,type:str] + password: ENC[AES256_GCM,data:1U4urtqEYsjWUpdiIZnt,iv:Ui2h5A/vXI+NoAvXzbaE1v67w9CD9yy60xS61bDc1uI=,tag:7QL+GJdv3Uzdcs5xDnPOHQ==,type:str] +secret_ethstats: ENC[AES256_GCM,data:8S3aC+TryCxMm2eSZ1b34sOW5U7LD6M=,iv:PQvjGbj/Fq4E9KJy5E8PtS/dyOdrQgMpbg/7UY1fe8w=,tag:vuG8ZCsx5LCx3qqxf+d5yQ==,type:str] +ethstats_secret: ENC[AES256_GCM,data:it+grqfCWzVXe6akT/9plt5Ux5y2YbU=,iv:DjTXVYT9C8CWvIb8JvZJW/1/JjdTSMk2TbsF8xljqQ8=,tag:oSfkcsvki1Bb5Y/A/d7Pvw==,type:str] +secret_genesis_mnemonic: ENC[AES256_GCM,data:MILGlFDIsVhL/KLYehzZPbouuu1xNtZnJDxxkeEadyF08Pr0llAQCq8DM2wfhLUpAazJSBej8Rfi7/gjQ6gk+NZWVfCEaM9sR93E9n/gdNgn9ZQsngqQ5BOpaoGsnUaUR1VaCDJw2n1yI7ETQo8UnSFg60O+b3RV0wWMBSYiXr+BkSiv4o65+2drPTIgMNNmgmVkTP3NRME6ElFyEjaFcddR43Kc,iv:qtczfIEALaFLHfHl4wfBXe5UOWbH+FPYckE/8+7nDZA=,tag:tP7ZWyvgr9r8CWEWH8qBfw==,type:str] +secret_mev_signingkey: ENC[AES256_GCM,data:7xug6L4MXETqWb7cmZS6BpAxBercs4mnJEg1NKp+LwZjCWl5pPAlTbfZASwXVBMo24Xoqi9/FbjeJML6WtaJ2Q==,iv:UGcVz81+wBNdb4cmkg9t4tSamqOaBUfWk6glh/6jUA8=,tag:W5Y00+vamA2tq2tEpAEhQA==,type:str] +secret_mev_flood_private_key: ENC[AES256_GCM,data:2vVJ+N0XLer202Dc5J2HVjTEW6XUa+LpmhS/mo2brt+qzabraTSaD7d4P5rVqbovW+W5Je5FdDr4s7rScyn/RA==,iv:1qNfUVqJ9eebRmA4Ly59KFR9WmaQ8eelSvNLJAWCJ10=,tag:knDhqt3zak1OEsHi2nQ3oA==,type:str] +secret_mev_flood_user_key: ENC[AES256_GCM,data:+XXSXUZdEKClV09Pfy/YWULlRl+5njMWcKOvPwuF6YUWHP2spLbJa8BnOimxxi6v7ioGMXEZW7XROVqqQiY4Aw==,iv:efkOBcrGeGJwT91SR+2wFI/fpnWASQeqjH3MJSIQBAA=,tag:KjJMfc7VgZkc8cy/IHrNNA==,type:str] +tx_fuzz_blobs_privkey: ENC[AES256_GCM,data:XUiDF6puTOcP0veM5k2x9PmPSA2vP1FeoxSY7rn0bxLMB0b/DsB7y7bfsjBlgPIiL9f2AOSfsol8WWxd3zT6IA==,iv:qTk22/lpJyWFycayBupQp0sBaw2E2oq7peWypQh+0Ic=,tag:Eeqpv2JCfrsQd5ovOcpdVg==,type:str] +tx_fuzz_txs_privkey: ENC[AES256_GCM,data:c52KtPzcxyZPj3vQ6tx0Di5uLFy5JoRUSZ5ZH/WEj7nqC7JTwRw3+bNPk8Y43wjE7caqRZ7eq0la0Bc42ydpew==,iv:gHO+ttqzJCbRBCUvmlsTVNQK6vpnGXamIag63HS/fas=,tag:1Qultc6tndFGDuSKjm/TVg==,type:str] +goomy_private_key: ENC[AES256_GCM,data:+AwqAcOobrvR5gXxdABQki0rH41Ns8H3sJvVtQb5sh/596u1oDPq2bEh6Tpkfx8B+x4rSp+MRQi5wHwk9/Nqcw==,iv:Ibm4sLvU+tNk7EqaSPs/2CRLU1yLlNDgSWjR+uNPrvQ=,tag:oWbWW/jt9pPTWFcRoVTBsg==,type:str] +nethermind_seq_api_key: ENC[AES256_GCM,data:fxY/OkvHP2w5r2WdAwwGkdPOG9Q=,iv:8RFbkiSRAdtEPHM5JvmQskIHybMuZdbzP1CV1rGp1DM=,tag:HWEciIkJpTbJhumao1CaHA==,type:str] +nethermind_seq_server: ENC[AES256_GCM,data:tNMBXIUTbUfXP2quBzmzLHUk+/+Dg5wzIQ==,iv:N0JY8nvNIqVQuBvUZF+TtBhgrnwtzCEu40axAxTMwWc=,tag:zFCJZekruevCbvdDAlmakg==,type:str] +nethermind_push_gateway: ENC[AES256_GCM,data:ZZVpFiiuIPhj1bttOr9pA03/wHS3lY+f6n/DD05PRLEK1Vtla0Pu3I9k1vjZdkkbMYFeLwy+dDUxk6UQeQTFpS430E68O51ers31YF9M4kOFiKVWM1q2cO705QKRjysd2Y52OI1UMk1G3yTJdmIim0cBvt1yZafso05dIZa1Thi+cYQNg0Z6re3QU53GMzbSfg==,iv:TwKc357lNh4ICSQBR/0QbBJrVCZuTOI+1wWXEoVT2Ys=,tag:Hq55iZFPmCPALhR3SWaRNg==,type:str] +secret_xatu_coordinator_secret: ENC[AES256_GCM,data:PhRuYyuIQ82qWpQjXGsqUGjE0VicO4AnHkJmOfz2IIOjJVBk,iv:en6pneZ6AdcZKzncC1m7Bisagjvfk63hZxlgSIDB4Jc=,tag:jRjYoRdhC+LLYEmjq4Nj4A==,type:str] +secret_xatu_event_ingester_username: ENC[AES256_GCM,data:gMo022YIbEc1Lgc=,iv:7hBzswEltg2rQxckiR0d08D82VfjoChw7KPFoPhw6as=,tag:QpG1Xmhjg598sLIhhXgCCQ==,type:str] +secret_xatu_event_ingester_password: ENC[AES256_GCM,data:iQGB10f8vSleYkaoysjX8nWANtTOsCPYwfq5FkYDEg==,iv:CBT+QEtMdwwfeu5mnWD1XF5Gsfy0gRC16GUQyAcaUwM=,tag:jbwCaQm/2EQSihH0xb0zQg==,type:str] +secret_xatu_event_ingester_secret: ENC[AES256_GCM,data:IWcvTaJMchGSeqhsRG0QN6LamnjQJXCi+X3rbZLziy4Lw3iJ/9i5eStMmypzgUjHhW0zUiZzmO6YlM/13bWGpYzP,iv:TO4LRal9Eo3F5zZdlWrdwiFLlnmN7ZQpPt1VEY62dwI=,tag:2AbVeccTr4C5fDDdpEMbtA==,type:str] +secret_xatu_clickhouse_password: ENC[AES256_GCM,data:m1QQe1YQP9LSjGKz+bif30lfgANfslMpqT+wrJHecnQ0kazy,iv:e4D3b4oKiyumKWyVHj1+jlkyqDafYWX9MXextcKctGU=,tag:sbr+FbekBnYOhMxzfoIS1A==,type:str] +secret_xatu_clickhouse_readonly_password: ENC[AES256_GCM,data:IQ+XtcwfJLBCCZYMmsCr0CRKTtjPsOb4BXT8kYzYd3byaN3P,iv:M1rGk5HekNQyNnBc2fZJVTmrAf8QudNRGF7KaR+5SNM=,tag:ATSNGclKdqpFjvnbm5K/Ug==,type:str] +sops: + kms: [] + gcp_kms: [] + azure_kv: [] + hc_vault: [] + age: [] + lastmodified: "2024-12-23T15:59:58Z" + mac: ENC[AES256_GCM,data:pFME2HIIhfSCrkgT1BOVNlQjLC8EvlQfI/kF5CEIucAmCywZO48wRuBAAly71mNOWi9lJ/aiafw+n9yHRKTnxxJ84ygIUBCG5+p71idnKWnsxrznACBm/FY2fbrTPiAPVT1QvR4c6UVqBvnVyw8tKIVL2hlrOD42DOiQ6S7gKH8=,iv:l4Pz7yIFw1Viko35kdUMs7w+fAKFRVqgIk3EKQ6lZSE=,tag:ASozxjRUlPASNv3K3KWXDA==,type:str] + pgp: + - created_at: "2023-09-28T11:48:21Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + wcFMA32GcoRiZf6pAQ/+K0pHUTKocKocuNwu8d4rWDcVWqzYk2GaOynxQHmNlyhi + TWEb6YUuE6aLoXL8/Wwx0qtBTESS7g3UnjnukLukOW+GphZZuDVeEre1il03JaiD + rUpQFkBiWQZAZbzVHsg9OLQUhgrAN03WfCQW6eL/IP61q+S08OSHC4Yn39EJWSXp + QIAwRFBCROF21IYeMAOZVjnfVykVn3sybaUuYqaSP/LhKsc3q1lF3RFM7MP/zv8q + dSwOCsw+uprIUU8z1j4CJDjzitlKxfsAGHVCipG63WfuqhmtBoNMl2tCIMYcw668 + fDoECYOs4jlNuMxa7bGoAHLXfezqS1siy3T/YHYic8maf8PkDEjUKWX2orR5LTWb + MetbUwaylRpJ9VWlBFaXa/nqMlair1SHz3XkARnnR6blVh1AlxIEYyXsCNk7x3cV + 7wDRkyc/Vmf1MzoVDHSCwjgaAS/FpTbPM6iysG1bDUktUENwDoZ4eS4KQ6D3tvFh + huWCRnwCvNsLdvC/imlWxSYr3SF2WDGR+mEbmSJcxaKW/KkhP5EG3qGQa48txmH5 + hi/AnYXKMgOyFOtjrDJJfCVW/bRd/GmO/6fbu2twpKlbx3k3Rrr5Jwa5hiYAMKr9 + h0KUp6s6jF+hyNioXIdlPD+jXkf8QoO6zWpKoy4oItr5D4GDRTCebmfxkk60pCnS + UQHNPsBsQGPD6059xZQ05BvHk8OISNohfeYSgnRwFeC1PGO8jMj0FyBbfm2RkX1Q + zZ1X96Q4FI2bAb0aimqiZGHG8gq+DfhrrfaPSvSscfEyhg== + =5jV7 + -----END PGP MESSAGE----- + fp: 80DB2B4EF6CA4D9829C280605636BC0E08138A24 + - created_at: "2023-09-28T11:48:21Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + wcFMA87Wber4r4dGARAAo+HyY/BCDL7QhVgD+tfeMYikHg5n0zbqduXIGchgG+gk + o9UKK3O6F8V8mWoyf5Tat8cQOZpizTY2nGDRde/6CGLgOak1FRHDb8nhCuiiy6mC + ChuzerSmpYsx6UpqRhTS7IXtmdg0p3pe5o6JCZEUKrvP9ijWLQTUpy3K2u1H7qRp + SWmrvOiAQ5LjbYMl3lU71U0oykc3T/7q9fiZptZTFhzzDrBLnomp1ZdUmRzYtbhx + 3Zk3QLhEJGRdQUwHEIDKGVT6AXS73R2xBZlp8elmwM8T5ze7GzOo16RRfw19sV/p + jmBZqhNZD7vb88jtoMa30FFj8kp5rMq1AvFeO+7PcnKvW6sMDX7iaaLPZ2Vzg3Tx + /AtqShFImJr9j0Oa3B2THfGk2hsSJLuwpWIuJhyADrgijxavS3I//K5taJXgNsTY + ER7junq3kZzfBIpWQB7e4DokvbE87pBF9cKdNRoPGr+iy1tvh9eex+eThuqCpuy0 + Ot6HR+R3M0GAnqXZ+dihBMxFGpfadYX7dcNMXc0Uqpv/rgq+fUgz1i/JwjwuMoEW + kcnqjGDNsYGmG3/l0RfpmvkLFPt2Niji8DXl5Zt8ti8fW7HON6ddd57uYQ1o+O9m + yGetEZOF5obJeQPNWXXbYsmEZwN7EcRBMhivVamouLAe/HNYgJdQHOcCSW45ZDPS + UQHXFVtY2va6BfLgzZDKx6bGGUWAZZb54nB+5Rrx16tEFJekOHTmIBBxD0zWiMKJ + IRJh1DtPleiv7M87SBAWVBqLSY5ZBfiElQs9MiO7oIGkxw== + =6fxS + -----END PGP MESSAGE----- + fp: 69F66EEA7AE36CCB77DDB8CA1BC39532FB4A2DBD + - created_at: "2023-09-28T11:48:21Z" + enc: | + -----BEGIN PGP MESSAGE----- + + hQIMA4hw3nPn82LyAQ//TAEBuAoCaspDCZMSloKrzEN64GIv2QJNy4PdTcx/3yZ9 + JmYaxNG4Fu6f1xGrpwoUIOIJQ4Oi2osU3xP04d4gi7hEUPbEBH0V1QhHbB2ci8Ry + Ylf3sRDGGs8OZnDNHSRMc1UxYRqoK4nQEalYqTeiQGOvSBNMN9vJZHyAvx8hMHnM + Zn+OPuJ8rdsuXQ2AnAevz5pC0Qo143JDmdUl7rTenKT05yfEfF9aKSIrpjg24fgZ + nl1KMCZzudfp3wZvvR7HIy2LYG/dLd4SBvQVsLPpDRhPR2ieg520aiKTfWT1i5zR + fBPCzpgVzm9ex2QPBVpbt7XrCwmoU5ltWRg730gGxzIl8tWU7xR7CZtVtP4qMVuv + v6dFwIJeLLmPAKq0WOo2eNOmDdOIcX6WkTMocZh2q7N5VlAZZFj4/o0Pp/mhaG2m + DNtZuxLuNXhXdFvuP2bCwNID/4tEJya3jcQFIby+zaOGp/mfxUmuK83In9WzPTfU + rNlBe9i6g5nwfNmVyl7/ZclNpVFy/95KCjFv1ZqzE04DoYMyDLqSJ0IgjiGc1x40 + X6Fm7uIVDNrNqZeOyda7CDxsiNjyFNwle8ChqEoohuK50wvZonL+5iJtYnEdfdZT + q8gMtiqAlYMoPu4USxtVS8tbzjJwSw536jSHcS+QWmi0h3htQB81X6Fmokyw8SbS + UQEci/lnKwM0fmilDWHn85sspZN9h47NFAJ7sgXiSrEUDxLUfj4mZpUWOn5U61eL + 3pbepyoDhznykX+sQIeFvpSJ5AFjoBetSewP4OGgZ/YmZw== + =1Tcn + -----END PGP MESSAGE----- + fp: D1002590180DE371BCB455EAEFCD4ACD0B4D3F6E + - created_at: "2023-09-28T11:48:21Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + wcFMAw01qfIBwY0JARAAv2FxRfh+MMFJFdnTGWOS/i/SSOYqlw0Fcr72OYPHPRSQ + XXPkM065g117CT0aUhTwfs/DD8aukT4mwgxmXwM8/yI+hjZ0uT6Unmwr1PCo5JN1 + tIvPDh9ZoVxi0Wq67cIu96eKzlOLU6bWfz2HayxiSNIAQjUvHNZe8GJ5WxXj7W57 + Zx6YsDTm0Fsd3ndyhC61wGdqFleRAerturQAmgVdbJ9JeNpgSHQXUBtlZtLEHWRK + d3te8AbkkN3HOKJ4OKhQv2htmHM2L1tEM++l+1tr2r2ekGetzZvLm+5bksAwdwkS + GxCnyTU9sC2CLmdE2QTGrhlZd3YDZ/3WcDZhKn+xHsOBFp33Qy+yVSGUh/XDYUDJ + xR2HDfdrS1ehmiuQR56YpDM6VtlGAlFkw9sQst5v5j6U1dbnjgouX6WxhAzOoMYK + uR6x0KY4EEj0DugrSPMFTCSiwqONWVmh5UnW/R2tDfS7w+78NZmIlL2rEG47LDo7 + +bbMHP1PDxoNsTq6kpl9vEY4tREkaXGZvTP4HXfd+01GZORQ7ybPqmEMC6AuetdC + NRUYoh1BDP6oTpZOS0qm5IihGJRIzSDl40zAVdDQXkDdgPoGov0XWJYTmXcNSCaj + sUdOHj8LZkVHCKG7jHKymR2uHkJ9DDNj07zdCEUwIPJq0IvazgdFebWcCky6MbDS + UQHyt+BqP1M8ICtXlaBrREkZPSzZvLTJLgqrs43EVOpNH1BP2U3X4T8LgdWVYHGy + oBCC3fzJ/F+gHQgUgZeb78FHBppXtZzWN91gQyGso0z0VA== + =l9+P + -----END PGP MESSAGE----- + fp: B9F81F327CF5346860E85269D7AF98F214C59E4E + - created_at: "2023-09-28T11:48:21Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + wcBMAwDFOgk9tOQ+AQgAq2I9Xdaf7oNR3GNtgnpBeLMlm9i6NKqmLWCWZpa6AK5Z + yGYFRAya9/FEzdA3IWTLPtK54PExD22Ltj36YgpXLTzAVex+eCtvIq0ADsLa9dwm + 2wB6ZcNQFBP6XlovHO3dP1cAf1z0KMWhdZ3TaS+6Su775t74t+eqyAY80AO8HhFJ + +mx2ryYTau2eugQ97ijGFCrb4e+3C/uDjLkPSFN8EA021VcyPJQ+3wN517LcSw7k + OgQ6dGCq1eRcHjlu0SkiMBf1G7l5H3kzPQqX7Mbd45QUxnIUScS8UEO5p6XLm2jL + 54AR2iw/ztVm1mQD4hKw6xC7zO5nbNpgvKvEqGLVQ9JRAabGwRVVuTGLyIV+BYc5 + y/dFrT7+apeV9oTpjV2dxJ3ShxgO8QaEDrsFsoRmSjrTTa+3yY3q5rcJv97hTeXw + iuC1i7RZ8drFqIbzMVIVIz0E + =4RwK + -----END PGP MESSAGE----- + fp: 0600D41E1313E31016F7C55BF597BC0C5F22D1A2 + - created_at: "2023-09-28T11:48:21Z" + enc: | + -----BEGIN PGP MESSAGE----- + + hQIMAz4a8AV36xppAQ//T+sI4myUCRgzDzLGbILleBgOo5kxtWsqUvqyg4QZNsS4 + +t6oJKgO/qOc8u/O+FzWsTRLzHYolsqgJx+wmwTQEQi6yvrikwxHG5GLBbsX5hn4 + KohjQankBEN+GCmGH+R4fXnXUhERuobqByosbX2qZY16gaaToYbhFqBh1zBvFkCn + MSZBjvgVQmHEwYtR5/bbUg5UwlTnROcNhpQndkwPt3b7B5+N+H4Dw4aJUWs0SX/A + QGkeXmCNCWUQQ/wpK7doTQ2VcX6jRb9Ocrl+JFMRGWentgfF74l7Y98T9brv1r0k + m4+wstSPIJnNKSaBDKjmkVDb8GvsIs6M9+DCzJdgTNWAc1ww1WtLnK/7Mf2Um+jb + ntc2IMXFwy7sblopQzz3z5H+rbYVZGhA4oyOnBznyW1P3BzkWQ//DmgAAp3/QV1j + pCkqAa3dNOadErbn8fbmK5Z/fIh1KMS+DqjGqARkd5v/oLqzCxx2Hz7Mj1qAT9UX + 6lhTpJtwXVYKvkjHwYIEOYWdYm4Ft/AqdNJ0S1s0nM1Iiz044HT2s3/pi3Kh0I58 + RmL8M0P/4Mldn33jPyTqUNwuJVtdedEW1/MtiRuQrMMKMlj2wjws9mmrDHAu7ejC + ooIK+URuYAiA+tDcJjzOQsNpn4NN6CpUr62qeGCDh6JScIvLdCVHMZ3I+L6XY57S + XAECAgszZJCCewO77rvSwggDv7BsU9vt3SOmSKsju8qIuu2bzEapmsRsrkzzZBHJ + p2QAB/4TUXzujNighZ9KnRIjrewFTJyQG6JVG9a0Ig3uz5yxb5bdewbvzRYx + =ixtV + -----END PGP MESSAGE----- + fp: 29C50D01122FDE78E257482DAA497EB2610A8435 + unencrypted_suffix: _unencrypted + version: 3.7.3 diff --git a/ansible/inventories/devnet-5/group_vars/all/all.yaml b/ansible/inventories/devnet-5/group_vars/all/all.yaml new file mode 100644 index 0000000..89c1f3d --- /dev/null +++ b/ansible/inventories/devnet-5/group_vars/all/all.yaml @@ -0,0 +1,246 @@ +# ░██████╗░██╗░░░░░░█████╗░██████╗░░█████╗░██╗░░░░░  ██╗░░░██╗░█████╗░██████╗░░██████╗ +# ██╔════╝░██║░░░░░██╔══██╗██╔══██╗██╔══██╗██║░░░░░  ██║░░░██║██╔══██╗██╔══██╗██╔════╝ +# ██║░░██╗░██║░░░░░██║░░██║██████╦╝███████║██║░░░░░  ╚██╗░██╔╝███████║██████╔╝╚█████╗░ +# ██║░░╚██╗██║░░░░░██║░░██║██╔══██╗██╔══██║██║░░░░░  ░╚████╔╝░██╔══██║██╔══██╗░╚═══██╗ +# ╚██████╔╝███████╗╚█████╔╝██████╦╝██║░░██║███████╗  ░░╚██╔╝░░██║░░██║██║░░██║██████╔╝ +# ░╚═════╝░╚══════╝░╚════╝░╚═════╝░╚═╝░░╚═╝╚══════╝  ░░░╚═╝░░░╚═╝░░╚═╝╚═╝░░╚═╝╚═════╝░ + +domain: ethpandaops.io +network_subdomain: "{{ ethereum_network_name }}.{{ domain }}" +server_fqdn: "{{ inventory_hostname }}.{{ network_subdomain }}" + +ethereum_network_id: >- + {{ (lookup('file', eth_testnet_config_local_dir_src + '/genesis.json') | from_json).config.chainId }} +ethereum_network_deposit_contract: >- + {{ lookup('file', eth_testnet_config_local_dir_src + '/deposit_contract.txt') }} +ethereum_network_deposit_contract_block: >- + {{ lookup('file', eth_testnet_config_local_dir_src + '/deposit_contract_block.txt') }} + +ethereum_node_rcp_hostname: "rpc.{{ server_fqdn }}" +ethereum_node_beacon_hostname: "bn.{{ server_fqdn }}" + +ethstats_url: "ethstats.{{ ethereum_network_name }}.{{ domain }}" +ethstats_secret: "{{ secret_ethstats }}" + +### Checkpoint sync specific for Ansible & Kubernetes +checkpoint_sync_node: lighthouse-geth-1 +ethereum_node_cl_checkpoint_sync_enabled: true +checkpoint_sync_url: https://checkpoint-sync.{{ ethereum_network_name }}.{{ domain }} +checkpoint_sync_url_kube: https://@bn.{{ checkpoint_sync_node }}.{{ ethereum_network_name }}.{{ domain }} +# ██████╗░░█████╗░██╗░░░░░███████╗  ██╗░░░██╗░█████╗░██████╗░░██████╗ +# ██╔══██╗██╔══██╗██║░░░░░██╔════╝  ██║░░░██║██╔══██╗██╔══██╗██╔════╝ +# ██████╔╝██║░░██║██║░░░░░█████╗░░  ╚██╗░██╔╝███████║██████╔╝╚█████╗░ +# ██╔══██╗██║░░██║██║░░░░░██╔══╝░░  ░╚████╔╝░██╔══██║██╔══██╗░╚═══██╗ +# ██║░░██║╚█████╔╝███████╗███████╗  ░░╚██╔╝░░██║░░██║██║░░██║██████╔╝ +# ╚═╝░░╚═╝░╚════╝░╚══════╝╚══════╝  ░░░╚═╝░░░╚═╝░░╚═╝╚═╝░░╚═╝╚═════╝░ + +# role: ethpandaops.general.ethereum_genesis +ethereum_genesis_generator_container_image: "{{ default_tooling_images.ethereum_genesis_generator }}" +ethereum_genesis_generator_version: "{{ ethereum_genesis_generator_container_image.split(':')[-1] }}" +ethereum_genesis_network_seed: "{{ ansible_inventory_sources[0] }}" +ethereum_genesis_chain_id: "70{{ 99999999 | random(start=10000000, seed=ethereum_genesis_network_seed) }}" +ethereum_genesis_generator_output_dir: "../network-configs/{{ ethereum_network_name | replace('pectra-', '') }}" +ethereum_genesis_timestamp: "{{ lookup('ansible.builtin.pipe', '{{ ethereum_genesis_timestamp_relative_cmd[ansible_system] }}') }}" +ethereum_genesis_timedelay: 60 +ethereum_genesis_timestamp_relative_cmd: + Linux: "date +%s -d '+45 minutes'" + Darwin: "date -v +45M +%s" +ethereum_genesis_mnemonic: "{{ secret_genesis_mnemonic }}" +ethereum_genesis_generator_config_files: + cl/config.yaml: "{{ lookup('ansible.builtin.url', 'https://raw.githubusercontent.com/ethpandaops/ethereum-genesis-generator/v{{ethereum_genesis_generator_version}}/config-example/cl/config.yaml', split_lines=false) }}" # noqa yaml[line-length] + cl/mnemonics.yaml: "{{ lookup('ansible.builtin.url', 'https://raw.githubusercontent.com/ethpandaops/ethereum-genesis-generator/v{{ethereum_genesis_generator_version}}/config-example/cl/mnemonics.yaml', split_lines=false) }}" # noqa yaml[line-length] + el/genesis-config.yaml: "{{ lookup('ansible.builtin.url', 'https://raw.githubusercontent.com/ethpandaops/ethereum-genesis-generator/v{{ethereum_genesis_generator_version}}/config-example/el/genesis-config.yaml', split_lines=false) }}" # noqa yaml[line-length] + values.env: |- + export PRESET_BASE="mainnet" + export CHAIN_ID="{{ ethereum_genesis_chain_id }}" + export DEPOSIT_CONTRACT_ADDRESS="0x4242424242424242424242424242424242424242" + export EL_AND_CL_MNEMONIC="{{ ethereum_genesis_mnemonic }}" + export CL_EXEC_BLOCK="0" + export DEPOSIT_CONTRACT_BLOCK="0x0000000000000000000000000000000000000000000000000000000000000000" + export NUMBER_OF_VALIDATORS=10000 + export GENESIS_FORK_VERSION="0x10{{ ethereum_genesis_fork_version_suffix }}" + export ALTAIR_FORK_VERSION="0x20{{ ethereum_genesis_fork_version_suffix }}" + export BELLATRIX_FORK_VERSION="0x30{{ ethereum_genesis_fork_version_suffix }}" + export CAPELLA_FORK_VERSION="0x40{{ ethereum_genesis_fork_version_suffix }}" + export DENEB_FORK_VERSION="0x50{{ ethereum_genesis_fork_version_suffix }}" + export ELECTRA_FORK_VERSION="0x60{{ ethereum_genesis_fork_version_suffix }}" + export ELECTRA_FORK_EPOCH="5" + export EIP7594_FORK_VERSION="0x70{{ ethereum_genesis_fork_version_suffix }}" + export EIP7594_FORK_EPOCH="999999" + export WITHDRAWAL_TYPE="0x00" + export WITHDRAWAL_ADDRESS={{ ethereum_genesis_validator_bls_change_execution_address }} + export BEACON_STATIC_ENR="" + export GENESIS_TIMESTAMP={{ ethereum_genesis_timestamp }} + export GENESIS_DELAY={{ ethereum_genesis_timedelay }} + export SLOT_DURATION_IN_SECONDS=12 + export MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT=8 + export CHURN_LIMIT_QUOTIENT=65536 + export EJECTION_BALANCE=16000000000 + export ETH1_FOLLOW_DISTANCE=2048 + export MIN_VALIDATOR_WITHDRAWABILITY_DELAY=2 + export SHARD_COMMITTEE_PERIOD=256 + export CHURN_LIMIT_QUOTIENT=128 +ethereum_genesis_validator_keys_output_dir: "{{ ansible_inventory_sources[0] | dirname }}/files/validator_keys" +ethereum_genesis_validator_bls_change_execution_address: "{{ ethereum_node_cl_validator_fee_recipient }}" +ethereum_genesis_validator_keyranges: >- + {%- set ns = namespace() -%} + {%- set ns.ethereum_genesis_validator_keyranges = {} -%} + {%- for host in groups['all'] -%} + {%- if hostvars[host].validator_start is defined and hostvars[host].validator_end is defined -%} + {%- set v = {'start':hostvars[host].validator_start, 'end': hostvars[host].validator_end } -%} + {%- set _ = ns.ethereum_genesis_validator_keyranges.update({host: v}) -%} + {%- endif -%} + {%- endfor -%} + {{ ns.ethereum_genesis_validator_keyranges }} + +# role: ethpandaops.general.bootstrap +bootstrap_default_user_authorized_keys_plain: + - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDbboxOo0jyL3DNxqZ6UTEnZPEzPDPnujEYaClqNWSLWkphczHKAnJPkrwbAWB4JbJKjsAJ5kn53f10KPnUyZvJ5Jn8Rpf7RM7+56MYaBg84gVoA2KeIYxUa7h8neY7J61Galp0c6cOK+hp1lPsoiBSdCW/Rtbv6ALCcVe+4+uCW5FRoJcNRJfGRLRnjh1pw57HQw9O55mf319s4rVUq4umznQ0CciEx3rVMtXf4xjIZDZAhNpGaBh8AtHauaMZCOGociAIquYYqoSQnnmnOBiduRa5OkvGZomgybNQivlYboDeF6sQ71KVzRXSI+mxCYbSp246lqSdQtQsjFA54NYl/qWgAql0uqCqsZidW+XBjquyItRl2Rfzzy5Fk/gMOAJXHQYp4POfgFbqtxjWpfnuOKqW/1IGWcIt2g016effUqGgj/oePX0g+duFdszSKK773rJBySgafFF6XWNqagrLmE4LUGC+6P3oxzYTSFGeUVA21OayL+K40XPpJti5zns= # devops-eth2-shared" + - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDWh9NW66VD4BPKETNyZeZrGN1f7G6dkihW3eAc7cbJPFQGIpnWc2tGq5o13vWW+SoCh16nkYM2oak+PJQxXYTiQnrMJSmSFd7E0DmdcoKadGJEnfosrH++aOZf/eVLe5q3E9NQFVSdOPo1MCRRTuZxPkuMxS6QikW3otWrA3F2vFgmYyki3Cy8huQzHKUZGicividYcUSFTydR2L0oWUNve3FyqMQQQPnfaJ1RvrkeGtdhRSAxa6L0jzgRK7fjpUyhKOofr7kCKARGELRRiB9QikRAoHU2/D/2jtJjKlTCJxArzXyDF2IcQCco+5Oe9x4c7Xch32dbscJSmjaAvsxRnu7GEFCS7b6kKGvwcoq5vJzvp3RBBR7Mosxv6pcM/q7Z4RhXOFVFFiPVl1dqkqSPkUrHwg8LtWOxC+GAl36vxhHLdDEV/RhbSAzO6SfYEWYGH1w7u4oiy2XAT2cNCO0j0tSHS5chX+d7TzwAbBE2HuPL84GVGHZG875hmiE+Dok= # github-actions-ci" +bootstrap_default_user_authorized_keys_github_all: + - barnabasbusa + - parithosh + - samcm + - savid + - skylenet + - pk910 + - marioevz +bootstrap_default_user_authorized_keys_github: > + {{ + (bootstrap_default_user_authorized_keys_github_all | default([])) + + (bootstrap_default_user_authorized_keys_github_team_el | default([])) + + (bootstrap_default_user_authorized_keys_github_team_cl | default([])) + }} + +# role: ethpandaops.general.ethereum_node +ethereum_node_images_always_pull: true +ethereum_node_metrics_exporter_enabled: true +ethereum_node_xatu_sentry_enabled: true +ethereum_node_cl_validator_enabled: "{{ validator_start is defined and validator_end is defined }}" +ethereum_node_cl_validator_fee_recipient: "0xf97e180c050e5Ab072211Ad2C213Eb5AEE4DF134" +ethereum_node_cl_ports_p2p_tcp: 9000 +ethereum_node_cl_ports_p2p_udp: 9000 +ethereum_node_cl_ports_http_beacon: 5052 +ethereum_node_cl_ports_metrics: 5054 +ethereum_node_el_ports_p2p_tcp: 30303 +ethereum_node_el_ports_p2p_udp: 30303 +ethereum_node_el_ports_http_rpc: 8545 +ethereum_node_el_ports_ws_rpc: 8546 +ethereum_node_el_ports_engine: 8551 +ethereum_node_el_ports_metrics: 6060 + +ethereum_node_json_rpc_snooper_engine_enabled: true +ethereum_node_json_rpc_snooper_engine_port: 8561 +ethereum_node_json_rpc_snooper_engine_name: "snooper-engine" + +# role: ethpandaops.general.xatu_sentry +xatu_sentry_container_image: "{{ default_tooling_images.xatu_sentry }}" +xatu_sentry_config_name: "{{ ethereum_network_name }}-{{ inventory_hostname }}" +xatu_sentry_config_server_address: "server.xatu.{{ ethereum_network_name }}.ethpandaops.io:80" +xatu_sentry_config_network_name_override: "{{ ethereum_network_name }}" +xatu_sentry_config: | + logging: "info" + metricsAddr: ":9090" + name: "{{ xatu_sentry_config_name }}" + ethereum: + beaconNodeAddress: {{ xatu_sentry_config_beacon_uri }} + overrideNetworkName: {{ xatu_sentry_config_network_name_override }} + beaconSubscriptions: + - attestation + - block + - head + - chain_reorg + - finalized_checkpoint + - voluntary_exit + - contribution_and_proof + - blob_sidecar + + proposerDuty: + enabled: true + beaconCommittees: + enabled: true + + outputs: + - name: grpc + type: xatu + config: + address: {{ xatu_sentry_config_server_address }} + headers: + Authorization: "{{ secret_xatu_event_ingester_secret }}" + tls: false + + +# role: ethpandaops.general.ethereum_metrics_exporter +ethereum_metrics_exporter_container_image: "{{ default_tooling_images.ethereum_metrics_exporter }}" + +# role: eth_testnet_config +eth_testnet_config_dir: /data/ethereum-network-config/metadata +eth_testnet_config_local_dir_enabled: true +eth_testnet_config_local_dir_src: "{{ ethereum_genesis_generator_output_dir }}/metadata/" + +# role: gen_basic_auth_nginx +gen_basic_auth_nginx_name: "{{ secret_nginx_shared_basic_auth.name }}" +gen_basic_auth_nginx_password: "{{ secret_nginx_shared_basic_auth.password }}" + +# role: ethpandaops.general.docker_nginx_proxy +docker_nginx_proxy_container_name: nginx-proxy +docker_nginx_proxy_default_email: "certs@{{ domain }}" +docker_nginx_proxy_docker_gen_container_name: nginx-proxy-gen +docker_nginx_proxy_docker_gen_container_env: + RESOLVERS: "1.1.1.1" +docker_nginx_proxy_acme_companion_container_name: nginx-proxy-acme +docker_nginx_proxy_acme_companion_container_env: + DEFAULT_EMAIL: "{{ docker_nginx_proxy_default_email }}" + NGINX_PROXY_CONTAINER: "{{ docker_nginx_proxy_container_name }}" + NGINX_DOCKER_GEN_CONTAINER: "{{ docker_nginx_proxy_docker_gen_container_name }}" + ACME_CA_URI: https://acme.zerossl.com/v2/DV90 + ACME_EAB_KID: "{{ secret_zerossl.ACME_EAB_KID }}" + ACME_EAB_HMAC_KEY: "{{ secret_zerossl.ACME_EAB_HMAC_KEY }}" +docker_nginx_proxy_container_networks: "{{ docker_networks_shared }}" +docker_nginx_proxy_docker_gen_container_networks: "{{ docker_networks_shared }}" +docker_nginx_proxy_acme_companion_container_networks: "{{ docker_networks_shared }}" +docker_nginx_proxy_datadir: /opt/nginx-proxy +docker_nginx_proxy_container_volumes: + - "{{ docker_nginx_proxy_datadir }}/conf:/etc/nginx/conf.d" + - "{{ docker_nginx_proxy_datadir }}/vhost:/etc/nginx/vhost.d" + - "{{ docker_nginx_proxy_datadir }}/certs:/etc/nginx/certs:ro" + - html:/usr/share/nginx/html + - "{{ docker_nginx_proxy_datadir }}/htpasswd:/etc/nginx/htpasswd:ro" + +# role: ethpandaops.general.prometheus +prometheus_container_image: "{{ default_tooling_images.prometheus }}" + +# role: ethpandaops.general.vector +vector_config: | + [sources.in] + type = "docker_logs" + exclude_containers = [ + "{{ vector_container_name }}", + "ethereum-metrics-exporter", + "nginx-proxy", + "node_exporter", + "prometheus", + "snooper-", + ] + + [sinks.out] + type = "loki" + inputs = ["in"] + out_of_order_action = "accept" + labels.forwarder = "vector" + labels.instance = "{{ inventory_hostname }}" + labels.network = "{{ ethereum_network_name }}" + labels.testnet = "{{ ethereum_network_name }}" + labels.ingress_user = "{{ secret_loki.username }}" + labels.container_name = "{{ '{{ container_name }}' }}" + {%- if ethereum_node_el is defined +%} + labels.ethereum_el = "{{ ethereum_node_el }}" + {%- endif +%} + {%- if ethereum_node_cl is defined +%} + labels.ethereum_cl = "{{ ethereum_node_cl }}" + {%- endif +%} + encoding.codec = "json" + endpoint = "{{ secret_loki.endpoint }}" + auth.strategy = "basic" + auth.user = "{{ secret_loki.username }}" + auth.password = "{{ secret_loki.password }}" \ No newline at end of file diff --git a/ansible/inventories/devnet-5/group_vars/all/images.yaml b/ansible/inventories/devnet-5/group_vars/all/images.yaml new file mode 100644 index 0000000..1db93db --- /dev/null +++ b/ansible/inventories/devnet-5/group_vars/all/images.yaml @@ -0,0 +1,45 @@ +default_ethereum_client_images: +### Consensus layer clients + lighthouse: docker.ethquokkaops.io/dh/ethpandaops/lighthouse:pawanjay176-electra-alpha7-def2498 + lodestar: docker.ethquokkaops.io/dh/ethpandaops/lodestar:unstable-3f3c7fc + nimbus: docker.ethquokkaops.io/dh/ethpandaops/nimbus-eth2:mekong-support-03fe86f + prysm: docker.ethquokkaops.io/dh/ethpandaops/prysm-beacon-chain:v5.1.2-mekong-1 + prysm_validator: docker.ethquokkaops.io/dh/ethpandaops/prysm-validator:v5.1.2-mekong-1 + teku: docker.ethquokkaops.io/dh/ethpandaops/teku:mekong-297263b + grandine: docker.ethquokkaops.io/dh/ethpandaops/grandine:mekong-171fc11 +### Execution layer clients + besu: docker.ethquokkaops.io/dh/ethpandaops/besu:pectra-devnet-4-8ab3aac + geth: docker.ethquokkaops.io/dh/ethpandaops/geth:lightclient-prague-devnet-4-37035c5 + erigon: docker.ethquokkaops.io/dh/erigontech/erigon:v2.61.0-beta1 + ethereumjs: docker.ethquokkaops.io/dh/ethpandaops/ethereumjs:master-100d77d + nethermind: docker.ethquokkaops.io/dh/ethpandaops/nethermind:pectra_devnet_4-c3827bc + reth: docker.ethquokkaops.io/dh/ethpandaops/reth:main-28ef574 + nimbusel: docker.ethquokkaops.io/dh/ethpandaops/nimbus-eth1:master-90dd86b + +default_tooling_images: + xatu_sentry: docker.ethquokkaops.io/dh/ethpandaops/xatu:0.0.16-pectra-debian + ethereum_metrics_exporter: docker.ethquokkaops.io/dh/ethpandaops/ethereum-metrics-exporter:latest + tx_fuzz: docker.ethquokkaops.io/dh/ethpandaops/tx-fuzz:pr-56 + forkmon: docker.ethquokkaops.io/dh/skylenet/nodemonitor:darkmode + forky: docker.ethquokkaops.io/dh/ethpandaops/forky:latest + fauceth: docker.ethquokkaops.io/dh/skylenet/fauceth:fix_fee_estimation + powfaucet: docker.ethquokkaops.io/dh/pk910/powfaucet:v2-stable + ethstats: docker.ethquokkaops.io/dh/skylenet/ethstats-server:poa-no-geoip + homepage: docker.ethquokkaops.io/dh/ethpandaops/ethereum-testnet-homepage:latest + checkpointz: docker.ethquokkaops.io/dh/ethpandaops/checkpointz:0.0.10-electra + blockscout: docker.ethquokkaops.io/dh/blockscout/blockscout:latest + blockscout_frontend: docker.ethquokkaops.io/dh/ghcr.io/blockscout/frontend:latest + beacon_metrics_gazer: docker.ethquokkaops.io/dh/dapplion/beacon-metrics-gazer:latest + eth_fauceth: docker.ethquokkaops.io/dh/chainflag/eth-faucet:latest + blobscan: docker.ethquokkaops.io/dh/blossomlabs/blobscan:latest + blobscan_indexer: docker.ethquokkaops.io/dh/blossomlabs/blobscan-indexer:latest + dora: docker.ethquokkaops.io/dh/ethpandaops/dora:pk910-per-validator-operations-latest + dugtrio: docker.ethquokkaops.io/dh/ethpandaops/dugtrio:latest + ethereum_genesis_generator: docker.ethquokkaops.io/dh/ethpandaops/ethereum-genesis-generator:3.4.0 + tracoor: docker.ethquokkaops.io/dh/ethpandaops/tracoor:0.0.25-debian + ncli: docker.ethquokkaops.io/dh/status-im/nimbus-eth2:unstable + lcli: docker.ethquokkaops.io/dh/ethpandaops/lighthouse:unstable-a94b12blo + zcli: electra + assertoor: docker.ethquokkaops.io/dh/ethpandaops/assertoor:electra-support-latest + erpc: docker.ethquokkaops.io/gh/erpc/erpc:main + prometheus: docker.ethquokkaops.io/dh/prom/prometheus:v2.40.7 \ No newline at end of file diff --git a/ansible/inventories/devnet-5/group_vars/hive.yaml b/ansible/inventories/devnet-5/group_vars/hive.yaml new file mode 100644 index 0000000..324d493 --- /dev/null +++ b/ansible/inventories/devnet-5/group_vars/hive.yaml @@ -0,0 +1,52 @@ +# role: ethpandaops.general.hive +hive_container_www_image: "docker.ethquokkaops.io/dh/library/nginx:1.27.3-alpine" +hive_container_www_env: + VIRTUAL_PORT: "80" + VIRTUAL_HOST: "hive.{{ network_subdomain }}" + LETSENCRYPT_HOST: "hive.{{ network_subdomain }}" +hive_repo_address: "https://github.com/ethereum/hive.git" +hive_repo_version: "master" +hive_simulations_client_config: + - client: go-ethereum + nametag: prague-devnet-5 + dockerfile: git + build_args: + github: s1na/go-ethereum + tag: prague-devnet-5 + - client: besu + nametag: prague-devnet-5 + dockerfile: git + build_args: + github: siladu/besu + tag: pectra-devnet-5-interop + - client: reth + nametag: main + dockerfile: git + build_args: + github: paradigmxyz/reth + tag: main +hive_simulations_tests: + # Consume Engine + - simulator: ethereum/eest/consume-engine + clients: + - besu + - go-ethereum + - reth + extra_flags: + - --client.checktimelimit=60s + - --sim.parallelism=4 + #- --sim.timelimit=2h + - --sim.buildarg fixtures=https://github.com/ethereum/execution-spec-tests/releases/download/pectra-devnet-5%40v1.0.0/fixtures_pectra-devnet-5.tar.gz + - --sim.buildarg branch=pectra-devnet-5 + # Consume RLP + - simulator: ethereum/eest/consume-rlp + clients: + - besu + - go-ethereum + - reth + extra_flags: + - --client.checktimelimit=60s + - --sim.parallelism=4 + #- --sim.timelimit=2h + - --sim.buildarg fixtures=https://github.com/ethereum/execution-spec-tests/releases/download/pectra-devnet-5%40v1.0.0/fixtures_pectra-devnet-5.tar.gz + - --sim.buildarg branch=pectra-devnet-5 diff --git a/ansible/inventories/devnet-5/hive_inventory.ini b/ansible/inventories/devnet-5/hive_inventory.ini new file mode 100755 index 0000000..1af2bbd --- /dev/null +++ b/ansible/inventories/devnet-5/hive_inventory.ini @@ -0,0 +1,4 @@ +[all:vars] +ethereum_network_name=pectra-devnet-5 +[hive] +pectra-devnet-5-hive-1 ansible_host=159.223.221.74 cloud=digitalocean cloud_region=ams3 \ No newline at end of file diff --git a/ansible/inventories/devnet-5/host_vars/localhost b/ansible/inventories/devnet-5/host_vars/localhost new file mode 100644 index 0000000..d7853f9 --- /dev/null +++ b/ansible/inventories/devnet-5/host_vars/localhost @@ -0,0 +1,2 @@ +ansible_connection: local +ansible_python_interpreter: "{{ ansible_playbook_python }}" \ No newline at end of file diff --git a/ansible/playbook.yaml b/ansible/playbook.yaml index d23188b..1528121 100644 --- a/ansible/playbook.yaml +++ b/ansible/playbook.yaml @@ -139,3 +139,16 @@ roles: - role: ethpandaops.general.xatu_stack tags: [ethereum, xatu] + + +- hosts: hive + become: true + roles: + - role: gantsign.golang + golang_gopath: '/data/workspace-go' + golang_version: '1.21.13' + tags: [init-server, golang] + - role: ethpandaops.general.hive + tags: [hive] + - role: ethpandaops.general.docker_nginx_proxy + tags: [docker_nginx_proxy] diff --git a/ansible/requirements.yaml b/ansible/requirements.yaml index 1a606fd..825a059 100644 --- a/ansible/requirements.yaml +++ b/ansible/requirements.yaml @@ -9,6 +9,8 @@ roles: version: "3.0.3" - name: robertdebock.fail2ban version: "4.2.3" + - name: gantsign.golang + version: "3.4.0" collections: - name: ansible.posix diff --git a/terraform/devnet-5/hive/ansible_inventory.tmpl b/terraform/devnet-5/hive/ansible_inventory.tmpl new file mode 100644 index 0000000..48e91aa --- /dev/null +++ b/terraform/devnet-5/hive/ansible_inventory.tmpl @@ -0,0 +1,4 @@ +[all:vars] +ethereum_network_name=${ethereum_network_name} +[hive] +${hostname} ansible_host=${ipv4} cloud=${cloud} cloud_region=${region} \ No newline at end of file diff --git a/terraform/devnet-5/hive/main.tf b/terraform/devnet-5/hive/main.tf new file mode 100644 index 0000000..0c3f630 --- /dev/null +++ b/terraform/devnet-5/hive/main.tf @@ -0,0 +1,155 @@ +//////////////////////////////////////////////////////////////////////////////////////// +// TERRAFORM PROVIDERS & BACKEND +//////////////////////////////////////////////////////////////////////////////////////// +terraform { + required_providers { + digitalocean = { + source = "digitalocean/digitalocean" + version = "~> 2.28" + } + cloudflare = { + source = "cloudflare/cloudflare" + version = "~> 3.0" + } + } +} +terraform { + backend "s3" { + skip_credentials_validation = true + skip_metadata_api_check = true + endpoints = { s3 = "https://fra1.digitaloceanspaces.com" } + skip_requesting_account_id = true + skip_s3_checksum = true + region = "us-east-1" + bucket = "merge-testnets" + key = "infrastructure/devnet-5/hive/terraform.tfstate" + } +} +provider "digitalocean" { + http_retry_max = 20 +} +provider "cloudflare" { + api_token = var.cloudflare_api_token +} +//////////////////////////////////////////////////////////////////////////////////////// +// VARIABLES +//////////////////////////////////////////////////////////////////////////////////////// +variable "cloudflare_api_token" { + type = string + sensitive = true + description = "Cloudflare API Token" +} +variable "ethereum_network" { + type = string + default = "pectra-devnet-5" +} +variable "digitalocean_project_name" { + type = string + default = "Public Testnets" +} +variable "digitalocean_ssh_key_name" { + type = string + default = "shared-devops-eth2" +} +variable "digitalocean_region" { + type = string + default = "ams3" +} +//////////////////////////////////////////////////////////////////////////////////////// +// DIGITALOCEAN RESOURCES +//////////////////////////////////////////////////////////////////////////////////////// +data "digitalocean_project" "main" { + name = var.digitalocean_project_name +} +data "digitalocean_ssh_key" "main" { + name = var.digitalocean_ssh_key_name +} +resource "digitalocean_droplet" "main" { + name = "${var.ethereum_network}-hive-1" + region = var.digitalocean_region + ssh_keys = [data.digitalocean_ssh_key.main.fingerprint] + image = "debian-12-x64" + size = "c2-8vcpu-16gb" + resize_disk = true + monitoring = true + backups = false + ipv6 = true + tags = [ + "Hive:${var.ethereum_network}" + ] +} +resource "digitalocean_project_resources" "droplets" { + project = data.digitalocean_project.main.id + resources = [digitalocean_droplet.main.urn] +} +resource "digitalocean_firewall" "main" { + name = "${var.ethereum_network}-hive" + // Tags are used to select which droplets should + // be assigned to this firewall. + tags = [ + "Hive:${var.ethereum_network}" + ] + // SSH + inbound_rule { + protocol = "tcp" + port_range = "22" + source_addresses = ["0.0.0.0/0", "::/0"] + } + // Nginx / Web + inbound_rule { + protocol = "tcp" + port_range = "80" + source_addresses = ["0.0.0.0/0", "::/0"] + } + inbound_rule { + protocol = "tcp" + port_range = "443" + source_addresses = ["0.0.0.0/0", "::/0"] + } + // Allow all outbound traffic + outbound_rule { + protocol = "tcp" + port_range = "1-65535" + destination_addresses = ["0.0.0.0/0", "::/0"] + } + outbound_rule { + protocol = "udp" + port_range = "1-65535" + destination_addresses = ["0.0.0.0/0", "::/0"] + } + outbound_rule { + protocol = "icmp" + destination_addresses = ["0.0.0.0/0", "::/0"] + } + depends_on = [digitalocean_project_resources.droplets] +} +//////////////////////////////////////////////////////////////////////////////////////// +// DNS NAMES +//////////////////////////////////////////////////////////////////////////////////////// +data "cloudflare_zone" "default" { + name = "ethpandaops.io" +} +resource "cloudflare_record" "server_record_v4" { + zone_id = data.cloudflare_zone.default.id + name = "hive.${var.ethereum_network}" + type = "A" + value = digitalocean_droplet.main.ipv4_address + proxied = false + ttl = 120 +} +//////////////////////////////////////////////////////////////////////////////////////// +// GENERATED FILES AND OUTPUTS +//////////////////////////////////////////////////////////////////////////////////////// +resource "local_file" "ansible_inventory" { + depends_on = [digitalocean_droplet.main] + content = templatefile("ansible_inventory.tmpl", + { + ethereum_network_name = "${var.ethereum_network}" + hostname = "${digitalocean_droplet.main.name}" + ipv4 = "${digitalocean_droplet.main.ipv4_address}" + cloud = "digitalocean" + region = "${var.digitalocean_region}" + } + ) + filename = "../../../ansible/inventories/devnet-5/hive_inventory.ini" +} \ No newline at end of file