Skip to content

Commit 7dda85e

Browse files
undersync specific nautobot token
1 parent 14284df commit 7dda85e

File tree

3 files changed

+49
-29
lines changed

3 files changed

+49
-29
lines changed

ansible/roles/users/library/nautobot_token.py

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,24 @@
22
import requests
33

44

5-
def get_existing_token(base_url, username, password, user_token):
6-
"""Return the token dict if it exists, otherwise None."""
5+
def get_existing_token(base_url, username, password, user_token, module):
76
headers = {"Accept": "application/json"}
87
tokens_url = f"{base_url}/api/users/tokens/"
98

109
try:
1110
response = requests.get(tokens_url, headers=headers, auth=(username, password))
1211
response.raise_for_status()
13-
except requests.exceptions.RequestException:
14-
return None
12+
except requests.exceptions.RequestException as e:
13+
module.fail_json(
14+
msg=f"Failed to fetch existing tokens for user {username}: {str(e)}"
15+
)
1516

1617
tokens = response.json().get("results", [])
1718
return next((t for t in tokens if t.get("key") == user_token), None)
1819

1920

20-
def create_new_token(base_url, username, password, user_token, description):
21-
"""Create a new Nautobot token using Basic Auth. Returns the token dict or None."""
21+
def create_new_token(base_url, username, password, user_token, description, module):
22+
"""Create a new Nautobot token using Basic Auth."""
2223
tokens_url = f"{base_url}/api/users/tokens/"
2324
headers = {"Content-Type": "application/json", "Accept": "application/json"}
2425
payload = {"key": user_token, "description": description, "write_enabled": True}
@@ -28,26 +29,14 @@ def create_new_token(base_url, username, password, user_token, description):
2829
tokens_url, headers=headers, json=payload, auth=(username, password)
2930
)
3031
response.raise_for_status()
31-
except requests.exceptions.RequestException:
32-
return None
32+
except requests.exceptions.RequestException as e:
33+
module.fail_json(
34+
msg=f"Failed to create new token for user {username}: {str(e)}"
35+
)
3336

3437
return response.json()
3538

3639

37-
def format_token_response(token):
38-
"""Normalize token dict fields for output."""
39-
if not token:
40-
return None
41-
return {
42-
"id": str(token.get("id")),
43-
"display": str(token.get("display")),
44-
"created": str(token.get("created")),
45-
"expires": str(token.get("expires")),
46-
"write_enabled": bool(token.get("write_enabled")),
47-
"description": str(token.get("description", "No description")),
48-
}
49-
50-
5140
def run_module():
5241
module_args = dict(
5342
base_url=dict(type="str", required=True),
@@ -66,23 +55,25 @@ def run_module():
6655
token_description = module.params["token_description"]
6756

6857
# fetch existing token
69-
token = get_existing_token(base_url, username, password, user_token)
58+
token = get_existing_token(base_url, username, password, user_token, module)
7059
if token:
7160
module.exit_json(
7261
changed=False,
73-
message=f"Found existing token for {username}",
74-
token=format_token_response(token),
62+
username=username,
63+
message=f"Found existing Nautobot token for user {username}",
7564
)
7665

7766
# No token found → try creating new
78-
new_token = create_new_token(base_url, username, password, user_token, token_description)
67+
new_token = create_new_token(
68+
base_url, username, password, user_token, token_description, module
69+
)
7970
if not new_token:
80-
module.fail_json(msg="Failed to create new token")
71+
module.fail_json(msg=f"Failed to create new token for user {username}")
8172

8273
module.exit_json(
8374
changed=True,
84-
message=f"No token found, created new token for {username}",
85-
token=format_token_response(new_token),
75+
username=username,
76+
message=f"No token found, created new Nautobot token for user {username}",
8677
)
8778

8879

components/nautobot/secretstore-nautobot.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ rules:
2929
- ansible-token
3030
- openstack-token
3131
- workflow-token
32+
- undersync-token
3233
- apiGroups:
3334
- authorization.k8s.io
3435
resources:
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
---
2+
apiVersion: external-secrets.io/v1
3+
kind: ExternalSecret
4+
metadata:
5+
name: nautobot-token
6+
spec:
7+
refreshInterval: 1h
8+
secretStoreRef:
9+
kind: ClusterSecretStore
10+
name: nautobot
11+
target:
12+
name: nautobot-token
13+
creationPolicy: Owner
14+
deletionPolicy: Delete
15+
template:
16+
engineVersion: v2
17+
data:
18+
token: "{{ .token }}"
19+
bearer_token: "Token {{ .token }}"
20+
data:
21+
- secretKey: token
22+
remoteRef:
23+
key: undersync-token
24+
property: token
25+
# necessary to avoid argoproj/argo-cd#13004
26+
conversionStrategy: Default
27+
decodingStrategy: None
28+
metadataPolicy: None

0 commit comments

Comments
 (0)