300 Module vbotka.freebsd.service

Use case

Test the module vbotka.freebsd.service

Tree

shell> tree .
.
├── ansible.cfg
├── hosts
│   ├── 02_iocage.yml
│   └── 99_constructed.yml
├── iocage-hosts.ini
├── pb-test-01.yml
├── pb-test-02.yml
├── pb-test-03.yml
├── pb-test-04.yml
├── pb-test-05.yml
├── pb-test-06.yml
└── pb-test-07.yml

Synopsis

  • Playbook pb-test-01.yml: display sshd rcvar on all running jails.

At iocage_02 jails:

  • Playbook pb-test-02.yml: Display sshd rcvar.

  • Playbook pb-test-03.yml: Display enabled services.

  • Playbook pb-test-04.yml: Display sshd status.

  • Playbook pb-test-05.yml: Display sshd commands synopsis.

  • Playbook pb-test-06.yml: Display sendmail rcvars.

At iocage_03:

  • Playbook pb-test-07.yml: Start apcupsd.

Requirements

Notes

  • Jail name doesn’t work in iocage jails. Use JID instead.

See also

List jails at iocage_02

[iocage_02]# iocage list -l
+-----+----------+------+-------+------+-----------------+--------------------+-----+----------------+----------+
| JID |   NAME   | BOOT | STATE | TYPE |     RELEASE     |        IP4         | IP6 |    TEMPLATE    | BASEJAIL |
+=====+==========+======+=======+======+=================+====================+=====+================+==========+
| 149 | afa9e515 | off  | up    | jail | 14.1-RELEASE-p6 | epair0b|10.1.0.122 | -   | ansible_client | no       |
+-----+----------+------+-------+------+-----------------+--------------------+-----+----------------+----------+
| 148 | c1670497 | off  | up    | jail | 14.1-RELEASE-p6 | epair0b|10.1.0.135 | -   | ansible_client | no       |
+-----+----------+------+-------+------+-----------------+--------------------+-----+----------------+----------+
| 147 | test_111 | off  | up    | jail | 14.1-RELEASE-p6 | em0|10.1.0.111/24  | -   | ansible_client | no       |
+-----+----------+------+-------+------+-----------------+--------------------+-----+----------------+----------+

Configuration ansible.cfg

[defaults]
gathering = explicit
callback_result_format = yaml

[connection]
pipelining = true

Inventory hosts/02_iocage.yml

plugin: vbotka.freebsd.iocage
host: 10.1.0.73
user: admin
env:
  CRYPTOGRAPHY_OPENSSL_NO_LEGACY: 1
hooks_results:
  - /var/db/dhclient-hook.address.epair0b
compose:
  ansible_host: (iocage_hooks.0 == '-') | ternary(iocage_ip4, iocage_hooks.0)

Inventory hosts/99_constructed.yml

plugin: ansible.builtin.constructed
groups:
    up: iocage_state == 'up'

Display inventory

(env) > ansible-inventory -i hosts --graph
@all:
  |--@ungrouped:
  |--@up:
  |  |--afa9e515
  |  |--c1670497
  |  |--test_111

Inventory iocage-hosts.ini

iocage_01 ansible_host=10.1.0.18
iocage_02 ansible_host=10.1.0.73
iocage_03 ansible_host=10.1.0.17

[iocage]
iocage_01
iocage_02
iocage_03

[iocage:vars]
ansible_user=admin
ansible_become=true

Playbook pb-test-01.yml

- name: Test module vbotka.freebsd.service. Get running jails sshd rcvar.
  hosts: up
  remote_user: admin

  vars:

    ansible_python_interpreter: auto_silent
    sshd_rcvar: "{{ out.stdout | community.general.jc('ini') }}"
    
  tasks:

    - name: Get sshd rcvar.
      vbotka.freebsd.service:
        script: sshd
        command: rcvar
      register: out

    - ansible.builtin.debug:
        var: out.stdout

    - ansible.builtin.debug:
        var: sshd_rcvar

    - ansible.builtin.debug:
        var: out.rcvar

Playbook output. Get running jails sshd rcvar.

(env) > ansible-playbook pb-test-01.yml -i hosts

PLAY [Test module vbotka.freebsd.service. Get running jails sshd rcvar.] **********************

TASK [vbotka.freebsd.service] *****************************************************************
changed: [c1670497]
changed: [test_111]
changed: [afa9e515]

TASK [ansible.builtin.debug] ******************************************************************
ok: [afa9e515] =>
    out.stdout: |-
        # sshd : Secure Shell Daemon
        #
        sshd_enable="YES"
        #   (default: "")
ok: [c1670497] =>
    out.stdout: |-
        # sshd : Secure Shell Daemon
        #
        sshd_enable="YES"
        #   (default: "")
ok: [test_111] =>
    out.stdout: |-
        # sshd : Secure Shell Daemon
        #
        sshd_enable="YES"
        #   (default: "")

TASK [ansible.builtin.debug] ******************************************************************
ok: [afa9e515] => 
    sshd_rcvar:
        sshd_enable: 'YES'
ok: [test_111] => 
    sshd_rcvar:
        sshd_enable: 'YES'
ok: [c1670497] => 
    sshd_rcvar:
        sshd_enable: 'YES'

TASK [ansible.builtin.debug] ******************************************************************
ok: [afa9e515] =>
    out.rcvar:
        sshd_enable: '"YES"'
ok: [c1670497] =>
    out.rcvar:
        sshd_enable: '"YES"'
ok: [test_111] =>
    out.rcvar:
        sshd_enable: '"YES"'

PLAY RECAP ************************************************************************************
afa9e515: ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
c1670497: ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
test_111: ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Playbook pb-test-02.yml

- name: Test module vbotka.freebsd.service. Set dictionary jid_rcvar.
  hosts: iocage
  remote_user: admin

  vars:

    debug: false
    ansible_python_interpreter: auto_silent
    jails: "{{ iocage_list_out.stdout | vbotka.freebsd.iocage('jails') }}"
    jids: "{{ jails | dict2items
                    | selectattr('value.state', 'eq', 'up')
                    | map(attribute='value.jid') }}"
    jid_rcvar: "{{ dict(keys | zip(vals)) }}"
    keys: "{{ service_out.results | map(attribute='item') }}"
    vals: "{{ service_out.results | map(attribute='stdout')
                                  | map('community.general.jc', 'ini') }}"

  tasks:

    - name: Get iocage list of jails.
      environment:
        CRYPTOGRAPHY_OPENSSL_NO_LEGACY: 1
      register: iocage_list_out
      changed_when: false
      ansible.builtin.command: iocage list --long

    - ansible.builtin.debug:
        var: iocage_list_out
      when: debug | bool

    - ansible.builtin.debug:
        var: jails | to_yaml

    - ansible.builtin.debug:
        var: jids | to_yaml

    - name: Jails service sshd rcvar.
      register: service_out
      vbotka.freebsd.service:
        jail: "{{ item }}"
        script: sshd
        command: rcvar
      loop: "{{ jids }}"

    - ansible.builtin.debug:
        var: service_out
      when: debug | bool

    - ansible.builtin.debug:
        var: jid_rcvar

Playbook output. Set dictionary jid_rcvar.

(env) > ansible-playbook pb-test-02.yml -i iocage-hosts.ini -l iocage_02 -e debug=true

PLAY [Test module vbotka.freebsd.service. Set dictionary jid_rcvar.] ***************************

TASK [Get iocage list of jails.] ***************************************************************
ok: [iocage_02]

TASK [ansible.builtin.debug] *******************************************************************
ok: [iocage_02] =>
    iocage_list_out:
        ansible_facts:
            discovered_interpreter_python: /usr/local/bin/python3.11
        changed: false
        cmd:
        - iocage
        - list
        - --long
        delta: '0:00:02.578361'
        end: '2025-03-14 08:20:55.036138'
        failed: false
        msg: ''
        rc: 0
        start: '2025-03-14 08:20:52.457777'
        stderr: ''
        stderr_lines: []
        stdout: |-
            +-----+----------+------+-------+------+-----------------+--------------------+-----+----------------+----------+
            | JID |   NAME   | BOOT | STATE | TYPE |     RELEASE     |        IP4         | IP6 |    TEMPLATE    | BASEJAIL |
            +=====+==========+======+=======+======+=================+====================+=====+================+==========+
            | 149 | afa9e515 | off  | up    | jail | 14.1-RELEASE-p6 | epair0b|10.1.0.122 | -   | ansible_client | no       |
            +-----+----------+------+-------+------+-----------------+--------------------+-----+----------------+----------+
            | 148 | c1670497 | off  | up    | jail | 14.1-RELEASE-p6 | epair0b|10.1.0.135 | -   | ansible_client | no       |
            +-----+----------+------+-------+------+-----------------+--------------------+-----+----------------+----------+
            | 147 | test_111 | off  | up    | jail | 14.1-RELEASE-p6 | em0|10.1.0.111/24  | -   | ansible_client | no       |
            +-----+----------+------+-------+------+-----------------+--------------------+-----+----------------+----------+
        stdout_lines:
        - +-----+----------+------+-------+------+-----------------+--------------------+-----+----------------+----------+
        - '| JID |   NAME   | BOOT | STATE | TYPE |     RELEASE     |        IP4         |
            IP6 |    TEMPLATE    | BASEJAIL |'
        - +=====+==========+======+=======+======+=================+====================+=====+================+==========+
        - '| 149 | afa9e515 | off  | up    | jail | 14.1-RELEASE-p6 | epair0b|10.1.0.122
            | -   | ansible_client | no       |'
        - +-----+----------+------+-------+------+-----------------+--------------------+-----+----------------+----------+
        - '| 148 | c1670497 | off  | up    | jail | 14.1-RELEASE-p6 | epair0b|10.1.0.135
            | -   | ansible_client | no       |'
        - +-----+----------+------+-------+------+-----------------+--------------------+-----+----------------+----------+
        - '| 147 | test_111 | off  | up    | jail | 14.1-RELEASE-p6 | em0|10.1.0.111/24  |
            -   | ansible_client | no       |'
        - +-----+----------+------+-------+------+-----------------+--------------------+-----+----------------+----------+

TASK [ansible.builtin.debug] *******************************************************************
ok: [iocage_02] =>
    jails | to_yaml: |-
        afa9e515:
          basejail: 'no'
          boot: 'off'
          ip4: 10.1.0.122
          ip4_dict:
            ip4:
            - {ifc: epair0b, ip: 10.1.0.122, mask: '-'}
            msg: ''
          ip6: '-'
          jid: '149'
          release: 14.1-RELEASE-p6
          state: up
          template: ansible_client
          type: jail
        c1670497:
          basejail: 'no'
          boot: 'off'
          ip4: 10.1.0.135
          ip4_dict:
            ip4:
            - {ifc: epair0b, ip: 10.1.0.135, mask: '-'}
            msg: ''
          ip6: '-'
          jid: '148'
          release: 14.1-RELEASE-p6
          state: up
          template: ansible_client
          type: jail
        test_111:
          basejail: 'no'
          boot: 'off'
          ip4: 10.1.0.111
          ip4_dict:
            ip4:
            - {ifc: em0, ip: 10.1.0.111, mask: '24'}
            msg: ''
          ip6: '-'
          jid: '147'
          release: 14.1-RELEASE-p6
          state: up
          template: ansible_client
          type: jail

TASK [ansible.builtin.debug] *******************************************************************
ok: [iocage_02] =>
    jids | to_yaml: |-
        ['149', '148', '147']

TASK [Jails service sshd rcvar.] ***************************************************************
ok: [iocage_02] => (item=149)
ok: [iocage_02] => (item=148)
ok: [iocage_02] => (item=147)

TASK [ansible.builtin.debug] *******************************************************************
ok: [iocage_02] =>
    service_out:
        changed: false
        msg: All items completed
        results:
        -   ansible_loop_var: item
            changed: false
            failed: false
            invocation:
                module_args:
                    command: rcvar
                    env: null
                    jail: '149'
                    list_enabled: false
                    script: sshd
                    synopsis: false
                    wait: 0.5
            item: '149'
            rc: 0
            rcvar:
                sshd_enable: '"YES"'
            stderr: ''
            stderr_lines: []
            stdout: |-
                # sshd : Secure Shell Daemon
                #
                sshd_enable="YES"
                #   (default: "")
            stdout_lines:
            - '# sshd : Secure Shell Daemon'
            - '#'
            - sshd_enable="YES"
            - '#   (default: "")'
            - ''
        -   ansible_loop_var: item
            changed: false
            failed: false
            invocation:
                module_args:
                    command: rcvar
                    env: null
                    jail: '148'
                    list_enabled: false
                    script: sshd
                    synopsis: false
                    wait: 0.5
            item: '148'
            rc: 0
            rcvar:
                sshd_enable: '"YES"'
            stderr: ''
            stderr_lines: []
            stdout: |-
                # sshd : Secure Shell Daemon
                #
                sshd_enable="YES"
                #   (default: "")
            stdout_lines:
            - '# sshd : Secure Shell Daemon'
            - '#'
            - sshd_enable="YES"
            - '#   (default: "")'
            - ''
        -   ansible_loop_var: item
            changed: false
            failed: false
            invocation:
                module_args:
                    command: rcvar
                    env: null
                    jail: '147'
                    list_enabled: false
                    script: sshd
                    synopsis: false
                    wait: 0.5
            item: '147'
            rc: 0
            rcvar:
                sshd_enable: '"YES"'
            stderr: ''
            stderr_lines: []
            stdout: |-
                # sshd : Secure Shell Daemon
                #
                sshd_enable="YES"
                #   (default: "")
            stdout_lines:
            - '# sshd : Secure Shell Daemon'
            - '#'
            - sshd_enable="YES"
            - '#   (default: "")'
            - ''
        skipped: false

TASK [ansible.builtin.debug] *******************************************************************
ok: [iocage_02] =>
    jid_rcvar:
        '147':
            sshd_enable: 'YES'
        '148':
            sshd_enable: 'YES'
        '149':
            sshd_enable: 'YES'

PLAY RECAP *************************************************************************************
iocage_02: ok=7    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Playbook pb-test-03.yml

- name: Test module vbotka.freebsd.service. Set dictionary jid_service_enabled.
  hosts: iocage
  remote_user: admin

  vars:

    debug: false
    ansible_python_interpreter: auto_silent
    jails: "{{ iocage_list_out.stdout | vbotka.freebsd.iocage('jails') }}"
    jids: "{{ jails | dict2items
                    | selectattr('value.state', 'eq', 'up')
                    | map(attribute='value.jid') }}"
    jid_service_enabled: "{{ dict(keys | zip(vals)) }}"
    keys: "{{ service_out.results | map(attribute='item') }}"
    vals: "{{ service_out.results | map(attribute='stdout_lines')
                                  | map('map', 'basename') }}"

  tasks:

    - name: Get iocage list of jails
      environment:
        CRYPTOGRAPHY_OPENSSL_NO_LEGACY: 1
      register: iocage_list_out
      changed_when: false
      ansible.builtin.command: iocage list --long

    - name: Jails service list enabled
      register: service_out
      vbotka.freebsd.service:
        jail: "{{ item }}"
        list_enabled: true
      loop: "{{ jids }}"

    - ansible.builtin.debug:
        var: service_out
      when: debug | bool

    - ansible.builtin.debug:
        var: jid_service_enabled | to_yaml

Playbook output. Display enabled services.

(env) > ansible-playbook pb-test-03.yml -i iocage-hosts.ini -l iocage_02 -e debug=true

PLAY [Test module vbotka.freebsd.service. Set dictionary jid_service_enabled.] *****************

TASK [Get iocage list of jails] ****************************************************************
ok: [iocage_02]

TASK [Jails service list enabled] **************************************************************
ok: [iocage_02] => (item=149)
ok: [iocage_02] => (item=148)
ok: [iocage_02] => (item=147)

TASK [ansible.builtin.debug] *******************************************************************
ok: [iocage_02] =>
    service_out:
        changed: false
        msg: All items completed
        results:
        -   ansible_loop_var: item
            changed: false
            failed: false
            invocation:
                module_args:
                    command: null
                    env: null
                    jail: '149'
                    list_enabled: true
                    script: null
                    synopsis: false
                    wait: 0.5
            item: '149'
            rc: 0
            stderr: ''
            stderr_lines: []
            stdout: |-
                /etc/rc.d/cleanvar
                /etc/rc.d/cleartmp
                /etc/rc.d/cron
                /etc/rc.d/ip6addrctl
                /etc/rc.d/motd
                /etc/rc.d/netif
                /etc/rc.d/newsyslog
                /etc/rc.d/os-release
                /etc/rc.d/sshd
                /etc/rc.d/syslogd
                /etc/rc.d/utx
                /etc/rc.d/virecover
            stdout_lines:
            - /etc/rc.d/cleanvar
            - /etc/rc.d/cleartmp
            - /etc/rc.d/cron
            - /etc/rc.d/ip6addrctl
            - /etc/rc.d/motd
            - /etc/rc.d/netif
            - /etc/rc.d/newsyslog
            - /etc/rc.d/os-release
            - /etc/rc.d/sshd
            - /etc/rc.d/syslogd
            - /etc/rc.d/utx
            - /etc/rc.d/virecover
        -   ansible_loop_var: item
            changed: false
            failed: false
            invocation:
                module_args:
                    command: null
                    env: null
                    jail: '148'
                    list_enabled: true
                    script: null
                    synopsis: false
                    wait: 0.5
            item: '148'
            rc: 0
            stderr: ''
            stderr_lines: []
            stdout: |-
                /etc/rc.d/cleanvar
                /etc/rc.d/cleartmp
                /etc/rc.d/cron
                /etc/rc.d/ip6addrctl
                /etc/rc.d/motd
                /etc/rc.d/netif
                /etc/rc.d/newsyslog
                /etc/rc.d/os-release
                /etc/rc.d/sshd
                /etc/rc.d/syslogd
                /etc/rc.d/utx
                /etc/rc.d/virecover
            stdout_lines:
            - /etc/rc.d/cleanvar
            - /etc/rc.d/cleartmp
            - /etc/rc.d/cron
            - /etc/rc.d/ip6addrctl
            - /etc/rc.d/motd
            - /etc/rc.d/netif
            - /etc/rc.d/newsyslog
            - /etc/rc.d/os-release
            - /etc/rc.d/sshd
            - /etc/rc.d/syslogd
            - /etc/rc.d/utx
            - /etc/rc.d/virecover
        -   ansible_loop_var: item
            changed: false
            failed: false
            invocation:
                module_args:
                    command: null
                    env: null
                    jail: '147'
                    list_enabled: true
                    script: null
                    synopsis: false
                    wait: 0.5
            item: '147'
            rc: 0
            stderr: ''
            stderr_lines: []
            stdout: |-
                /etc/rc.d/cleanvar
                /etc/rc.d/cleartmp
                /etc/rc.d/cron
                /etc/rc.d/motd
                /etc/rc.d/newsyslog
                /etc/rc.d/os-release
                /etc/rc.d/sshd
                /etc/rc.d/syslogd
                /etc/rc.d/utx
                /etc/rc.d/virecover
            stdout_lines:
            - /etc/rc.d/cleanvar
            - /etc/rc.d/cleartmp
            - /etc/rc.d/cron
            - /etc/rc.d/motd
            - /etc/rc.d/newsyslog
            - /etc/rc.d/os-release
            - /etc/rc.d/sshd
            - /etc/rc.d/syslogd
            - /etc/rc.d/utx
            - /etc/rc.d/virecover
        skipped: false

TASK [ansible.builtin.debug] *******************************************************************
ok: [iocage_02] =>
    jid_service_enabled | to_yaml: |-
        '147': [cleanvar, cleartmp, cron, motd, newsyslog, os-release, sshd, syslogd, utx,
          virecover]
        '148': [cleanvar, cleartmp, cron, ip6addrctl, motd, netif, newsyslog, os-release,
          sshd, syslogd, utx, virecover]
        '149': [cleanvar, cleartmp, cron, ip6addrctl, motd, netif, newsyslog, os-release,
          sshd, syslogd, utx, virecover]

PLAY RECAP *************************************************************************************
iocage_02: ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Playbook pb-test-04.yml

- name: Test module vbotka.freebsd.service. Set dictionary jid_service_status.
  hosts: iocage
  remote_user: admin

  vars:

    debug: false
    ansible_python_interpreter: auto_silent
    jails: "{{ iocage_list_out.stdout | vbotka.freebsd.iocage('jails') }}"
    jids: "{{ jails | dict2items
                    | selectattr('value.state', 'eq', 'up')
                    | map(attribute='value.jid') }}"
    jid_service_status: "{{ dict(service_out.results
                                 | community.general.json_query('[].[item, status]')) }}"

  tasks:

    - name: Get iocage list of jails
      environment:
        CRYPTOGRAPHY_OPENSSL_NO_LEGACY: 1
      register: iocage_list_out
      changed_when: false
      ansible.builtin.command: iocage list --long

    - name: Jails sshd status
      register: service_out
      vbotka.freebsd.service:
        jail: "{{ item }}"
        script: sshd
        command: status
      loop: "{{ jids }}"

    - ansible.builtin.debug:
        var: service_out
      when: debug | bool

    - ansible.builtin.debug:
        var: jid_service_status | to_nice_yaml

Playbook output. Display sshd status.

(env) > ansible-playbook pb-test-04.yml -i iocage-hosts.ini -l iocage_02

PLAY [Test module vbotka.freebsd.service. Set dictionary jid_service_status.] ******************

TASK [Get iocage list of jails] ****************************************************************
ok: [iocage_02]

TASK [Jails sshd status] ***********************************************************************
ok: [iocage_02] => (item=149)
ok: [iocage_02] => (item=148)
ok: [iocage_02] => (item=147)

TASK [ansible.builtin.debug] *******************************************************************
skipping: [iocage_02]

TASK [ansible.builtin.debug] *******************************************************************
ok: [iocage_02] => 
    jid_service_status | to_nice_yaml: |-
        '147': running
        '148': running
        '149': running

PLAY RECAP *************************************************************************************
iocage_02: ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

Playbook pb-test-05.yml

- name: Test module vbotka.freebsd.service. Get script commands synopsis.
  hosts: iocage
  remote_user: admin

  vars:

    ansible_python_interpreter: auto_silent
    jails: "{{ iocage_list_out.stdout | vbotka.freebsd.iocage('jails') }}"
    jids: "{{ jails | dict2items
                    | selectattr('value.state', 'eq', 'up')
                    | map(attribute='value.jid') }}"

    commands: "{{ script_commands.synopsis.cmds +
                  script_commands.synopsis.prefix
                  | product(script_commands.synopsis.cmds)
                  | map('join') }}"

  tasks:

    - name: Get iocage list of jails
      environment:
        CRYPTOGRAPHY_OPENSSL_NO_LEGACY: 1
      register: iocage_list_out
      changed_when: false
      ansible.builtin.command: iocage list --long

    - name: Jails sshd commands synopsis
      register: script_commands
      vbotka.freebsd.service:
        jail: "{{ jids.0 }}"
        script: sshd
        synopsis: true

    - ansible.builtin.debug:
        var: script_commands

    - ansible.builtin.debug:
        var: commands | to_yaml

Playbook output. Display sshd commands synopsis.

(env) > ansible-playbook pb-test-05.yml -i iocage-hosts.ini -l iocage_02

PLAY [Test module vbotka.freebsd.service. Get script commands synopsis.] ***********************

TASK [Get iocage list of jails] ****************************************************************
ok: [iocage_02]

TASK [Jails sshd commands synopsis] ************************************************************
ok: [iocage_02]

TASK [ansible.builtin.debug] *******************************************************************
ok: [iocage_02] => 
    script_commands:
        changed: false
        failed: false
        rc: 0
        stderr: |-
            Usage: /etc/rc.d/sshd [fast|force|one|quiet](start|stop|restart|rcvar|enable|disable|delete|enabled|describe|extracommands|configtest|keygen|reload|status|poll)
        stderr_lines:
        - 'Usage: /etc/rc.d/sshd [fast|force|one|quiet](start|stop|restart|rcvar|enable|disable|delete|enabled|describe|extracommands|configtest|keygen|reload|status|poll)'
        stdout: ''
        stdout_lines: []
        synopsis:
            cmds:
            - start
            - stop
            - restart
            - rcvar
            - enable
            - disable
            - delete
            - enabled
            - describe
            - extracommands
            - configtest
            - keygen
            - reload
            - status
            - poll
            prefix:
            - fast
            - force
            - one
            - quiet

TASK [ansible.builtin.debug] *******************************************************************
ok: [iocage_02] => 
    commands | to_yaml: |-
        [start, stop, restart, rcvar, enable, disable, delete, enabled, describe, extracommands,
          configtest, keygen, reload, status, poll, faststart, faststop, fastrestart, fastrcvar,
          fastenable, fastdisable, fastdelete, fastenabled, fastdescribe, fastextracommands,
          fastconfigtest, fastkeygen, fastreload, faststatus, fastpoll, forcestart, forcestop,
          forcerestart, forcercvar, forceenable, forcedisable, forcedelete, forceenabled,
          forcedescribe, forceextracommands, forceconfigtest, forcekeygen, forcereload, forcestatus,
          forcepoll, onestart, onestop, onerestart, onercvar, oneenable, onedisable, onedelete,
          oneenabled, onedescribe, oneextracommands, oneconfigtest, onekeygen, onereload,
          onestatus, onepoll, quietstart, quietstop, quietrestart, quietrcvar, quietenable,
          quietdisable, quietdelete, quietenabled, quietdescribe, quietextracommands, quietconfigtest,
          quietkeygen, quietreload, quietstatus, quietpoll]

PLAY RECAP *************************************************************************************
iocage_02: ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Playbook pb-test-06.yml

- name: Test module vbotka.freebsd.service. Get running jails sendmail rcvar(s).
  hosts: up
  remote_user: admin

  vars:

    ansible_python_interpreter: auto_silent
    
  tasks:

    - name: Get sendmail rcvar(s).
      vbotka.freebsd.service:
        script: sendmail
        command: rcvar
      register: out

    - ansible.builtin.debug:
        var: out.rcvar

Playbook output. Display sendmail rcvars.

shell> ansible-playbook pb-test-06.yml -i hosts

PLAY [Test module vbotka.freebsd.service. Get running jails sendmail rcvar(s).] ***************

TASK [Get sshd rcvar(s).] *********************************************************************
changed: [test_111]
changed: [afa9e515]
changed: [c1670497]

TASK [ansible.builtin.debug] ******************************************************************
ok: [afa9e515] => 
    out.rcvar:
        sendmail_enable: '"NO"'
        sendmail_msp_queue_enable: '"NO"'
ok: [test_111] => 
    out.rcvar:
        sendmail_enable: '"NO"'
        sendmail_msp_queue_enable: '"NO"'
ok: [c1670497] => 
    out.rcvar:
        sendmail_enable: '"NO"'
        sendmail_msp_queue_enable: '"NO"'

PLAY RECAP ************************************************************************************
afa9e515: ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
c1670497: ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
test_111: ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Playbook pb-test-07.yml

- name: Test module vbotka.freebsd.service. Start apcupsd.
  hosts: iocage_03
  remote_user: admin

  vars:

    ansible_python_interpreter: auto_silent
    start_cmd: "{{ rcvar.rcvar.apcupsd_enable | bool | ternary('start', 'onestart') }}"
    
  tasks:

    - name: Get apcupsd rcvar.
      register: rcvar
      vbotka.freebsd.service:
        script: apcupsd
        command: rcvar

    - ansible.builtin.debug:
        msg: |
          rcvar.rcvar: {{ rcvar.rcvar }}
          start_cmd: {{ start_cmd }}

      # 500ms is enough to complete 'service apcupsd (one)start'.
      # The status before and after the command are different and dictionary status is returned.
      # As a result, the module returns 'changed: true'
    - name: Start apcupsd. By default wait 500ms to complete the command.
      register: out
      vbotka.freebsd.service:
        script: apcupsd
        command: "{{ start_cmd }}"

    - ansible.builtin.debug:
        var: out

    - name: Get apcupsd status.
      register: out
      vbotka.freebsd.service:
        script: apcupsd
        command: status

    - ansible.builtin.debug:
        var: out

    - name: Stop apcupsd. By default wait 500ms to complete the command.
      register: out
      vbotka.freebsd.service:
        script: apcupsd
        command: stop

    - ansible.builtin.debug:
        var: out

      # 200ms is not enough to complete 'service apcupsd (one)start'.
      # The status before and after the command do not change and are not returned.
      # As a result, the module returns 'changed: false'
      # The service apcupsd is started. See the next status.
    - name: Start apcupsd. Wait 200ms to complete the command.
      register: out
      vbotka.freebsd.service:
        script: apcupsd
        command: "{{ start_cmd }}"
        wait: 0.2

    - ansible.builtin.debug:
        var: out

    - name: Get apcupsd status.
      register: out
      vbotka.freebsd.service:
        script: apcupsd
        command: status

    - ansible.builtin.debug:
        var: out

Playbook output. Start apcupsd.

(env) > ansible-playbook pb-test-07.yml -i iocage-hosts.ini

PLAY [Test module vbotka.freebsd.service. Start apcupsd.] **************************************

TASK [Get apcupsd rcvar.] **********************************************************************
ok: [iocage_03]

TASK [ansible.builtin.debug] *******************************************************************
ok: [iocage_03] => 
    msg: |-
        rcvar.rcvar: {'apcupsd_enable': '"NO"'}
        start_cmd: onestart

TASK [Start apcupsd. By default wait 500ms to complete the command.] ***************************
changed: [iocage_03]

TASK [ansible.builtin.debug] *******************************************************************
ok: [iocage_03] => 
    out:
        changed: true
        failed: false
        onestart: Starting apcupsd.
        rc: 0
        state:
            post: |-
                apcupsd is running as pid 6203.
            pre: |-
                apcupsd is not running.
        stderr: ''
        stderr_lines: []
        stdout: |-
            Starting apcupsd.
        stdout_lines:
        - Starting apcupsd.

TASK [Get apcupsd status.] *********************************************************************
ok: [iocage_03]

TASK [ansible.builtin.debug] *******************************************************************
ok: [iocage_03] => 
    out:
        changed: false
        failed: false
        rc: 0
        status: running
        stderr: ''
        stderr_lines: []
        stdout: |-
            apcupsd is running as pid 6203.
        stdout_lines:
        - apcupsd is running as pid 6203.

TASK [Stop apcupsd. By default wait 500ms to complete the command.] ****************************
changed: [iocage_03]

TASK [ansible.builtin.debug] *******************************************************************
ok: [iocage_03] => 
    out:
        changed: true
        failed: false
        rc: 0
        state:
            post: |-
                apcupsd is not running.
            pre: |-
                apcupsd is running as pid 6203.
        stderr: ''
        stderr_lines: []
        stdout: |-
            Stopping apcupsd.
            Waiting for PIDS: 6203.
        stdout_lines:
        - Stopping apcupsd.
        - 'Waiting for PIDS: 6203.'
        stop: 'Waiting for PIDS: 6203'

TASK [Start apcupsd. Wait 200ms to complete the command.] **************************************
ok: [iocage_03]

TASK [ansible.builtin.debug] *******************************************************************
ok: [iocage_03] => 
    out:
        changed: false
        failed: false
        onestart: Starting apcupsd.
        rc: 0
        stderr: ''
        stderr_lines: []
        stdout: |-
            Starting apcupsd.
        stdout_lines:
        - Starting apcupsd.

TASK [Get apcupsd status.] *********************************************************************
ok: [iocage_03]

TASK [ansible.builtin.debug] *******************************************************************
ok: [iocage_03] => 
    out:
        changed: false
        failed: false
        rc: 0
        status: running
        stderr: ''
        stderr_lines: []
        stdout: |-
            apcupsd is running as pid 6277.
        stdout_lines:
        - apcupsd is running as pid 6277.

PLAY RECAP *************************************************************************************
iocage_03: ok=12   changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0