Playbooks to a new Lilik
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
5.4 KiB

  1. ---
  2. - name: 'TLS | verify if cert is valid'
  3. command: >
  4. openssl verify
  5. -CAfile {{ ca_cert_tls_ca_path }}
  6. -verify_hostname {{ ca_cert_common_name }}
  7. {{ ca_cert_tls_cert_path }}
  8. register: ca_cert_tls_cert_is_valid
  9. check_mode: false
  10. changed_when: ca_cert_tls_cert_is_valid.rc != 0
  11. failed_when: false
  12. when: ca_cert_proto == 'tls'
  13. - name: 'SSH | verify if cert is valid and get info'
  14. ssh_cert:
  15. path: '{{ ca_cert_ssh_key_path }}-cert.pub'
  16. ca_path: '{{ ca_cert_ssh_ca_path }}'
  17. principals: [ '{{ ca_cert_common_name }}' ]
  18. register: ca_cert_ssh_cert_is_valid
  19. changed_when: ca_cert_ssh_cert_is_valid.rc != 0
  20. ignore_errors: true
  21. check_mode: false
  22. when: ca_cert_proto == 'ssh'
  23. - name: 'TLS | get remaining validity'
  24. shell: >
  25. {% if ansible_distribution != 'OpenWrt' %}
  26. echo $(( ($(date -d "$(openssl x509 -in {{ ca_cert_tls_cert_path }} -enddate -noout | sed "s/.*=\(.*\)/\1/")" +%s)-$(date -d now +%s))/86400 ))
  27. {% else %}
  28. echo $(( ($(date -D '%b %e %H:%M:%S %Y' -d "$(openssl x509 -in {{ ca_cert_tls_cert_path }} -enddate -noout | sed "s/.*=\(.*\)/\1/")" +%s)-$(date +%s))/86400 ))
  29. {% endif %}
  30. register: ca_cert_cert_remaining_days
  31. changed_when: false
  32. check_mode: false
  33. when: ca_cert_proto == 'tls' and not ca_cert_tls_cert_is_valid.changed
  34. - name: 'set cert validity'
  35. set_fact:
  36. ca_cert_cert_is_valid: >-
  37. {% if ca_cert_proto == 'tls' %}{{ ca_cert_tls_cert_is_valid }}{%
  38. elif ca_cert_proto == 'ssh' %}{{ ca_cert_ssh_cert_is_valid }}{% endif %}
  39. - name: 'set remaning validity'
  40. set_fact:
  41. ca_cert_cert_remaining_days: >-
  42. {% if ca_cert_proto == 'tls' %}{{ ca_cert_cert_remaining_days.stdout }}{%
  43. elif ca_cert_proto == 'ssh' %}{{ ca_cert_cert_is_valid.certificate.valid.remaining_days }}{% endif %}
  44. when: ca_cert_cert_is_valid.rc|d(1) == 0
  45. - name: 'renew'
  46. block:
  47. - name: 'RENEW | backup existing private keys'
  48. copy:
  49. remote_src: true
  50. src: '{{ item }}'
  51. dest: '{{ item }}-backup'
  52. failed_when: false
  53. register: ca_cert_key_backup
  54. loop: '{{ keypair[ca_cert_proto] }}'
  55. vars:
  56. keypair:
  57. ssh:
  58. - '{{ ca_cert_ssh_key_path }}'
  59. - '{{ ca_cert_ssh_key_path }}.pub'
  60. tls:
  61. - '{{ ca_cert_tls_key_path }}'
  62. - name: 'RENEW | TLS | create private key (if not exists)'
  63. command: >
  64. openssl genpkey
  65. -algorithm ed25519
  66. -out {{ ca_cert_tls_key_path }}
  67. args:
  68. creates: >-
  69. {{ "" if ca_cert_renew_private_key else ca_cert_tls_key_path }}
  70. when: ca_cert_proto == 'tls'
  71. - name: 'RENEW | SSH | create key pair'
  72. openssh_keypair:
  73. force: '{{ ca_cert_renew_private_key }}'
  74. path: '{{ ca_cert_ssh_key_path }}'
  75. type: 'ed25519'
  76. when: ca_cert_proto == 'ssh'
  77. - name: 'RENEW | TLS | create cert signing request'
  78. command: >
  79. openssl req
  80. -new
  81. -subj '{{ ca_cert_tls_subj }}'
  82. -key '{{ ca_cert_tls_key_path }}'
  83. -out '{{ ca_cert_tls_csr_path }}'
  84. when: ca_cert_proto == 'tls'
  85. - name: 'RENEW | CA_MANAGER | generate json signing request'
  86. cert_request:
  87. host: '{{ ca_cert_common_name }}'
  88. path: >-
  89. {% if ca_cert_proto == 'tls' %}{{ ca_cert_tls_csr_path }}{%
  90. elif ca_cert_proto == 'ssh' %}{{ ca_cert_ssh_key_path+'.pub' }}{% endif %}
  91. proto: '{{ "ssl" if ca_cert_proto == "tls" else ca_cert_proto }}'
  92. client: '{{ ca_cert_client }}'
  93. register: ca_cert_signing_request
  94. - name: 'RENEW | CA_MANAGER | send signing request'
  95. raw: '{{ ca_cert_signing_request | to_json }}'
  96. delegate_to: '{{ ca_cert_ca_manager_host }}'
  97. delegate_facts: true
  98. register: ca_cert_signing_request_results
  99. failed_when: (ca_cert_signing_request_results.stdout|from_json).failed
  100. - name: 'RENEW | CA_MANAGER | set signing request id'
  101. set_fact:
  102. ca_cert_request_id: >-
  103. {{ (ca_cert_signing_request_results.stdout|from_json).requestID }}
  104. - name: 'RENEW | CA_MANAGER | generate json get request'
  105. set_fact:
  106. ca_cert_get_request:
  107. type: 'get_certificate'
  108. requestID: '{{ ca_cert_request_id }}'
  109. - name: 'RENEW | CA_MANAGER | prompt for signature'
  110. debug:
  111. msg: >-
  112. Please manually confirm sign request with id {{ ca_cert_request_id }}.
  113. - name: 'RENEW | CA_MANAGER | send get request'
  114. raw: '{{ ca_cert_get_request | to_json }}'
  115. delegate_to: '{{ ca_cert_ca_manager_host }}'
  116. delegate_facts: true
  117. register: ca_cert_get_request_results
  118. failed_when: (ca_cert_get_request_results.stdout|from_json).failed
  119. - name: 'RENEW | store new certificate'
  120. copy:
  121. content: '{{ (ca_cert_get_request_results.stdout|from_json).result }}'
  122. dest: >-
  123. {% if ca_cert_proto == 'tls' %}{{ ca_cert_tls_cert_path }}{%
  124. elif ca_cert_proto == 'ssh' %}{{ ca_cert_ssh_key_path }}-cert.pub{% endif %}
  125. rescue:
  126. - name: 'RENEW FAILED | restore backup'
  127. copy:
  128. remote_src: true
  129. src: '{{ item.dest }}'
  130. dest: '{{ item.src }}'
  131. when: not item.failed
  132. loop: '{{ ca_cert_key_backup.results }}'
  133. always:
  134. - name: 'RENEW | clean backup'
  135. file:
  136. path: '{{ item.dest }}'
  137. state: 'absent'
  138. when: not item.failed
  139. loop: '{{ ca_cert_key_backup.results }}'
  140. when: ca_cert_cert_is_valid.changed or ca_cert_cert_remaining_days|int < ca_cert_min_days_validity
  141. ...