03_administrator.ymlΒΆ

---
- name: "⏳ Wait until the Pixelfed users table exists"
  database_query:
    config: "{{ lookup('database', application_id) }}"
    query_file: "{{ role_path }}/files/sql/select/users-table.sql"
    named_args:
      db_name: "{{ PIXELFED_DB_NAME }}"
    expect_rows: true
    mask_values: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}"
  register: pixelfed_users_table
  changed_when: false
  retries: 60
  delay: 5
  until: pixelfed_users_table.rows | length > 0
  no_log: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}"

- name: "πŸ”Ž Check whether the Pixelfed administrator already exists"
  database_query:
    config: "{{ lookup('database', application_id) }}"
    query_file: "{{ role_path }}/files/sql/select/admin-id.sql"
    named_args:
      admin_username: "{{ PIXELFED_ADMIN_USERNAME }}"
    expect_rows: true
    mask_values: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}"
  register: pixelfed_admin_id_existing
  changed_when: false
  no_log: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}"

- name: "πŸ“ Create the Pixelfed administrator via artisan"
  ansible.builtin.command:
    expand_argument_vars: false
    argv:
      - container
      - exec
      - -u
      - "{{ PIXELFED_APP_USER }}"
      - -e
      - PIXELFED_ADMIN_PASSWORD
      - "{{ PIXELFED_LOCAL_CID }}" # nocheck: container-exec-resolver  PIXELFED_LOCAL_CID resolved at delegate_to runtime
      - sh
      - -c
      - exec php artisan user:create "$@" --password="$PIXELFED_ADMIN_PASSWORD"
      - sh
      - "--name={{ PIXELFED_ADMIN_NAME }}"
      - "--username={{ PIXELFED_ADMIN_USERNAME }}"
      - "--email={{ PIXELFED_ADMIN_EMAIL }}"
      - --is_admin=true
      - --confirm_email=1
  environment:
    PIXELFED_ADMIN_PASSWORD: "{{ PIXELFED_ADMIN_PASSWORD }}"
  when: pixelfed_admin_id_existing.rows | length == 0
  register: pixelfed_admin_create
  changed_when: pixelfed_admin_create.rc == 0
  no_log: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}"
  delegate_to: "{{ PIXELFED_HOST_NODE }}"

- name: "πŸ” Resolve the Pixelfed administrator id"
  database_query:
    config: "{{ lookup('database', application_id) }}"
    query_file: "{{ role_path }}/files/sql/select/admin-id.sql"
    named_args:
      admin_username: "{{ PIXELFED_ADMIN_USERNAME }}"
    expect_rows: true
    mask_values: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}"
  register: pixelfed_admin_id
  changed_when: false
  failed_when: pixelfed_admin_id.rows | length == 0
  no_log: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}"

- name: "πŸ”‘ Converge the Pixelfed administrator password"
  ansible.builtin.shell: >- # nocheck: container-exec-resolver  PIXELFED_LOCAL_CID resolved at delegate_to runtime
    container exec -i -e PIXELFED_APP_DIR -e PIXELFED_ADMIN_USERNAME -e PIXELFED_ADMIN_PASSWORD
    -u {{ PIXELFED_APP_USER }}
    {{ PIXELFED_LOCAL_CID | quote }} php --
  args:
    stdin: "{{ lookup('file', role_path + '/files/php/converge_admin_password.php') }}"
  environment:
    PIXELFED_APP_DIR: "{{ PIXELFED_APP_DIR }}"
    PIXELFED_ADMIN_USERNAME: "{{ PIXELFED_ADMIN_USERNAME }}"
    PIXELFED_ADMIN_PASSWORD: "{{ PIXELFED_ADMIN_PASSWORD }}"
  delegate_to: "{{ PIXELFED_HOST_NODE }}"
  register: pixelfed_admin_password
  changed_when: "'PASSWORD_SET' in pixelfed_admin_password.stdout"
  failed_when: >-
    pixelfed_admin_password.rc != 0
    or pixelfed_admin_password.stdout is not search('(?m)^PASSWORD_(SET|KEPT)$')
  no_log: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}"

- name: "πŸ‘‘ Ensure the Pixelfed administrator carries the admin flag"
  database_query:
    config: "{{ lookup('database', application_id) }}"
    query_file: "{{ role_path }}/files/sql/update/admin-flag.sql"
    named_args:
      admin_username: "{{ PIXELFED_ADMIN_USERNAME }}"
    expect_rows: true
    mask_values: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}"
  register: pixelfed_admin_flag
  changed_when: (pixelfed_admin_flag.rows[-1][0] | int) > 0
  no_log: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}"