From e8d059c8ed29eb30f53a16e00f4edcb7b3a9cef7 Mon Sep 17 00:00:00 2001 From: Fabio Scotto di Santolo Date: Fri, 11 Sep 2026 21:27:48 +0200 Subject: [PATCH] Install ChatGPT desktop on Fedora desktops --- README.md | 11 ++-- ansible/inventory/group_vars/all.yml | 7 +++ ansible/inventory/group_vars/fedora.yml | 10 ++++ ansible/inventory/host_vars/ikaros.yml | 7 ++- ansible/inventory/host_vars/nymph.yml | 2 + ...FA0E4AE8B8CC16A2D9BA684A3B4A566C4660E4.asc | 28 +++++++++++ ansible/roles/packages_fedora/tasks/main.yml | 50 +++++++++++++++++++ 7 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 ansible/roles/packages_fedora/files/RPM-GPG-KEY-chatgpt-3BFA0E4AE8B8CC16A2D9BA684A3B4A566C4660E4.asc diff --git a/README.md b/README.md index 8fe62a9..e139be6 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,10 @@ nymph is allowed to break `ikaros` is the stable personal Fedora/GNOME desktop. `nymph` is the laptop and gets the same shared desktop dotfiles while GNOME itself stays close to the Fedora defaults. The legacy `void` and `desktop` groups are compatibility parents; the main axes are `platform_*`, `role_*`, and `desktop_*`. +The official ChatGPT desktop RPM is enabled only on `ikaros` and `nymph`. The +playbook configures OpenAI's signed RPM repository and imports its pinned RPM +signing key before installation; subsequent updates are handled by DNF. + ## Desktop profiles - `ikaros`: stable Fedora Workstation + GNOME desktop. @@ -250,9 +254,10 @@ ansible-playbook ansible/site.yml --limit --tags emacs -e emacs_enabled=t ## AI coding agents The shared npm-managed agents are OpenCode, Claude Code, Codex, Gemini CLI, and -GitHub Copilot; IBM Bob is also managed on `deadalus`. Each agent has its own -lifecycle flags in `ansible/inventory/group_vars/all.yml`, so one agent can be -installed, configured, or removed without affecting the others: +GitHub Copilot; IBM Bob is also managed on `deadalus`. Codex Relay is installed +only on `ikaros`. Each agent has its own lifecycle flags in +`ansible/inventory/group_vars/all.yml`, so one agent can be installed, +configured, or removed without affecting the others: ```yaml ai_agents: diff --git a/ansible/inventory/group_vars/all.yml b/ansible/inventory/group_vars/all.yml index cd9e5b9..fad7a41 100644 --- a/ansible/inventory/group_vars/all.yml +++ b/ansible/inventory/group_vars/all.yml @@ -93,6 +93,8 @@ common_dotfiles: # AI coding-agent lifecycle controls are independent for every agent. # Installation and removal are mutually exclusive per agent; the common # pre-task enforces this before any changes are made. +codex_relay_install_enabled: false + ai_agents: opencode: npm_package: opencode-ai @@ -109,6 +111,11 @@ ai_agents: install_enabled: true deploy_enabled: true uninstall_enabled: false + codex_relay: + npm_package: codex-relay + install_enabled: "{{ codex_relay_install_enabled }}" + deploy_enabled: false + uninstall_enabled: false gemini_cli: npm_package: "@google/gemini-cli" install_enabled: true diff --git a/ansible/inventory/group_vars/fedora.yml b/ansible/inventory/group_vars/fedora.yml index 263b3cf..9d28748 100644 --- a/ansible/inventory/group_vars/fedora.yml +++ b/ansible/inventory/group_vars/fedora.yml @@ -58,3 +58,13 @@ fedora_dev_packages: fedora_flatpak_remote_name: flathub fedora_flatpak_remote_url: https://dl.flathub.org/repo/flathub.flatpakrepo + +chatgpt_desktop_enabled: false +chatgpt_desktop_supported_fedora_versions: + - "43" + - "44" +chatgpt_desktop_supported_architectures: + - x86_64 + - aarch64 +chatgpt_desktop_rpm_gpg_key: RPM-GPG-KEY-chatgpt-3BFA0E4AE8B8CC16A2D9BA684A3B4A566C4660E4.asc +chatgpt_desktop_rpm_repository: https://persistent.oaistatic.com/codex-app-prod/linux/rpm/$basearch diff --git a/ansible/inventory/host_vars/ikaros.yml b/ansible/inventory/host_vars/ikaros.yml index 983e26b..55c126e 100644 --- a/ansible/inventory/host_vars/ikaros.yml +++ b/ansible/inventory/host_vars/ikaros.yml @@ -1,6 +1,9 @@ --- hostname: ikaros +codex_relay_install_enabled: true +chatgpt_desktop_enabled: true + host_packages: - openssh-clients - openssh-server @@ -229,7 +232,7 @@ gnome_gsettings_settings: - schema: org.gnome.shell key: app-picker-layout value: >- - [{'System': <{'position': <0>}>, 'Utilities': <{'position': <1>}>, 'org.fedoraproject.MediaWriter.desktop': <{'position': <2>}>, 'org.gnome.Contacts.desktop': <{'position': <3>}>, 'org.gnome.Calendar.desktop': <{'position': <4>}>, 'org.gnome.Calculator.desktop': <{'position': <5>}>, 'org.gnome.Weather.desktop': <{'position': <6>}>, 'org.gnome.clocks.desktop': <{'position': <7>}>, 'org.gnome.Maps.desktop': <{'position': <8>}>, 'org.gnome.SimpleScan.desktop': <{'position': <9>}>, 'org.gnome.TextEditor.desktop': <{'position': <10>}>, 'org.gnome.Settings.desktop': <{'position': <11>}>, 'org.gnome.Boxes.desktop': <{'position': <12>}>, 'org.gnome.Showtime.desktop': <{'position': <13>}>, 'org.gnome.Snapshot.desktop': <{'position': <14>}>, 'org.gnome.Characters.desktop': <{'position': <15>}>, 'org.gnome.Tour.desktop': <{'position': <16>}>, 'org.gnome.Yelp.desktop': <{'position': <17>}>, 'org.gnome.Software.desktop': <{'position': <18>}>, 'be.alexandervanhee.gradia.desktop': <{'position': <19>}>, 'com.github.jeromerobert.pdfarranger.desktop': <{'position': <20>}>, 'org.onlyoffice.desktopeditors.desktop': <{'position': <21>}>, 'org.gnome.Meld.desktop': <{'position': <22>}>, 'com.mattjakeman.ExtensionManager.desktop': <{'position': <23>}>}, {'org.remmina.Remmina.desktop': <{'position': <0>}>, 'ch.protonmail.protonmail-bridge.desktop': <{'position': <1>}>, 'syncthing-start.desktop': <{'position': <2>}>, 'syncthing-ui.desktop': <{'position': <3>}>, 'emacs.desktop': <{'position': <4>}>, 'emacs-client.desktop': <{'position': <5>}>, 'org.gnome.gitlab.somas.Apostrophe.desktop': <{'position': <6>}>, 'mpv.desktop': <{'position': <7>}>, 'htop.desktop': <{'position': <8>}>, 'org.mozilla.thunderbird.desktop': <{'position': <9>}>}] + [{'System': <{'position': <0>}>, 'Utilities': <{'position': <1>}>, 'org.fedoraproject.MediaWriter.desktop': <{'position': <2>}>, 'org.gnome.Contacts.desktop': <{'position': <3>}>, 'org.gnome.Calendar.desktop': <{'position': <4>}>, 'org.gnome.Calculator.desktop': <{'position': <5>}>, 'org.gnome.Weather.desktop': <{'position': <6>}>, 'org.gnome.clocks.desktop': <{'position': <7>}>, 'org.gnome.Maps.desktop': <{'position': <8>}>, 'org.gnome.SimpleScan.desktop': <{'position': <9>}>, 'org.gnome.TextEditor.desktop': <{'position': <10>}>, 'org.gnome.Settings.desktop': <{'position': <11>}>, 'org.gnome.Boxes.desktop': <{'position': <12>}>, 'org.gnome.Showtime.desktop': <{'position': <13>}>, 'org.gnome.Snapshot.desktop': <{'position': <14>}>, 'org.gnome.Characters.desktop': <{'position': <15>}>, 'org.gnome.Tour.desktop': <{'position': <16>}>, 'org.gnome.Yelp.desktop': <{'position': <17>}>, 'org.gnome.Software.desktop': <{'position': <18>}>, 'be.alexandervanhee.gradia.desktop': <{'position': <19>}>, 'com.github.jeromerobert.pdfarranger.desktop': <{'position': <20>}>, 'org.onlyoffice.desktopeditors.desktop': <{'position': <21>}>, 'org.gnome.Meld.desktop': <{'position': <22>}>, 'com.mattjakeman.ExtensionManager.desktop': <{'position': <23>}>}, {'org.remmina.Remmina.desktop': <{'position': <0>}>, 'ch.protonmail.protonmail-bridge.desktop': <{'position': <1>}>, 'syncthing-start.desktop': <{'position': <2>}>, 'syncthing-ui.desktop': <{'position': <3>}>, 'emacs.desktop': <{'position': <4>}>, 'emacs-client.desktop': <{'position': <5>}>, 'org.gnome.gitlab.somas.Apostrophe.desktop': <{'position': <6>}>, 'mpv.desktop': <{'position': <7>}>, 'htop.desktop': <{'position': <8>}>, 'com.raspberrypi.rpi-imager.desktop': <{'position': <9>}>}] - schema: org.gnome.shell key: disabled-extensions value: >- @@ -241,7 +244,7 @@ gnome_gsettings_settings: - schema: org.gnome.shell key: favorite-apps value: >- - ['org.gnome.Nautilus.desktop', 'org.mozilla.firefox.desktop', 'com.spotify.Client.desktop', 'org.gnome.Evolution.desktop', 'org.telegram.desktop.desktop', 'org.gnome.Ptyxis.desktop', 'virt-manager.desktop'] + ['org.gnome.Nautilus.desktop', 'org.mozilla.firefox.desktop', 'com.spotify.Client.desktop', 'org.gnome.Evolution.desktop', 'org.telegram.desktop.desktop', 'chatgpt.desktop', 'org.gnome.Ptyxis.desktop', 'virt-manager.desktop'] - schema: org.gnome.shell key: remember-mount-password value: "true" diff --git a/ansible/inventory/host_vars/nymph.yml b/ansible/inventory/host_vars/nymph.yml index acfdedd..c8f164c 100644 --- a/ansible/inventory/host_vars/nymph.yml +++ b/ansible/inventory/host_vars/nymph.yml @@ -1,6 +1,8 @@ --- hostname: nymph +chatgpt_desktop_enabled: true + # Fedora Workstation/GNOME laptop target. GNOME is provided by the base Fedora # Workstation install; Ansible deploys shared desktop dotfiles but leaves GNOME # settings unmanaged for now. diff --git a/ansible/roles/packages_fedora/files/RPM-GPG-KEY-chatgpt-3BFA0E4AE8B8CC16A2D9BA684A3B4A566C4660E4.asc b/ansible/roles/packages_fedora/files/RPM-GPG-KEY-chatgpt-3BFA0E4AE8B8CC16A2D9BA684A3B4A566C4660E4.asc new file mode 100644 index 0000000..cc1c7cc --- /dev/null +++ b/ansible/roles/packages_fedora/files/RPM-GPG-KEY-chatgpt-3BFA0E4AE8B8CC16A2D9BA684A3B4A566C4660E4.asc @@ -0,0 +1,28 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBGpypFUBEACi1Vvzq9pIpA6lj7chbqELuxJtVuzUzxrasa6ZU0yF4yhq7jf8 +3YkJRHwbezBKeQyzJ5lkX0EhXS8aXxUhMAm3PFpAlwcInfKzmV7atJwvaxIw6Rmd +GYe9fBWKjTN/SmPIjtyxrTznZY97+TfD1AeGZpLaJ8fsnhrC+HkiN2TACiTocgpe +hFiP0OWK7mWZeTWnY2scpIYXP1Ro7nQv4KacmY4JacTQ7m/HM0Qej/3olhuEv2Cw +lMVWw57/oHhmTllfLDQOogFQyIVqaaR98y/Eu6cAabSfcsqAAZ2A8vfHYD27z28J +vLO2PZEJd5ThlnX4Zqv0eIpZdBj//8Sl/MSqTshFZ1NDsRoqwdqw284X5MpnOJ4k +4Sc2Se8tJxt/nCeibH3dJ504Fb1X/mnOqhCAQ6pVJz4RB5HRlFPSkxVPyag1v1m/ +7T4vie+OR4eqFQNz6mudrOoMmeVIfyL5fbe4cOr4fk/FyvEE2xMgkFatPqXn7vM9 +og+zremPCfwRAFpBPyX74VowFY7llcdaj/w8K5T8PzM14Hb3E4ZKizMluKmTvTq9 +WE1/eSQJLLQqXD5VmtmdUaC/VyE/1ZlIxcA1LWqvEQ327UXREvX/nHsrkKrl956W +jzkiHFUTsD1NJ0dMfs+csOt8Furb5jZj+HsMmCm9jLdfz5b/4WKLPbvxIwARAQAB +tBZDb2RleCBMaW51eCBSZXBvc2l0b3J5iQJRBBMBCgA7FiEEO/oOSui4zBai2bpo +SjtKVmxGYOQFAmpypFUCGwMFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQ +SjtKVmxGYORlCQ/9FyikZo8HQcJBP9E/oXVPds/fQnIFB2qJR2z3DrfYEonNt/ev +SAySkPPq4/mEOjaI0pFlDDGSaps+FTcJFgoVRTasBIF7JJivvjW9ap8iWEbhhVLe +IrFLbMLpUcTRntUx7R4fVMJ/1/cGn+NWZmNwS9ORorzSyCH0IAgCw1Xc3ZrjuMbF +VjdToMC1TiXXCEmlYpQakmQ3Ay1cH0FHC2BBNn1MNVkJdPhpZIZCdhaMPHfYFpyo +pg8wFvZ5iIcvlbMgyuy8CPJVRWUcYy2dOhEOGnYJnXRPkE3E1hf8YOHNzRlduH89 +6lT9qcEK2+fpLfrVGoc4zscLZ+Ey+Ko6iQRdVE1j67+wNR3hX8ukue574v1N/xxu +i575jumSE19lEj1sH4+P4gFHOtTbF0JhKKzLctbga0IAwTPKhnt3qzj1U5Yj/MZS +uEVjrLhdRauOuFBXUclgyVf2w/lE85UUOdlcollsYA6Huq7xDamqf8SslZQGre3E +I+lhpqJR1cOwDMUzzcl40uTyhrxXXd/bk4QSlhZbwHR25Pnt+ZMtWavlQWS0eDEV +8djuXAURCmx5WOqAFB/TJe1mn5EvyWg4VFzrY/NVNOpzgY5+Xp7J28z7f637r712 +Eu9j4imVcdPigwS+jf/0f81i2o9b82Y26TN8+EtDLCY841MJ1lrjDrX/dno= +=Y+3h +-----END PGP PUBLIC KEY BLOCK----- diff --git a/ansible/roles/packages_fedora/tasks/main.yml b/ansible/roles/packages_fedora/tasks/main.yml index ec21c45..4cb32c8 100644 --- a/ansible/roles/packages_fedora/tasks/main.yml +++ b/ansible/roles/packages_fedora/tasks/main.yml @@ -130,6 +130,56 @@ loop_control: label: "{{ item.key }}" +- name: Validate ChatGPT desktop architecture on Fedora + tags: [packages, chatgpt] + ansible.builtin.assert: + that: + - ansible_facts['architecture'] in chatgpt_desktop_supported_architectures + - ansible_facts['distribution_major_version'] in chatgpt_desktop_supported_fedora_versions + fail_msg: >- + ChatGPT desktop supports Fedora {{ chatgpt_desktop_supported_fedora_versions | join(' and ') }} + on x86_64 or aarch64; detected Fedora {{ ansible_facts['distribution_major_version'] }} + on {{ ansible_facts['architecture'] }}. + when: chatgpt_desktop_enabled | bool + +- name: Install ChatGPT desktop RPM signing key + tags: [packages, chatgpt] + ansible.builtin.copy: + src: "{{ chatgpt_desktop_rpm_gpg_key }}" + dest: "/etc/pki/rpm-gpg/{{ chatgpt_desktop_rpm_gpg_key }}" + owner: root + group: root + mode: "0644" + when: chatgpt_desktop_enabled | bool + +- name: Import ChatGPT desktop RPM signing key + tags: [packages, chatgpt] + ansible.builtin.rpm_key: + state: present + key: "/etc/pki/rpm-gpg/{{ chatgpt_desktop_rpm_gpg_key }}" + when: chatgpt_desktop_enabled | bool + +- name: Configure ChatGPT desktop RPM repository + tags: [packages, chatgpt] + ansible.builtin.yum_repository: + name: openai-chatgpt + description: ChatGPT + baseurl: "{{ chatgpt_desktop_rpm_repository }}" + enabled: true + gpgcheck: true + repo_gpgcheck: true + gpgkey: "file:///etc/pki/rpm-gpg/{{ chatgpt_desktop_rpm_gpg_key }}" + state: present + when: chatgpt_desktop_enabled | bool + +- name: Install ChatGPT desktop on selected Fedora hosts + tags: [packages, chatgpt] + ansible.builtin.dnf: + name: chatgpt + state: latest + update_cache: true + when: chatgpt_desktop_enabled | bool + - name: Define Fedora Flatpak applications tags: [packages] ansible.builtin.set_fact: