|
| 1 | +- include_tasks: "RedHat.yml" |
| 2 | +- include_tasks: "Debian.yml" |
| 3 | + |
| 4 | +- name: Get system hostname |
| 5 | + ansible.builtin.shell: hostname |
| 6 | + register: hostname_raw |
| 7 | + changed_when: false |
| 8 | + |
| 9 | +- name: Set hostname variable |
| 10 | + ansible.builtin.set_fact: |
| 11 | + hostname: "{{ hostname_raw.stdout }}" |
| 12 | + |
| 13 | +- name: Remove pre-existing kerberos container |
| 14 | + docker_container: |
| 15 | + name: kerberos |
| 16 | + state: absent |
| 17 | + keep_volumes: false |
| 18 | + |
| 19 | +- name: Create required folders |
| 20 | + become: true |
| 21 | + ansible.builtin.file: |
| 22 | + path: "{{ item }}" |
| 23 | + state: directory |
| 24 | + owner: root |
| 25 | + group: root |
| 26 | + mode: '0750' |
| 27 | + loop: |
| 28 | + - /var/lib/krb5kdc |
| 29 | + - /keytabs |
| 30 | + |
| 31 | +- name: Copy KDC configuration file to host |
| 32 | + template: |
| 33 | + src: krb5.conf |
| 34 | + dest: "/etc/krb5.conf" |
| 35 | + |
| 36 | +- name: Start Kerberos container |
| 37 | + community.docker.docker_container: |
| 38 | + name: kerberos |
| 39 | + image: "alpine" |
| 40 | + command: > |
| 41 | + sh -c ' |
| 42 | + apk add --no-cache bash krb5 krb5-server krb5-pkinit && |
| 43 | + if [ ! -f /var/lib/krb5kdc/principal ]; then |
| 44 | + kdb5_util -P password create && |
| 45 | + kadmin.local -q "addprinc -pw password root/admin"; |
| 46 | + fi && |
| 47 | + /usr/sbin/krb5kdc -n |
| 48 | + ' |
| 49 | + restart_policy: unless-stopped |
| 50 | + published_ports: |
| 51 | + - "88:88/udp" |
| 52 | + - "88:88/tcp" |
| 53 | + volumes: |
| 54 | + - "/etc/krb5.conf:/etc/krb5.conf" |
| 55 | + - "/var/lib/krb5kdc:/var/lib/krb5kdc" |
| 56 | + - "/keytabs:/keytabs" |
| 57 | + |
| 58 | +- name: Waiting for Kerberos container to be ready |
| 59 | + ansible.builtin.command: |
| 60 | + cmd: > |
| 61 | + docker exec kerberos sh -c 'test -x /usr/sbin/kadmin.local' |
| 62 | + register: kadmin_check |
| 63 | + retries: 10 |
| 64 | + delay: 2 |
| 65 | + until: kadmin_check.rc == 0 |
| 66 | + changed_when: false |
| 67 | + |
| 68 | +- name: Create MongoDB service principal for mongod |
| 69 | + ansible.builtin.command: |
| 70 | + cmd: > |
| 71 | + docker exec kerberos sh -c 'kadmin.local -q "addprinc -randkey mongodb/{{ hostname }}@PERCONATEST.COM"' |
| 72 | + register: add_service_princ |
| 73 | + failed_when: > |
| 74 | + add_service_princ.rc != 0 and |
| 75 | + ("already exists" not in (add_service_princ.stderr | default(''))) and |
| 76 | + ("already exists" not in (add_service_princ.stdout | default(''))) |
| 77 | +
|
| 78 | +- name: Create Service Key and store it in the Keytab |
| 79 | + ansible.builtin.command: |
| 80 | + cmd: > |
| 81 | + docker exec kerberos sh -c 'kadmin.local -q "ktadd -k /keytabs/mongodb.keytab mongodb/{{ hostname }}@PERCONATEST.COM"' |
| 82 | +
|
| 83 | +- name: Copy mongodb.keytab from container to host |
| 84 | + ansible.builtin.command: |
| 85 | + cmd: > |
| 86 | + docker cp kerberos:/keytabs/mongodb.keytab /etc/mongodb.keytab |
| 87 | + register: docker_cp_keytab |
| 88 | + changed_when: docker_cp_keytab.rc == 0 |
| 89 | + |
| 90 | +- name: Give /etc/mongodb.keytab mongod permissions |
| 91 | + ansible.builtin.file: |
| 92 | + path: /etc/mongodb.keytab |
| 93 | + owner: mongod |
| 94 | + group: mongod |
| 95 | + mode: '0600' |
| 96 | + |
| 97 | +- name: Add KRB5_KTNAME variable for PSMDB (Debian) |
| 98 | + lineinfile: |
| 99 | + path: /etc/default/mongod |
| 100 | + line: KRB5_KTNAME=/etc/mongodb.keytab |
| 101 | + create: yes |
| 102 | + when: ansible_os_family == "Debian" |
| 103 | + |
| 104 | +- name: Add KRB5_KTNAME variable for PSMDB (RedHat) |
| 105 | + lineinfile: |
| 106 | + path: /etc/sysconfig/mongod |
| 107 | + line: KRB5_KTNAME=/etc/mongodb.keytab |
| 108 | + create: yes |
| 109 | + when: ansible_os_family == "RedHat" |
| 110 | + |
| 111 | +- name: Check if Percona directory exists |
| 112 | + ansible.builtin.stat: |
| 113 | + path: /percona-server-mongodb |
| 114 | + register: percona_dir |
| 115 | + |
| 116 | +- name: Restart mongod to pick up Kerberos keytab env |
| 117 | + ansible.builtin.service: |
| 118 | + name: mongod |
| 119 | + state: restarted |
| 120 | + enabled: yes |
| 121 | + when: not percona_dir.stat.isdir | default(false) |
| 122 | + |
| 123 | +- name: Adding short form of hostname to /etc/hosts (Debian 11) |
| 124 | + become: true |
| 125 | + ansible.builtin.replace: |
| 126 | + path: /etc/hosts |
| 127 | + regexp: '^\s*(127\.0\.1\.1)\s+.*$' |
| 128 | + replace: '\1 {{ hostname }}' |
| 129 | + unsafe_writes: true |
| 130 | + when: |
| 131 | + - ansible_distribution == "Debian" |
| 132 | + - ansible_distribution_major_version | int == 11 |
| 133 | + |
| 134 | +- name: Add kerberos user to /etc/hosts |
| 135 | + lineinfile: |
| 136 | + state: present |
| 137 | + dest: /etc/hosts |
| 138 | + line: '127.0.0.1 {{ hostname }}' |
| 139 | + unsafe_writes: yes |
0 commit comments