diff --git a/files/set_facts.sh b/files/set_facts.sh new file mode 100644 index 0000000..bc895d4 --- /dev/null +++ b/files/set_facts.sh @@ -0,0 +1,42 @@ +#!/bin/bash +FACTS_DIR='/etc/ansible/facts.d' +FACT_FILE="${FACTS_DIR}/zerotier.fact" +NODE_STATUS=($(zerotier-cli status)) +NETWORKS=$(zerotier-cli listnetworks | tail -n+2) + +function file_content { + if [ ! -z "$NETWORKS" ]; then + network_count=$(echo $NETWORKS |wc -l) + counter=1 + + echo "{" + echo " \"node_id\":\"${NODE_STATUS[2]}\"," + echo " \"networks\": {" + while read -r; do + network=($REPLY) + echo " \"${network[2]}\": {" + echo " \"status\":\"${network[5]}\"" + + if [ "$counter" -eq "$network_count" ]; then + echo " }" + else + echo " }," + fi + ((counter++)) + done <<< $NETWORKS + echo " }" + echo "}" + else + echo "{\"node_id\":\"${NODE_STATUS[2]}\",\"networks\":{}}" + fi +} + +if [ ! -d "$FACTS_DIR" ]; then + mkdir -p $FACTS_DIR +fi + +file_content > $FACT_FILE + + +# TO-DO +# Consider something that hadles JSON better than Bash does diff --git a/tasks/authorize_node.yml b/tasks/authorize_node.yml index e291655..d114e25 100644 --- a/tasks/authorize_node.yml +++ b/tasks/authorize_node.yml @@ -1,24 +1,8 @@ --- - block: - - name: Get Zerotier NodeID - shell: zerotier-cli info | awk '{print $3}' - register: nodeid - changed_when: false - - - name: Set NodeID as fact - set_fact: - zerotier_node_id: "{{ nodeid.stdout }}" - - when: - - zerotier_accesstoken is defined - - not ansible_check_mode - tags: - - configuration - -- block: - - name: Authorize members to network + - name: Authorize new members to network uri: - url: "{{ zerotier_api_url }}/api/network/{{ zerotier_network_id }}/member/{{ zerotier_node_id }}" + url: "{{ zerotier_api_url }}/api/network/{{ zerotier_network_id }}/member/{{ ansible_local.zerotier.node_id }}" method: POST headers: Authorization: bearer {{ zerotier_accesstoken }} @@ -29,10 +13,12 @@ body_format: json register: auth_apiresult delegate_to: "{{ zerotier_api_delegate }}" + when: + - ansible_local.zerotier.networks[zerotier_network_id] is not defined or ansible_local.zerotier.networks[zerotier_network_id].status != 'OK' - name: Configure members in network uri: - url: "{{ zerotier_api_url }}/api/network/{{ zerotier_network_id }}/member/{{ zerotier_node_id }}" + url: "{{ zerotier_api_url }}/api/network/{{ zerotier_network_id }}/member/{{ ansible_local.zerotier.node_id }}" method: POST headers: Authorization: bearer {{ zerotier_accesstoken }} @@ -46,7 +32,6 @@ delegate_to: "{{ zerotier_api_delegate }}" when: - - zerotier_accesstoken is defined - not ansible_check_mode tags: - configuration diff --git a/tasks/main.yml b/tasks/main.yml index 0b2aa25..a498ec8 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -3,10 +3,20 @@ - import_tasks: install.yml when: - not skip_install|default(false)|bool + - ansible_local.zerotier is not defined + +- block: + - name: Update ansible_local facts + script: set_facts.sh + + - name: Re-gather facts + setup: ~ + - import_tasks: authorize_node.yml when: - zerotier_accesstoken is defined + - ansible_local.zerotier.node_id is defined - import_tasks: join_network.yml when: