---
- hosts: all
  become: true
  gather_facts: no

  vars:
    commands:
      - name: timedate_info
        cmd: timedatectl status
      - name: kernel_info
        cmd: uname -r
      - name: docker_info
        cmd: docker info
      - name: ip_info
        cmd: ip -4 -o a
      - name: route_info
        cmd: ip ro
      - name: proc_info
        cmd: ps auxf | grep -v ]$
      - name: systemctl_failed_info
        cmd: systemctl --state=failed --no-pager
      - name: k8s_info
        cmd: kubectl get all --all-namespaces -o wide
      - name: errors_info
        cmd: journalctl -p err --no-pager
      - name: etcd_info
        cmd: etcdctl --peers={{ etcd_access_addresses }} cluster-health
      - name: weave_info
        cmd: weave report
      - name: weave_logs
        cmd: docker logs weave
      - name: kube_describe_all
        cmd: kubectl describe all --all-namespaces
      - name: kubedns_logs
        cmd: "for i in `kubectl get pods --all-namespaces -l k8s-app=kubedns -o jsonpath={.items..metadata.name}`;
          do kubectl logs ${i} --namespace kube-system kubedns; done"
      - name: apiserver_logs
        cmd: "for i in `kubectl get pods --all-namespaces -l k8s-app=kube-apiserver -o jsonpath={.items..metadata.name}`;
          do kubectl logs ${i} --namespace kube-system; done"
      - name: controller_logs
        cmd: "for i in `kubectl get pods --all-namespaces -l k8s-app=kube-controller -o jsonpath={.items..metadata.name}`;
          do kubectl logs ${i} --namespace kube-system; done"
      - name: scheduler_logs
        cmd: "for i in `kubectl get pods --all-namespaces -l k8s-app=kube-scheduler -o jsonpath={.items..metadata.name}`;
          do kubectl logs ${i} --namespace kube-system; done"
      - name: proxy_logs
        cmd: "for i in `kubectl get pods --all-namespaces -l k8s-app=kube-proxy -o jsonpath={.items..metadata.name}`;
          do kubectl logs ${i} --namespace kube-system; done"
      - name: nginx_logs
        cmd: "for i in `kubectl get pods --all-namespaces -l k8s-app=kube-nginx -o jsonpath={.items..metadata.name}`;
          do kubectl logs ${i} --namespace kube-system; done"
      - name: flannel_logs
        cmd: "for i in `kubectl get pods --all-namespaces -l app=flannel -o jsonpath={.items..metadata.name}`;
          do kubectl logs ${i} --namespace kube-system flannel-container; done"
      - name: canal_logs
        cmd: "for i in `kubectl get pods --all-namespaces -l k8s-app=canal-node -o jsonpath={.items..metadata.name}`;
          do kubectl logs ${i} --namespace kube-system flannel; done"
      - name: calico_policy_logs
        cmd: "for i in `kubectl get pods --all-namespaces -l k8s-app=calico-policy -o jsonpath={.items..metadata.name}`;
          do kubectl logs ${i} --namespace kube-system calico-policy-controller; done"

    logs:
      - /var/log/syslog
      - /var/log/daemon.log
      - /var/log/kern.log
      - /var/log/dpkg.log
      - /var/log/apt/history.log
      - /var/log/yum.log
      - /var/log/calico/bird/current
      - /var/log/calico/bird6/current
      - /var/log/calico/felix/current
      - /var/log/calico/confd/current

  tasks:
    - set_fact:
        etcd_access_addresses: |-
          {% for item in groups['etcd'] -%}
            https://{{ item }}:2379{% if not loop.last %},{% endif %}
          {%- endfor %}

    - name: Storing commands output
      shell: "{{ item.cmd }} 2>&1 | tee {{ item.name }}"
      register: output
      ignore_errors: true
      with_items: "{{commands}}"
      no_log: True

    - name: Fetch results
      fetch: src={{ item.name }} dest=/tmp/collect-info/commands
      with_items: "{{commands}}"

    - name: Fetch logs
      fetch: src={{ item }} dest=/tmp/collect-info/logs
      with_items: "{{logs}}"

    - name: Pack results and logs
      local_action: raw GZIP=-9 tar --remove-files -cvzf {{dir|default(".")}}/logs.tar.gz -C /tmp collect-info
      run_once: true

    - name: Clean up collected command outputs
      file: path={{ item.name }} state=absent
      with_items: "{{commands}}"