-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdeploy_flow_nodered.yml
122 lines (109 loc) · 4.29 KB
/
deploy_flow_nodered.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# SPDX-License-Identifier: AGPL-3.0-only
#
# Komponist - Generate Your Favourite Compose Stack With the Least Effort
#
# Copyright (C) 2023 Shantanoo "Shan" Desai <[email protected]>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# deploy_flow_nodered.yml: Ansible Playbook that deploys a Node-RED Flow to instance(s)
---
- name: Deploy Custom Flow to Node-RED instance(s)
hosts: localhost
gather_facts: true
vars:
flow_state: stop
vars_files:
- vars/config.yml
- vars/creds.yml
module_defaults:
ansible.builtin.uri:
method: POST
headers:
Content-Type: application/json
tasks:
- name: Check for Flow File passed as extra variable
ansible.builtin.fail:
msg: |
Please provide the Flow JSON file to be uploaded on the Node-RED instances:
SYNTAX:
ansible-playbook deploy_flow_nodered.yml -e "flow_file=path/to/flow.json" -e "flow_state=start"
OPTIONS:
-e "flow_state=start" To start the Flow once it is uploaded (DEFAULT: stop)
--ask-vault-pass To Pass Ansible Vault Variables
-e "@custom/config.yml" To Pass Custom Komponist Configuration YAML file
-e "@custom/creds.yml" To Pass Custom Komponist Credentials YAML file
when: flow_file is not defined
- name: Check for Existence of Flow File
ansible.builtin.stat:
path: "{{ flow_file }}"
register: flow_file_stat_result
- name: Cannot Find Flow File
ansible.builtin.fail:
msg: "Unable to find Flow file to upload: {{ flow_file }}"
when: not flow_file_stat_result.stat.exists
- name: Read Flow File Content
ansible.builtin.set_fact:
flow_content: "{{ lookup('ansible.builtin.file', flow_file) | from_json }}"
when: flow_file_stat_result.stat.exists
- name: Get Node-RED user with all Privileges
ansible.builtin.set_fact:
nodered_creds: "{{ item }}"
when: "item.permissions is defined and item['permissions'] == '*'"
loop: "{{ credentials.nodered.users }}"
no_log: true
- name: Obtain Authentication Token
ansible.builtin.uri:
url: http://{{ ansible_host }}/nodered/auth/token
body:
client_id: node-red-admin
grant_type: password
scope: "{{ nodered_creds.permissions }}"
username: "{{ nodered_creds.username }}"
password: "{{ nodered_creds.password }}"
body_format: json
status_code: 200
register: auth_token
when: nodered_creds is defined
- name: Upload Flow to Node-RED instance
ansible.builtin.uri:
url: http://{{ ansible_host }}/nodered/flows
headers:
Authorization: "{{ auth_token.json.token_type }} {{ auth_token.json.access_token }}"
Node-RED-API-Version: v2
Node-RED-Deployment-Type: full
body: "{{ flow_content }}"
body_format: json
status_code:
- 200
- 204
- name: Set the Flow's Runtime State
ansible.builtin.uri:
url: http://{{ ansible_host }}/nodered/flows/state
headers:
Authorization: "{{ auth_token.json.token_type }} {{ auth_token.json.access_token }}"
body: |
{ "state" : "{{ flow_state }}"}
body_format: json
status_code:
- 200
- name: Revoke Authentication Token
ansible.builtin.uri:
url: http://{{ ansible_host }}/nodered/auth/revoke
headers:
Authorization: "{{ auth_token.json.token_type }} {{ auth_token.json.access_token }}"
body:
token: "{{ auth_token.json.access_token }}"
body_format: json
status_code: 200