Razique Mahroua
2020-03-18 b85c91a8192593f6b62f93e11c971868964343a9
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
---
# Start / Stop Logic for OCP 4 Clusters
 
- import_playbook: ../../setup_runtime.yml
 
- name: Build inventory
  hosts: localhost
  connection: local
  gather_facts: false
  become: false
  tasks:
    - when: cloud_provider == 'ec2'
      block:
      - name: Run infra-ec2-create-inventory Role
        include_role:
          name: infra-ec2-create-inventory
 
      - name: Run Common SSH Config Generator Role
        include_role:
          name: infra-common-ssh-config-generate
        when: "'bastions' in groups"
 
- name: Set ansible_ssh_extra_args
  hosts:
    - all:!windows:!network
  gather_facts: false
  any_errors_fatal: true
  ignore_errors: false
  tasks:
    - name: Set facts for remote access
      set_fact:
        ansible_ssh_extra_args: >-
          {{ ansible_ssh_extra_args|d() }}
          -F {{hostvars.localhost.output_dir}}/{{ env_type }}_{{ guid }}_ssh_conf
 
- name: Run stop/start/status/... actions
  hosts: localhost
  connection: local
  gather_facts: False
  become: no
  tasks:
  - name: Check for project_tag
    when: project_tag is not defined or project_tag == ''
    fail:
      msg: "project_tag is not defined"
 
  - name: Check for ACTION
    when: ACTION is not defined
    fail:
      msg: "ACTION is not defined"
 
  - name: Start / Stop VMs on AWS
    when:
      - cloud_provider == 'ec2'
      - guid is defined
      - guid != ''
      - guid != '*'
    environment:
      AWS_ACCESS_KEY_ID: "{{aws_access_key_id}}"
      AWS_SECRET_ACCESS_KEY: "{{aws_secret_access_key}}"
      AWS_DEFAULT_REGION: "{{aws_region_final|d(aws_region)}}"
    block:
    - name: Stop instances by (guid,env_type) tags
      when: ACTION == 'stop'
      ec2_instance:
        state: stopped
        wait: "{{ aws_instance_wait_for_stop | default(false) }}"
        filters:
          "tag:guid": "{{ guid }}"
          "tag:env_type": "{{ env_type }}"
          instance-state-name: running
 
    - name: Start instances by (guid, env_type) tags
      when: ACTION == 'start'
      ec2_instance:
        state: started
        wait: true
        filters:
          "tag:guid": "{{ guid }}"
          "tag:env_type": "{{ env_type }}"
          instance-state-name: stopped
    - when: ACTION == 'status'
      block:
        - name: Get EC2 facts using (guid, env_type) tag
          ec2_instance_facts:
            filters:
              "tag:guid": "{{ guid }}"
              "tag:env_type": "{{ env_type }}"
          register: r_instances
 
        - name: Print status information to a file
          template:
            dest: "{{ output_dir }}/status.txt"
            src: files/status.j2
 
- name: Run recover cluster actions
  hosts: bastions
  run_once: true
  become: false
  gather_facts: false
  tasks:
  - name: Set Ansible Python interpreter to k8s virtualenv
    set_fact:
      ansible_python_interpreter: /opt/virtualenvs/k8s/bin/python
 
  - name: Recover cluster if it missed cert rotation
    when: ACTION == 'start'
    block:
    - name: Wait (default 3m) for Nodes to settle and pods to start
      pause:
        seconds: "{{ lifecycle_start_pause | default(180) }}"
 
    - name: Get CSRs that need to be approved
      k8s_facts:
        api_version: certificates.k8s.io/v1beta1
        kind: CertificateSigningRequest
        # Field selectors don't seem to work
        # field_selectors:
        # - status.conditions[0].type="Pending"
      register: r_csrs
 
    - name: Approve all Pending CSRs
      when: r_csrs.resources | length > 0
      command: "oc adm certificate approve {{ item.metadata.name }}"
      loop: "{{ r_csrs.resources }}"
 
    # TODO: Implement proper loop to watch for incoming CSRS while we are
    # approving them. For now, this is a workaround, just wait and re-approve.
    - name: Wait 10s for additional CSRs to appear
      pause:
        seconds: 10
 
    - name: Get additional CSRs that need to be approved
      k8s_facts:
        api_version: certificates.k8s.io/v1beta1
        kind: CertificateSigningRequest
        # Field selectors don't seem to work
        # field_selectors:
        # - status.conditions[0].type = "Pending"
      register: r_new_csrs
 
    - name: Approve all additional Pending CSRs
      when: r_new_csrs.resources | length > 0
      command: "oc adm certificate approve {{ item.metadata.name }}"
      loop: "{{ r_new_csrs.resources }}"