--- # Deploy monitoring stack to Talos cluster via Ansible # # Prerequisites: # - kubectl configured with access to your Talos cluster # - kubernetes.core collection installed: ansible-galaxy collection install kubernetes.core # # Usage: # ansible-playbook -i inventory.yml kubernetes-playbook.yml # # Or with a specific kubeconfig: # ansible-playbook -i inventory.yml kubernetes-playbook.yml -e kubeconfig_path=~/.kube/talos-config - name: Deploy monitoring stack to Kubernetes hosts: localhost connection: local gather_facts: false vars: kubeconfig_path: "{{ lookup('env', 'KUBECONFIG') | default('~/.kube/config', true) }}" manifests_dir: "{{ playbook_dir }}/kubernetes" tasks: - name: Create monitoring namespace kubernetes.core.k8s: kubeconfig: "{{ kubeconfig_path }}" state: present src: "{{ manifests_dir }}/namespace.yaml" - name: Deploy Prometheus kubernetes.core.k8s: kubeconfig: "{{ kubeconfig_path }}" state: present src: "{{ item }}" loop: - "{{ manifests_dir }}/prometheus/rbac.yaml" - "{{ manifests_dir }}/prometheus/configmap.yaml" - "{{ manifests_dir }}/prometheus/deployment.yaml" - "{{ manifests_dir }}/prometheus/service.yaml" - name: Wait for Prometheus to be ready kubernetes.core.k8s_info: kubeconfig: "{{ kubeconfig_path }}" kind: Deployment name: prometheus namespace: monitoring register: prometheus_deployment until: prometheus_deployment.resources[0].status.readyReplicas | default(0) >= 1 retries: 30 delay: 10 - name: Deploy Loki kubernetes.core.k8s: kubeconfig: "{{ kubeconfig_path }}" state: present src: "{{ item }}" loop: - "{{ manifests_dir }}/loki/configmap.yaml" - "{{ manifests_dir }}/loki/deployment.yaml" - "{{ manifests_dir }}/loki/service.yaml" - name: Wait for Loki to be ready kubernetes.core.k8s_info: kubeconfig: "{{ kubeconfig_path }}" kind: Deployment name: loki namespace: monitoring register: loki_deployment until: loki_deployment.resources[0].status.readyReplicas | default(0) >= 1 retries: 30 delay: 10 - name: Deploy Promtail kubernetes.core.k8s: kubeconfig: "{{ kubeconfig_path }}" state: present src: "{{ item }}" loop: - "{{ manifests_dir }}/promtail/rbac.yaml" - "{{ manifests_dir }}/promtail/configmap.yaml" - "{{ manifests_dir }}/promtail/daemonset.yaml" - name: Deploy Node Exporter kubernetes.core.k8s: kubeconfig: "{{ kubeconfig_path }}" state: present src: "{{ manifests_dir }}/node-exporter/daemonset.yaml" - name: Deploy Kube State Metrics kubernetes.core.k8s: kubeconfig: "{{ kubeconfig_path }}" state: present src: "{{ item }}" loop: - "{{ manifests_dir }}/kube-state-metrics/rbac.yaml" - "{{ manifests_dir }}/kube-state-metrics/deployment.yaml" - name: Get cluster node IPs kubernetes.core.k8s_info: kubeconfig: "{{ kubeconfig_path }}" kind: Node register: cluster_nodes - name: Display access information ansible.builtin.debug: msg: - "Monitoring stack deployed successfully!" - "" - "Prometheus: http://:30090" - "Loki: http://:30100" - "" - "Node IPs:" - "{{ cluster_nodes.resources | map(attribute='status.addresses') | flatten | selectattr('type', 'equalto', 'InternalIP') | map(attribute='address') | list }}" - "" - "Update your RPi inventory.yml with one of these IPs for:" - " loki_url: http://:30100" - " prometheus_cluster_url: http://:30090"