Skip to content

Commit e937bbf

Browse files
author
Martin Jackson
committed
Merge commit '9a3c487421e63ce5b50e4cabc9a2236ab5bf1622'
2 parents 0c5d70b + 9a3c487 commit e937bbf

File tree

5 files changed

+122
-0
lines changed

5 files changed

+122
-0
lines changed

common/.ansible-lint

+1
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@ exclude_paths:
1616
- ./ansible/playbooks/iib-ci/iib-ci.yaml
1717
- ./ansible/playbooks/k8s_secrets/k8s_secrets.yml
1818
- ./ansible/playbooks/process_secrets/process_secrets.yml
19+
- ./ansible/playbooks/write-token-kubeconfig/write-token-kubeconfig.yml
1920
- ./ansible/playbooks/process_secrets/display_secrets_info.yml
2021
- ./ansible/roles/vault_utils/tests/test.yml

common/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ load-iib: ## CI target to install Index Image Bundles
119119
exit 1; \
120120
fi
121121

122+
.PHONY: token-kubeconfig
123+
token-kubeconfig: ## Create a local ~/.kube/config with password (not usually needed)
124+
common/scripts/write-token-kubeconfig.sh
122125

123126
##@ Validation Tasks
124127

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
---
2+
- name: Test k8s authentication methods
3+
hosts: localhost
4+
connection: local
5+
gather_facts: false
6+
become: false
7+
vars:
8+
kubeconfig_file: '~/.kube/config'
9+
k8s_host: '{{ lookup("env", "K8S_AUTH_HOST") }}'
10+
k8s_validate_certs: '{{ lookup("env", "K8S_AUTH_VERIFY_SSL") | default(false) | bool }}'
11+
k8s_username: '{{ lookup("env", "K8S_AUTH_USERNAME") | default("kubeconfig") }}'
12+
k8s_password: '{{ lookup("env", "K8S_AUTH_PASSWORD") | default(omit) }}'
13+
k8s_api_key: '{{ lookup("env", "K8S_AUTH_TOKEN") | default(omit) }}'
14+
k8s_ca_cert_file: '{{ lookup("env", "K8S_AUTH_SSL_CA_CERT") | default(omit) }}'
15+
tasks:
16+
- name: Check for pre-existing kubeconfig
17+
ansible.builtin.stat:
18+
path: '{{ kubeconfig_file }}'
19+
register: kubeconfig_stat
20+
21+
- name: Exit if kubeconfig found
22+
ansible.builtin.fail:
23+
msg: '{{ kubeconfig_file }} already exists! Exiting'
24+
when: kubeconfig_stat.stat.exists
25+
26+
- name: Get namespaces to test parameters
27+
kubernetes.core.k8s_info:
28+
host: '{{ k8s_host }}'
29+
validate_certs: '{{ k8s_validate_certs }}'
30+
username: '{{ k8s_username }}'
31+
api_key: '{{ k8s_api_key }}'
32+
ca_cert: '{{ k8s_ca_cert_file | default(omit) }}'
33+
kind: namespace
34+
when: k8s_api_key
35+
36+
- name: Login explicitly
37+
when: not k8s_api_key
38+
block:
39+
- name: Login explicitly to get token
40+
kubernetes.core.k8s_auth:
41+
host: '{{ k8s_host }}'
42+
validate_certs: '{{ k8s_validate_certs }}'
43+
username: '{{ k8s_username }}'
44+
password: '{{ k8s_password }}'
45+
ca_cert: '{{ k8s_ca_cert_file | default(omit) }}'
46+
register: auth
47+
48+
- name: Set api_key
49+
ansible.builtin.set_fact:
50+
k8s_api_key: '{{ auth.openshift_auth.api_key }}'
51+
52+
- name: Update username if needed
53+
ansible.builtin.set_fact:
54+
config_k8s_username: 'kube:admin'
55+
when: k8s_username == 'kubeadmin'
56+
57+
- name: Determine clustername
58+
ansible.builtin.set_fact:
59+
config_k8s_clustername: "{{ k8s_host | regex_replace('https://', '') | regex_replace('\\.', '-') }}"
60+
61+
- name: Write config file
62+
ansible.builtin.copy:
63+
content: |-
64+
apiVersion: v1
65+
clusters:
66+
- cluster:
67+
{% if k8s_validate_certs is false %}
68+
insecure-skip-tls-verify: true
69+
{% endif %}
70+
{% if k8s_ca_cert_file -%}
71+
certificate-authority-data: {{ lookup("file", k8s_ca_cert_file) | b64encode }}
72+
{% endif %}
73+
server: {{ k8s_host }}
74+
name: {{ config_k8s_clustername }}
75+
contexts:
76+
- context:
77+
cluster: {{ config_k8s_clustername }}
78+
namespace: default
79+
user: {{ config_k8s_username | default(k8s_username) }}/{{ config_k8s_clustername }}
80+
name: default/{{ config_k8s_clustername }}/{{ config_k8s_username | default(k8s_username) }}
81+
current-context: default/{{ config_k8s_clustername }}/{{ config_k8s_username | default(k8s_username) }}
82+
kind: Config
83+
preferences: {}
84+
users:
85+
- name: {{ config_k8s_username | default(k8s_username) }}/{{ config_k8s_clustername }}
86+
user:
87+
token: {{ k8s_api_key }}
88+
dest: '{{ kubeconfig_file }}'
89+
mode: '0640'
90+
91+
- name: Notify user
92+
ansible.builtin.debug:
93+
msg: "Wrote {{ kubeconfig_file }}"

common/scripts/pattern-util.sh

+6
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ podman run -it --rm --pull=newer \
6767
-e EXTRA_HELM_OPTS \
6868
-e EXTRA_PLAYBOOK_OPTS \
6969
-e KUBECONFIG \
70+
-e K8S_AUTH_HOST \
71+
-e K8S_AUTH_VERIFY_SSL \
72+
-e K8S_AUTH_SSL_CA_CERT \
73+
-e K8S_AUTH_USERNAME \
74+
-e K8S_AUTH_PASSWORD \
75+
-e K8S_AUTH_TOKEN \
7076
-v "${PKI_HOST_MOUNT}":/etc/pki:ro \
7177
-v "${HOME}":"${HOME}" \
7278
-v "${HOME}":/pattern-home \
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#!/usr/bin/env bash
2+
set -eu
3+
4+
OUTPUTFILE=${1:-"~/.kube/config"}
5+
6+
get_abs_filename() {
7+
# $1 : relative filename
8+
echo "$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
9+
}
10+
11+
SCRIPT=$(get_abs_filename "$0")
12+
SCRIPTPATH=$(dirname "${SCRIPT}")
13+
COMMONPATH=$(dirname "${SCRIPTPATH}")
14+
PATTERNPATH=$(dirname "${COMMONPATH}")
15+
ANSIBLEPATH="$(dirname ${SCRIPTPATH})/ansible"
16+
PLAYBOOKPATH="${ANSIBLEPATH}/playbooks"
17+
export ANSIBLE_CONFIG="${ANSIBLEPATH}/ansible.cfg"
18+
19+
ansible-playbook -e pattern_dir="${PATTERNPATH}" -e kubeconfig_file="${OUTPUTFILE}" "${PLAYBOOKPATH}/write-token-kubeconfig/write-token-kubeconfig.yml"

0 commit comments

Comments
 (0)