From 43c34d41046f56c67515aa304ef9f21623a9b7a4 Mon Sep 17 00:00:00 2001
From: Chris Croome <chris@webarchitects.co.uk>
Date: Tue, 4 Feb 2025 16:06:52 +0000
Subject: [PATCH] wip

---
 defaults/main.yml                            |  4 +-
 meta/argument_specs.yml                      | 22 ++++-----
 molecule/default/converge.yml                | 39 +++++++++++++++
 molecule/default/verify.yml                  | 13 +++--
 tasks/instance_absent.yml                    | 50 ++++++++++++++++++++
 tasks/instance_check.yml                     | 44 +++++++++++++++++
 tasks/instance_check_pass.yml                | 46 ++++++++++++++++++
 tasks/{instance.yml => instance_present.yml} | 46 ++----------------
 tasks/main.yml                               | 13 ++---
 9 files changed, 207 insertions(+), 70 deletions(-)
 create mode 100644 tasks/instance_absent.yml
 create mode 100644 tasks/instance_check.yml
 create mode 100644 tasks/instance_check_pass.yml
 rename tasks/{instance.yml => instance_present.yml} (80%)

diff --git a/defaults/main.yml b/defaults/main.yml
index 65fbb73..f627304 100644
--- a/defaults/main.yml
+++ b/defaults/main.yml
@@ -12,6 +12,7 @@ valkey: false
 valkey_instances:
   - name: server
     state: enabled
+    config_file: /etc/valkey/valkey.conf
     config:
       bind: 127.0.0.1 -::1
       port: 0
@@ -20,9 +21,9 @@ valkey_instances:
       pidfile: /run/valkey/valkey-server.pid
       logfile: /var/log/valkey/valkey-server.log
       dbfilename: dump.rdb
-    config_file: /etc/valkey/valkey.conf
   # - name: cloud
   #   state: enabled
+  #   config_file: /etc/valkey/valkey-cloud.conf
   #   config:
   #     port: 0
   #     unixsocket: /run/valkey-cloud/valkey-server.sock
@@ -30,7 +31,6 @@ valkey_instances:
   #     pidfile: /run/valkey-cloud/valkey-server.pid
   #     logfile: /var/log/valkey/valkey-server-cloud.log
   #     dbfilename: dump-cloud.rdb
-  #   CONFIg_file: /etc/valkey/valkey-cloud.conf
 valkey_enabled: true
 valkey_pkgs:
   - name: bookworm
diff --git a/meta/argument_specs.yml b/meta/argument_specs.yml
index 9ffeed3..79c8d9f 100644
--- a/meta/argument_specs.yml
+++ b/meta/argument_specs.yml
@@ -32,6 +32,17 @@ argument_specs:
             type: str
             required: true
             description: The Valkey instance name.
+          config_file:
+            type: str
+            required: true
+            description: The path to the valkey instance configuration file.
+          state:
+            type: str
+            required: true
+            choices:
+              - absent
+              - enabled
+            description: The state of the Valkey instance.
           config:
             type: dict
             required: false
@@ -69,17 +80,6 @@ argument_specs:
                 type: str
                 required: false
                 description: The instance default password.
-          config_file:
-            type: str
-            required: true
-            description: The path to the valkey instance configuration file.
-          state:
-            type: str
-            required: true
-            choices:
-              - absent
-              - enabled
-            description: The state of the Valkey instance.
       valkey_enabled:
         type: bool
         required: true
diff --git a/molecule/default/converge.yml b/molecule/default/converge.yml
index 420c2de..ef6ff7b 100644
--- a/molecule/default/converge.yml
+++ b/molecule/default/converge.yml
@@ -30,9 +30,48 @@
       ansible.builtin.debug:
         var: ansible_facts.user_dir
 
+    - name: Set fact for Valkey passwords
+      ansible.builtin.set_fact:
+        molecule_valkey_cloud_pass: "{{ lookup('community.general.random_string', length=16, special=false) }}"
+        molecule_valkey_wp_pass: "{{ lookup('community.general.random_string', length=16, special=false) }}"
+
     - name: Include netfilter role as root
       ansible.builtin.include_role:
         name: valkey
       vars:  # noqa: var-naming[no-role-prefix]
         valkey: true
+        valkey_instances:
+          - name: server
+            state: enabled
+            config_file: /etc/valkey/valkey.conf
+            config:
+              bind: 127.0.0.1 -::1
+              port: 0
+              unixsocket: /run/valkey/valkey-server.sock
+              unixsocketperm: 770
+              pidfile: /run/valkey/valkey-server.pid
+              logfile: /var/log/valkey/valkey-server.log
+              dbfilename: dump.rdb
+          - name: cloud
+            state: enabled
+            config_file: /etc/valkey/valkey-cloud.conf
+            config:
+              port: 0
+              unixsocket: /run/valkey-cloud/valkey-server.sock
+              unixsocketperm: 770
+              requirepass: "{{ molecule_valkey_cloud_pass }}"
+              pidfile: /run/valkey-cloud/valkey-server.pid
+              logfile: /var/log/valkey/valkey-server-cloud.log
+              dbfilename: dump-cloud.rdb
+          - name: wp
+            state: enabled
+            config_file: /etc/valkey/valkey-wp.conf
+            config:
+              port: 0
+              unixsocket: /run/valkey-wp/valkey-server.sock
+              unixsocketperm: 770
+              requirepass: "{{ molecule_valkey_wp_pass }}"
+              pidfile: /run/valkey-wp/valkey-server.pid
+              logfile: /var/log/valkey/valkey-server-wp.log
+              dbfilename: dump-wp.rdb
 ...
diff --git a/molecule/default/verify.yml b/molecule/default/verify.yml
index 76767ba..d1d5cf4 100644
--- a/molecule/default/verify.yml
+++ b/molecule/default/verify.yml
@@ -20,20 +20,19 @@
 
     - name: Gather service facts
       ansible.builtin.service_facts:
-      register: molecule_service_facts
 
-    - name: Debug valkey service status
+    - name: Debug Valkey service status
       ansible.builtin.debug:
-        msg: "{{ molecule_service_facts | community.general.json_query(molecule_service_jpq) }}"
+        msg: "{{ ansible_facts.services | community.general.json_query(molecule_service_jpq) }}"
         verbosity: 0
       vars:
-        molecule_service_jpq: 'ansible_facts.services.["valkey.service"]|[0]'
+        molecule_service_jpq: '["valkey.service"]|[0]'
 
-    - name: Check that Valkey is enabled # and running
+    - name: Check that Valkey server is active
       ansible.builtin.assert:
         that:
-          - (molecule_service_facts | community.general.json_query(molecule_service_jpq)).state == "active"
+          - (ansible_facts.services | community.general.json_query(molecule_service_jpq)).state == "active"
         quiet: true
       vars:
-        molecule_service_jpq: 'ansible_facts.services.["valkey.service"]|[0]'
+        molecule_service_jpq: '["valkey.service"]|[0]'
 ...
diff --git a/tasks/instance_absent.yml b/tasks/instance_absent.yml
new file mode 100644
index 0000000..ef5ce77
--- /dev/null
+++ b/tasks/instance_absent.yml
@@ -0,0 +1,50 @@
+# Copyright 2025 Chris Croome
+#
+# This file is part of the Webarchitects Valkey Ansible role.
+#
+# The Webarchitects Valkey Ansible role is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+#
+# The Webarchitects Valkey Ansible role is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with the Webarchitects Valkey Ansible role. If not, see <https://www.gnu.org/licenses/>.
+---
+- name: Valkey instance absent
+  block:
+
+    - name: Debug valkey_instance
+      ansible.builtin.debug:
+        var: valkey_instance
+        verbosity: "{% if ansible_check_mode | bool or ansible_diff_mode | bool %}1{% else %}2{% endif %}"
+
+    - name: Set a fact for the systemd service name
+      ansible.builtin.set_fact:
+        valkey_instance_service: >-
+          {%- if valkey_instance.name == "server" -%}
+          valkey-server.service
+          {%- else -%}
+          valkey-server@{{ valkey_instance.name }}.service
+          {%- endif -%}
+
+    - name: Debug valkey_instance_service
+      ansible.builtin.debug:
+        var: valkey_instance_service
+        verbosity: "{% if ansible_check_mode | bool or ansible_diff_mode | bool %}0{% else %}1{% endif %}"
+
+    - name: "Valkey disabled for {{ valkey_instance_service }}"
+      ansible.builtin.systemd_service:
+        name: "{{ valkey_instance_service }}"
+        enabled: false
+
+    - name: "Valkey stopped for {{ valkey_instance_service }}"
+      ansible.builtin.systemd_service:
+        name: "{{ valkey_instance_service }}"
+        state: started
+
+    - name: Valkey instance config absent
+      ansible.builtin.file:
+        path: "{{ valkey_instance.config_file }}"
+      state: absent
+
+  tags:
+    - valkey
+...
diff --git a/tasks/instance_check.yml b/tasks/instance_check.yml
new file mode 100644
index 0000000..62b8ee9
--- /dev/null
+++ b/tasks/instance_check.yml
@@ -0,0 +1,44 @@
+# Copyright 2025 Chris Croome
+#
+# This file is part of the Webarchitects Valkey Ansible role.
+#
+# The Webarchitects Valkey Ansible role is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+#
+# The Webarchitects Valkey Ansible role is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with the Webarchitects Valkey Ansible role. If not, see <https://www.gnu.org/licenses/>.
+---
+- name: Valkey check using password
+  block:
+
+    - name: "Check Valkey info for {{ valkey_instance.name }}"
+      ansible.builtin.command: >-
+        valkey-cli
+        {% if valkey_instance.config.unixsocket is defined %}
+        -s {{ valkey_instance.config.unixsocket }}
+        {% else %}
+        -h localhost -p {{ valkey_instance.config.port }}
+        {% endif %}
+        INFO SERVER
+      check_mode: false
+      changed_when: false
+      register: valkey_instance_info_server
+      when: valkey_instance.config.requirepass is not defined
+
+    - name: Debug valkey_instance_info_server
+      ansible.builtin.debug:
+        var: valkey_instance_info_server
+
+    - name: "Set a fact for the Valkey info for {{ valkey_instance.name }}"
+      ansible.builtin.set_fact:
+        valkey_instance_info: "{{ valkey_instance_info_server.stdout | string | community.general.jc('ini') }}"
+      when: valkey_instance_info_server.stdout is defined
+
+    - name: Debug valkey_instance_info
+      ansible.builtin.debug:
+        var: valkey_instance_info
+      when: valkey_instance_info is defined
+
+  tags:
+    - valkey
+...
diff --git a/tasks/instance_check_pass.yml b/tasks/instance_check_pass.yml
new file mode 100644
index 0000000..114d4f1
--- /dev/null
+++ b/tasks/instance_check_pass.yml
@@ -0,0 +1,46 @@
+# Copyright 2025 Chris Croome
+#
+# This file is part of the Webarchitects Valkey Ansible role.
+#
+# The Webarchitects Valkey Ansible role is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+#
+# The Webarchitects Valkey Ansible role is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with the Webarchitects Valkey Ansible role. If not, see <https://www.gnu.org/licenses/>.
+---
+- name: Valkey check using password
+  block:
+
+    - name: "When active check Valkey info using REDISCLI_AUTH for {{ valkey_instance.name }}"
+      ansible.builtin.command: >-
+        valkey-cli
+        {% if valkey_instance.config.unixsocket is defined %}
+        -s {{ valkey_instance.config.unixsocket }}
+        {% else %}
+        -h localhost -p {{ valkey_instance.config.port }}
+        {% endif %}
+        INFO SERVER
+      environment:
+        REDISCLI_AUTH: "{{ valkey_instance.config.requirepass }}"
+      check_mode: false
+      changed_when: false
+      register: valkey_instance_info_server
+      when: valkey_instance.config.requirepass is defined
+
+    - name: Debug valkey_instance_info_server
+      ansible.builtin.debug:
+        var: valkey_instance_info_server
+
+    - name: "Set a fact for the Valkey info for {{ valkey_instance.name }}"
+      ansible.builtin.set_fact:
+        valkey_instance_info: "{{ valkey_instance_info_server.stdout | string | community.general.jc('ini') }}"
+      when: valkey_instance_info_server.stdout is defined
+
+    - name: Debug valkey_instance_info
+      ansible.builtin.debug:
+        var: valkey_instance_info
+      when: valkey_instance_info is defined
+
+  tags:
+    - valkey
+...
diff --git a/tasks/instance.yml b/tasks/instance_present.yml
similarity index 80%
rename from tasks/instance.yml
rename to tasks/instance_present.yml
index e9309d2..59aa2b0 100644
--- a/tasks/instance.yml
+++ b/tasks/instance_present.yml
@@ -8,7 +8,7 @@
 #
 # You should have received a copy of the GNU General Public License along with the Webarchitects Valkey Ansible role. If not, see <https://www.gnu.org/licenses/>.
 ---
-- name: Valkey instance config
+- name: Valkey instance present
   block:
 
     - name: Debug valkey_instance
@@ -166,50 +166,14 @@
         - name: Check Valkey instance status
           block:
 
-            - name: "When active check Valkey info using REDISCLI_AUTH for {{ valkey_instance.name }}"
-              ansible.builtin.command: >-
-                valkey-cli
-                {% if valkey_instance.config.unixsocket is defined %}
-                -s {{ valkey_instance.config.unixsocket }}
-                {% else %}
-                -h localhost -p {{ valkey_instance.config.port }}
-                {% endif %}
-                INFO SERVER
-              environment:
-                REDISCLI_AUTH: "{{ valkey_instance.config.requirepass }}"
-              check_mode: false
-              changed_when: false
-              register: valkey_instance_info_server
+            - name: "Include valkey instance check using REDISCLI_AUTH for {{ valkey_instance.name }}"
+              ansible.builtin.include_tasks: instance_check_pass.yml
               when: valkey_instance.config.requirepass is defined
 
-            - name: "Check Valkey info for {{ valkey_instance.name }}"
-              ansible.builtin.command: >-
-                valkey-cli
-                {% if valkey_instance.config.unixsocket is defined %}
-                -s {{ valkey_instance.config.unixsocket }}
-                {% else %}
-                -h localhost -p {{ valkey_instance.config.port }}
-                {% endif %}
-                INFO SERVER
-              check_mode: false
-              changed_when: false
-              register: valkey_instance_info_server
+            - name: "Include valkey instance check for {{ valkey_instance.name }}"
+              ansible.builtin.include_tasks: instance_check_pass.yml
               when: valkey_instance.config.requirepass is not defined
 
-            - name: Debug valkey_instance_info_server
-              ansible.builtin.debug:
-                var: valkey_instance_info_server
-
-            - name: "Set a fact for the Valkey info for {{ valkey_instance.name }}"
-              ansible.builtin.set_fact:
-                valkey_instance_info: "{{ valkey_instance_info_server.stdout | string | community.general.jc('ini') }}"
-              when: valkey_instance_info_server.stdout is defined
-
-            - name: Debug valkey_instance_info
-              ansible.builtin.debug:
-                var: valkey_instance_info
-              when: valkey_instance_info is defined
-
           when:
             - valkey_instance_enabled.enabled | bool
             - valkey_instance_started.status.ActiveState == "active"
diff --git a/tasks/main.yml b/tasks/main.yml
index 8e91089..19f2e3c 100644
--- a/tasks/main.yml
+++ b/tasks/main.yml
@@ -37,21 +37,16 @@
       tags:
         - valkey_check
 
-    - name: Valkey instance config absent
-      ansible.builtin.command:
-      args:
-        cmd: "mv {{ valkey_instance.config_file }} {{ valkey_config_backup }}"
-        removes: "{{ valkey_instance.config_file }}"
-      vars:
-        valkey_config_backup: "{{ valkey_instance.config_file | ansible.builtin.dirname }}/.{{ valkey_instance.config_file | ansible.builtin.basename }}.{{ ansible_facts.date_time.iso8601_basic_short }}.bak"
+    - name: Include Valkey instance absent tasks
+      ansible.builtin.include_tasks: instance_absent.yml
       loop: "{{ valkey_instances }}"
       loop_control:
         loop_var: valkey_instance
         label: "{{ valkey_instance.name }}"
       when: valkey_instance.state == "absent"
 
-    - name: Include Valkey instance config tasks when not absent
-      ansible.builtin.include_tasks: instance.yml
+    - name: Include Valkey instance present tasks
+      ansible.builtin.include_tasks: instance_present.yml
       loop: "{{ valkey_instances }}"
       loop_control:
         loop_var: valkey_instance
-- 
GitLab