300 Module vbotka.freebsd.service

Use case

Test the module vbotka.freebsd.service.

Tree

shell> tree .
.
├── ansible.cfg
├── hosts
│   ├── 06_iocage2.yml
│   └── 99_constructed.yml
├── iocage.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

At all running jails in the managed node:

  • playbook pb-test-01.yml: display sshd rcvar.

  • playbook pb-test-06.yml: display sendmail rcvar.

At the managed node:

  • 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-07.yml: start apcupsd.

Requirements

Notes

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

See also

Jails at managed node

# iocage list -l
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| JID  |     NAME      | BOOT | STATE | TYPE |     RELEASE     |          IP4          | IP6 |     TEMPLATE     | BASEJAIL |
+======+===============+======+=======+======+=================+=======================+=====+==================+==========+
| None | 09caf271      | off  | down  | jail | 15.1-RELEASE-p1 | DHCP (not running)    | -   | -                | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| None | 1718af82      | off  | down  | jail | 15.1-RELEASE-p1 | DHCP (not running)    | -   | -                | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 22   | log-server-01 | on   | up    | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.10/24 | -   | ansible-init     | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 21   | pkg-repo      | on   | up    | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.23/24 | -   | ansible-pkg-repo | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 18   | repos         | on   | up    | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.21/24 | -   | ansible-repos    | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 19   | repos-devel   | on   | up    | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.22/24 | -   | ansible-repos    | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 28   | test-151      | off  | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.189 | -   | ansible-client   | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 27   | test-152      | off  | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.188 | -   | ansible-client   | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 26   | test-153      | off  | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.187 | -   | ansible-client   | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 23   | www-01        | on   | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.116 | -   | ansible-init     | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 24   | www-02        | on   | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.147 | -   | ansible-init     | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+

ansible.cfg

[defaults]
callback_result_format = yaml
deprecation_warnings = false
display_skipped_hosts = false
gathering = explicit
interpreter_python = auto_silent

[connection]
pipelining = true

Inventory iocage.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_04 ansible_host=10.1.0.29

[iocage]
iocage_06

[iocage:vars]
ansible_user=admin
ansible_become=true
ansible_python_interpreter=auto_silent

hosts

hosts/06_iocage2.yml
plugin: vbotka.freebsd.iocage2
host: iocage_06
user: admin
sudo: true
get_properties: true

compose:
  iocage_tags: dict(iocage_properties.notes | regex_findall('(\w+)=([\w\-]+)'))
  iocage_classes: iocage_properties.notes | regex_findall('(?<=class=)[\w\-]+|(?<=,)[\w\-]+')
# connection plugin vbotka.freebsd.jailexec
  ansible_connection: "'vbotka.freebsd.jailexec'"
  ansible_ssh_user: "'admin'"
  ansible_jail_host: dict(iocage_properties.notes | regex_findall('(\w+)=([\w\-]+)')).vmm | d('none')
  ansible_jail_name: iocage_jid
  ansible_jail_privilege_escalation: "'sudo'"
hosts/99_constructed.yml
plugin: ansible.builtin.constructed

keyed_groups:
  - prefix: state
    key: iocage_state
  - prefix: vmm
    key: iocage_tags.vmm

Display inventory

(env) > ansible-inventory -i hosts --graph
@all:
  |--@ungrouped:
  |--@state_up:
  |  |--test-153
  |  |--repos-devel
  |  |--pkg-repo
  |  |--log-server-01
  |  |--www-02
  |  |--test-152
  |  |--repos
  |  |--www-01
  |  |--test-151
  |--@vmm_iocage_06:
  |  |--test-153
  |  |--1718af82
  |  |--repos-devel
  |  |--09caf271
  |  |--pkg-repo
  |  |--log-server-01
  |  |--www-02
  |  |--test-152
  |  |--repos
  |  |--www-01
  |  |--test-151
  |--@state_down:
  |  |--1718af82
  |  |--09caf271

Playbook pb-test-01.yml

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

  vars:

    debug: false
    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
      when: debug | bool

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

    - ansible.builtin.debug:
        var: sshd_rcvar

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

Playbook output - jails sshd rcvar

The key and value of rcvar is returned in 1) the attribute rcvar of the registered variable out.rcvar and in 2) the stdout. Usually, you’ll use the first option. The second option shows how to use the filter``community.general.jc``.

(env) > ansible-playbook -i hosts pb-test-01.yml
PLAY [Test module vbotka.freebsd.service. Get running jails sshd rcvar.] *******

TASK [Get sshd rcvar.] *********************************************************
ok: [test-153]
ok: [www-02]
ok: [pkg-repo]
ok: [log-server-01]
ok: [test-152]
ok: [repos]
ok: [www-01]
ok: [test-151]
ok: [repos-devel]

TASK [ansible.builtin.debug] ***************************************************
ok: [test-153] => 
    out.stdout: |-
        # sshd : Secure Shell Daemon
        #
        sshd_enable="YES"
        #   (default: "")
ok: [repos-devel] => 
    out.stdout: |-
        # sshd : Secure Shell Daemon
        #
        sshd_enable="NO"
        #   (default: "")
ok: [pkg-repo] => 
    out.stdout: |-
        # sshd : Secure Shell Daemon
        #
        sshd_enable="NO"
        #   (default: "")
ok: [log-server-01] => 
    out.stdout: |-
        # sshd : Secure Shell Daemon
        #
        sshd_enable="NO"
        #   (default: "")
ok: [www-02] => 
    out.stdout: |-
        # sshd : Secure Shell Daemon
        #
        sshd_enable="NO"
        #   (default: "")
ok: [test-152] => 
    out.stdout: |-
        # sshd : Secure Shell Daemon
        #
        sshd_enable="YES"
        #   (default: "")
ok: [repos] => 
    out.stdout: |-
        # sshd : Secure Shell Daemon
        #
        sshd_enable="NO"
        #   (default: "")
ok: [www-01] => 
    out.stdout: |-
        # sshd : Secure Shell Daemon
        #
        sshd_enable="NO"
        #   (default: "")
ok: [test-151] => 
    out.stdout: |-
        # sshd : Secure Shell Daemon
        #
        sshd_enable="YES"
        #   (default: "")

TASK [ansible.builtin.debug] ***************************************************
ok: [www-02] => 
    sshd_rcvar:
        sshd_enable: 'NO'
ok: [repos-devel] => 
    sshd_rcvar:
        sshd_enable: 'NO'
ok: [test-153] => 
    sshd_rcvar:
        sshd_enable: 'YES'
ok: [pkg-repo] => 
    sshd_rcvar:
        sshd_enable: 'NO'
ok: [log-server-01] => 
    sshd_rcvar:
        sshd_enable: 'NO'
ok: [repos] => 
    sshd_rcvar:
        sshd_enable: 'NO'
ok: [test-152] => 
    sshd_rcvar:
        sshd_enable: 'YES'
ok: [www-01] => 
    sshd_rcvar:
        sshd_enable: 'NO'
ok: [test-151] => 
    sshd_rcvar:
        sshd_enable: 'YES'

TASK [ansible.builtin.debug] ***************************************************
ok: [test-153] => 
    out.rcvar:
        sshd_enable: 'YES'
ok: [pkg-repo] => 
    out.rcvar:
        sshd_enable: 'NO'
ok: [repos-devel] => 
    out.rcvar:
        sshd_enable: 'NO'
ok: [log-server-01] => 
    out.rcvar:
        sshd_enable: 'NO'
ok: [test-152] => 
    out.rcvar:
        sshd_enable: 'YES'
ok: [www-02] => 
    out.rcvar:
        sshd_enable: 'NO'
ok: [repos] => 
    out.rcvar:
        sshd_enable: 'NO'
ok: [www-01] => 
    out.rcvar:
        sshd_enable: 'NO'
ok: [test-151] => 
    out.rcvar:
        sshd_enable: 'YES'

PLAY RECAP *********************************************************************
log-server-01              : ok=4    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
pkg-repo                   : ok=4    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
repos                      : ok=4    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
repos-devel                : ok=4    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
test-151                   : ok=4    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
test-152                   : ok=4    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
test-153                   : ok=4    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
www-01                     : ok=4    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
www-02                     : ok=4    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

Playbook pb-test-02.yml

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

  vars:

    debug: false
    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 - create jid_rcvar

(env) > ansible-playbook -i iocage.ini -e debug=true pb-test-02.yml
PLAY [Test module vbotka.freebsd.service. Set dictionary jid_rcvar.] ***********

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

TASK [ansible.builtin.debug] ***************************************************
ok: [iocage_06] => 
    iocage_list_out:
        ansible_facts:
            discovered_interpreter_python: /usr/local/bin/python3.12
        changed: false
        changed_when_result: false
        cmd:
        - iocage
        - list
        - --long
        delta: '0:00:00.634091'
        end: '2026-08-27 11:29:53.512024'
        failed: false
        msg: ''
        rc: 0
        start: '2026-08-27 11:29:52.877933'
        stderr: ''
        stderr_lines: []
        stdout: |-
            +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
            | JID  |     NAME      | BOOT | STATE | TYPE |     RELEASE     |          IP4          | IP6 |     TEMPLATE     | BASEJAIL |
            +======+===============+======+=======+======+=================+=======================+=====+==================+==========+
            | None | 09caf271      | off  | down  | jail | 15.1-RELEASE-p1 | DHCP (not running)    | -   | -                | no       |
            +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
            | None | 1718af82      | off  | down  | jail | 15.1-RELEASE-p1 | DHCP (not running)    | -   | -                | no       |
            +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
            | 22   | log-server-01 | on   | up    | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.10/24 | -   | ansible-init     | no       |
            +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
            | 21   | pkg-repo      | on   | up    | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.23/24 | -   | ansible-pkg-repo | no       |
            +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
            | 18   | repos         | on   | up    | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.21/24 | -   | ansible-repos    | no       |
            +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
            | 19   | repos-devel   | on   | up    | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.22/24 | -   | ansible-repos    | no       |
            +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
            | 28   | test-151      | off  | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.189 | -   | ansible-client   | no       |
            +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
            | 27   | test-152      | off  | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.188 | -   | ansible-client   | no       |
            +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
            | 26   | test-153      | off  | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.187 | -   | ansible-client   | no       |
            +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
            | 23   | www-01        | on   | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.116 | -   | ansible-init     | no       |
            +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
            | 24   | www-02        | on   | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.147 | -   | ansible-init     | no       |
            +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
        stdout_lines:
        - +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
        - '| JID  |     NAME      | BOOT | STATE | TYPE |     RELEASE     |          IP4          |
            IP6 |     TEMPLATE     | BASEJAIL |'
        - +======+===============+======+=======+======+=================+=======================+=====+==================+==========+
        - '| None | 09caf271      | off  | down  | jail | 15.1-RELEASE-p1 | DHCP (not
            running)    | -   | -                | no       |'
        - +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
        - '| None | 1718af82      | off  | down  | jail | 15.1-RELEASE-p1 | DHCP (not
            running)    | -   | -                | no       |'
        - +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
        - '| 22   | log-server-01 | on   | up    | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.10/24
            | -   | ansible-init     | no       |'
        - +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
        - '| 21   | pkg-repo      | on   | up    | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.23/24
            | -   | ansible-pkg-repo | no       |'
        - +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
        - '| 18   | repos         | on   | up    | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.21/24
            | -   | ansible-repos    | no       |'
        - +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
        - '| 19   | repos-devel   | on   | up    | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.22/24
            | -   | ansible-repos    | no       |'
        - +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
        - '| 28   | test-151      | off  | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.189
            | -   | ansible-client   | no       |'
        - +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
        - '| 27   | test-152      | off  | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.188
            | -   | ansible-client   | no       |'
        - +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
        - '| 26   | test-153      | off  | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.187
            | -   | ansible-client   | no       |'
        - +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
        - '| 23   | www-01        | on   | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.116
            | -   | ansible-init     | no       |'
        - +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
        - '| 24   | www-02        | on   | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.147
            | -   | ansible-init     | no       |'
        - +------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+

TASK [ansible.builtin.debug] ***************************************************
ok: [iocage_06] => 
    jails | to_yaml: |-
        09caf271:
          basejail: 'no'
          boot: 'off'
          ip4: '-'
          ip4_dict:
            ip4: []
            msg: DHCP (not running)
          ip6: '-'
          jid: None
          release: 15.1-RELEASE-p1
          state: down
          template: '-'
          type: jail
        1718af82:
          basejail: 'no'
          boot: 'off'
          ip4: '-'
          ip4_dict:
            ip4: []
            msg: DHCP (not running)
          ip6: '-'
          jid: None
          release: 15.1-RELEASE-p1
          state: down
          template: '-'
          type: jail
        log-server-01:
          basejail: 'no'
          boot: 'on'
          ip4: 172.16.99.10
          ip4_dict:
            ip4:
            - {ifc: vnet0, ip: 172.16.99.10, mask: '24'}
            msg: ''
          ip6: '-'
          jid: '22'
          release: 15.1-RELEASE-p1
          state: up
          template: ansible-init
          type: jail
        pkg-repo:
          basejail: 'no'
          boot: 'on'
          ip4: 172.16.99.23
          ip4_dict:
            ip4:
            - {ifc: vnet0, ip: 172.16.99.23, mask: '24'}
            msg: ''
          ip6: '-'
          jid: '21'
          release: 15.1-RELEASE-p1
          state: up
          template: ansible-pkg-repo
          type: jail
        repos:
          basejail: 'no'
          boot: 'on'
          ip4: 172.16.99.21
          ip4_dict:
            ip4:
            - {ifc: vnet0, ip: 172.16.99.21, mask: '24'}
            msg: ''
          ip6: '-'
          jid: '18'
          release: 15.1-RELEASE-p1
          state: up
          template: ansible-repos
          type: jail
        repos-devel:
          basejail: 'no'
          boot: 'on'
          ip4: 172.16.99.22
          ip4_dict:
            ip4:
            - {ifc: vnet0, ip: 172.16.99.22, mask: '24'}
            msg: ''
          ip6: '-'
          jid: '19'
          release: 15.1-RELEASE-p1
          state: up
          template: ansible-repos
          type: jail
        test-151:
          basejail: 'no'
          boot: 'off'
          ip4: 172.16.99.189
          ip4_dict:
            ip4:
            - {ifc: epair0b, ip: 172.16.99.189, mask: '-'}
            msg: ''
          ip6: '-'
          jid: '28'
          release: 15.1-RELEASE-p1
          state: up
          template: ansible-client
          type: jail
        test-152:
          basejail: 'no'
          boot: 'off'
          ip4: 172.16.99.188
          ip4_dict:
            ip4:
            - {ifc: epair0b, ip: 172.16.99.188, mask: '-'}
            msg: ''
          ip6: '-'
          jid: '27'
          release: 15.1-RELEASE-p1
          state: up
          template: ansible-client
          type: jail
        test-153:
          basejail: 'no'
          boot: 'off'
          ip4: 172.16.99.187
          ip4_dict:
            ip4:
            - {ifc: epair0b, ip: 172.16.99.187, mask: '-'}
            msg: ''
          ip6: '-'
          jid: '26'
          release: 15.1-RELEASE-p1
          state: up
          template: ansible-client
          type: jail
        www-01:
          basejail: 'no'
          boot: 'on'
          ip4: 172.16.99.116
          ip4_dict:
            ip4:
            - {ifc: epair0b, ip: 172.16.99.116, mask: '-'}
            msg: ''
          ip6: '-'
          jid: '23'
          release: 15.1-RELEASE-p1
          state: up
          template: ansible-init
          type: jail
        www-02:
          basejail: 'no'
          boot: 'on'
          ip4: 172.16.99.147
          ip4_dict:
            ip4:
            - {ifc: epair0b, ip: 172.16.99.147, mask: '-'}
            msg: ''
          ip6: '-'
          jid: '24'
          release: 15.1-RELEASE-p1
          state: up
          template: ansible-init
          type: jail

TASK [ansible.builtin.debug] ***************************************************
ok: [iocage_06] => 
    jids | to_yaml: |-
        ['22', '21', '18', '19', '28', '27', '26', '23', '24']

TASK [Jails service sshd rcvar.] ***********************************************
ok: [iocage_06] => (item=22)
ok: [iocage_06] => (item=21)
ok: [iocage_06] => (item=18)
ok: [iocage_06] => (item=19)
ok: [iocage_06] => (item=28)
ok: [iocage_06] => (item=27)
ok: [iocage_06] => (item=26)
ok: [iocage_06] => (item=23)
ok: [iocage_06] => (item=24)

TASK [ansible.builtin.debug] ***************************************************
ok: [iocage_06] => 
    service_out:
        changed: false
        failed: false
        msg: All items completed
        results:
        -   ansible_loop_var: item
            changed: false
            failed: false
            item: '22'
            rc: 0
            rcvar:
                sshd_enable: 'NO'
            stderr: ''
            stderr_lines: []
            stdout: |-
                # sshd : Secure Shell Daemon
                #
                sshd_enable="NO"
                #   (default: "")
            stdout_lines:
            - '# sshd : Secure Shell Daemon'
            - '#'
            - sshd_enable="NO"
            - '#   (default: "")'
            - ''
        -   ansible_loop_var: item
            changed: false
            failed: false
            item: '21'
            rc: 0
            rcvar:
                sshd_enable: 'NO'
            stderr: ''
            stderr_lines: []
            stdout: |-
                # sshd : Secure Shell Daemon
                #
                sshd_enable="NO"
                #   (default: "")
            stdout_lines:
            - '# sshd : Secure Shell Daemon'
            - '#'
            - sshd_enable="NO"
            - '#   (default: "")'
            - ''
        -   ansible_loop_var: item
            changed: false
            failed: false
            item: '18'
            rc: 0
            rcvar:
                sshd_enable: 'NO'
            stderr: ''
            stderr_lines: []
            stdout: |-
                # sshd : Secure Shell Daemon
                #
                sshd_enable="NO"
                #   (default: "")
            stdout_lines:
            - '# sshd : Secure Shell Daemon'
            - '#'
            - sshd_enable="NO"
            - '#   (default: "")'
            - ''
        -   ansible_loop_var: item
            changed: false
            failed: false
            item: '19'
            rc: 0
            rcvar:
                sshd_enable: 'NO'
            stderr: ''
            stderr_lines: []
            stdout: |-
                # sshd : Secure Shell Daemon
                #
                sshd_enable="NO"
                #   (default: "")
            stdout_lines:
            - '# sshd : Secure Shell Daemon'
            - '#'
            - sshd_enable="NO"
            - '#   (default: "")'
            - ''
        -   ansible_loop_var: item
            changed: false
            failed: false
            item: '28'
            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
            item: '27'
            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
            item: '26'
            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
            item: '23'
            rc: 0
            rcvar:
                sshd_enable: 'NO'
            stderr: ''
            stderr_lines: []
            stdout: |-
                # sshd : Secure Shell Daemon
                #
                sshd_enable="NO"
                #   (default: "")
            stdout_lines:
            - '# sshd : Secure Shell Daemon'
            - '#'
            - sshd_enable="NO"
            - '#   (default: "")'
            - ''
        -   ansible_loop_var: item
            changed: false
            failed: false
            item: '24'
            rc: 0
            rcvar:
                sshd_enable: 'NO'
            stderr: ''
            stderr_lines: []
            stdout: |-
                # sshd : Secure Shell Daemon
                #
                sshd_enable="NO"
                #   (default: "")
            stdout_lines:
            - '# sshd : Secure Shell Daemon'
            - '#'
            - sshd_enable="NO"
            - '#   (default: "")'
            - ''

TASK [ansible.builtin.debug] ***************************************************
ok: [iocage_06] => 
    jid_rcvar:
        '18':
            sshd_enable: 'NO'
        '19':
            sshd_enable: 'NO'
        '21':
            sshd_enable: 'NO'
        '22':
            sshd_enable: 'NO'
        '23':
            sshd_enable: 'NO'
        '24':
            sshd_enable: 'NO'
        '26':
            sshd_enable: 'YES'
        '27':
            sshd_enable: 'YES'
        '28':
            sshd_enable: 'YES'

PLAY RECAP *********************************************************************
iocage_06                  : 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

  vars:

    debug: false
    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 - enabled services

(env) > ansible-playbook -i iocage.ini -e debug=true pb-test-03.yml
PLAY [Test module vbotka.freebsd.service. Set dictionary jid_service_enabled.] ***

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

TASK [Jails service list enabled] **********************************************
ok: [iocage_06] => (item=22)
ok: [iocage_06] => (item=21)
ok: [iocage_06] => (item=18)
ok: [iocage_06] => (item=19)
ok: [iocage_06] => (item=28)
ok: [iocage_06] => (item=27)
ok: [iocage_06] => (item=26)
ok: [iocage_06] => (item=23)
ok: [iocage_06] => (item=24)

TASK [ansible.builtin.debug] ***************************************************
ok: [iocage_06] => 
    service_out:
        changed: false
        failed: false
        msg: All items completed
        results:
        -   ansible_loop_var: item
            changed: false
            failed: false
            item: '22'
            rc: 0
            stderr: ''
            stderr_lines: []
            stdout: |-
                /etc/rc.d/ansible_init
                /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/utx
                /etc/rc.d/var_run
                /etc/rc.d/virecover
                /usr/local/etc/rc.d/syslog-ng
            stdout_lines:
            - /etc/rc.d/ansible_init
            - /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/utx
            - /etc/rc.d/var_run
            - /etc/rc.d/virecover
            - /usr/local/etc/rc.d/syslog-ng
        -   ansible_loop_var: item
            changed: false
            failed: false
            item: '21'
            rc: 0
            stderr: ''
            stderr_lines: []
            stdout: |-
                /etc/rc.d/cleanvar
                /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/syslogd
                /etc/rc.d/utx
                /etc/rc.d/var_run
                /etc/rc.d/virecover
                /usr/local/etc/rc.d/nginx
            stdout_lines:
            - /etc/rc.d/cleanvar
            - /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/syslogd
            - /etc/rc.d/utx
            - /etc/rc.d/var_run
            - /etc/rc.d/virecover
            - /usr/local/etc/rc.d/nginx
        -   ansible_loop_var: item
            changed: false
            failed: false
            item: '18'
            rc: 0
            stderr: ''
            stderr_lines: []
            stdout: |-
                /etc/rc.d/cleanvar
                /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/syslogd
                /etc/rc.d/utx
                /etc/rc.d/var_run
                /etc/rc.d/virecover
                /usr/local/etc/rc.d/git_daemon
            stdout_lines:
            - /etc/rc.d/cleanvar
            - /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/syslogd
            - /etc/rc.d/utx
            - /etc/rc.d/var_run
            - /etc/rc.d/virecover
            - /usr/local/etc/rc.d/git_daemon
        -   ansible_loop_var: item
            changed: false
            failed: false
            item: '19'
            rc: 0
            stderr: ''
            stderr_lines: []
            stdout: |-
                /etc/rc.d/cleanvar
                /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/syslogd
                /etc/rc.d/utx
                /etc/rc.d/var_run
                /etc/rc.d/virecover
                /usr/local/etc/rc.d/git_daemon
            stdout_lines:
            - /etc/rc.d/cleanvar
            - /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/syslogd
            - /etc/rc.d/utx
            - /etc/rc.d/var_run
            - /etc/rc.d/virecover
            - /usr/local/etc/rc.d/git_daemon
        -   ansible_loop_var: item
            changed: false
            failed: false
            item: '28'
            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/var_run
                /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/var_run
            - /etc/rc.d/virecover
        -   ansible_loop_var: item
            changed: false
            failed: false
            item: '27'
            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/var_run
                /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/var_run
            - /etc/rc.d/virecover
        -   ansible_loop_var: item
            changed: false
            failed: false
            item: '26'
            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/var_run
                /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/var_run
            - /etc/rc.d/virecover
        -   ansible_loop_var: item
            changed: false
            failed: false
            item: '23'
            rc: 0
            stderr: ''
            stderr_lines: []
            stdout: |-
                /etc/rc.d/ansible_init
                /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/utx
                /etc/rc.d/var_run
                /etc/rc.d/virecover
                /usr/local/etc/rc.d/syslog-ng
            stdout_lines:
            - /etc/rc.d/ansible_init
            - /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/utx
            - /etc/rc.d/var_run
            - /etc/rc.d/virecover
            - /usr/local/etc/rc.d/syslog-ng
        -   ansible_loop_var: item
            changed: false
            failed: false
            item: '24'
            rc: 0
            stderr: ''
            stderr_lines: []
            stdout: |-
                /etc/rc.d/ansible_init
                /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/utx
                /etc/rc.d/var_run
                /etc/rc.d/virecover
                /usr/local/etc/rc.d/syslog-ng
            stdout_lines:
            - /etc/rc.d/ansible_init
            - /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/utx
            - /etc/rc.d/var_run
            - /etc/rc.d/virecover
            - /usr/local/etc/rc.d/syslog-ng

TASK [ansible.builtin.debug] ***************************************************
ok: [iocage_06] => 
    jid_service_enabled | to_yaml: |-
        '18': [cleanvar, cron, ip6addrctl, motd, netif, newsyslog, os-release, syslogd, utx,
          var_run, virecover, git_daemon]
        '19': [cleanvar, cron, ip6addrctl, motd, netif, newsyslog, os-release, syslogd, utx,
          var_run, virecover, git_daemon]
        '21': [cleanvar, cron, ip6addrctl, motd, netif, newsyslog, os-release, syslogd, utx,
          var_run, virecover, nginx]
        '22': [ansible_init, cleanvar, cleartmp, cron, ip6addrctl, motd, netif, newsyslog,
          os-release, utx, var_run, virecover, syslog-ng]
        '23': [ansible_init, cleanvar, cleartmp, cron, ip6addrctl, motd, netif, newsyslog,
          os-release, utx, var_run, virecover, syslog-ng]
        '24': [ansible_init, cleanvar, cleartmp, cron, ip6addrctl, motd, netif, newsyslog,
          os-release, utx, var_run, virecover, syslog-ng]
        '26': [cleanvar, cleartmp, cron, ip6addrctl, motd, netif, newsyslog, os-release, sshd,
          syslogd, utx, var_run, virecover]
        '27': [cleanvar, cleartmp, cron, ip6addrctl, motd, netif, newsyslog, os-release, sshd,
          syslogd, utx, var_run, virecover]
        '28': [cleanvar, cleartmp, cron, ip6addrctl, motd, netif, newsyslog, os-release, sshd,
          syslogd, utx, var_run, virecover]

PLAY RECAP *********************************************************************
iocage_06                  : 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

  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 - sshd status

(env) > ansible-playbook -i iocage.ini pb-test-04.yml
PLAY [Test module vbotka.freebsd.service. Set dictionary jid_service_status.] ***

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

TASK [Jails sshd status] *******************************************************
ok: [iocage_06] => (item=22)
ok: [iocage_06] => (item=21)
ok: [iocage_06] => (item=18)
ok: [iocage_06] => (item=19)
ok: [iocage_06] => (item=28)
ok: [iocage_06] => (item=27)
ok: [iocage_06] => (item=26)
ok: [iocage_06] => (item=23)
ok: [iocage_06] => (item=24)

TASK [ansible.builtin.debug] ***************************************************
ok: [iocage_06] => 
    jid_service_status | to_nice_yaml: |-
        '18': stopped
        '19': stopped
        '21': stopped
        '22': stopped
        '23': stopped
        '24': stopped
        '26': running
        '27': running
        '28': running

PLAY RECAP *********************************************************************
iocage_06                  : 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

  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 - sshd commands synopsis

(env) > ansible-playbook -i iocage.ini pb-test-05.yml
PLAY [Test module vbotka.freebsd.service. Get script commands synopsis.] *******

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

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

TASK [ansible.builtin.debug] ***************************************************
ok: [iocage_06] => 
    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_06] => 
    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_06                  : 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: state_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 - sendmail rcvar

shell> ansible-playbook -i hosts pb-test-06.yml
PLAY [Test module vbotka.freebsd.service. Get running jails sendmail rcvar(s).] ***

TASK [Get sendmail rcvar(s).] **************************************************
ok: [repos-devel]
ok: [log-server-01]
ok: [www-02]
ok: [test-153]
ok: [pkg-repo]
ok: [repos]
ok: [www-01]
ok: [test-152]
ok: [test-151]

TASK [ansible.builtin.debug] ***************************************************
ok: [test-153] => 
    out.rcvar:
        sendmail_enable: 'NO'
ok: [repos-devel] => 
    out.rcvar:
        sendmail_enable: 'NO'
ok: [log-server-01] => 
    out.rcvar:
        sendmail_enable: 'NO'
ok: [pkg-repo] => 
    out.rcvar:
        sendmail_enable: 'NO'
ok: [www-02] => 
    out.rcvar:
        sendmail_enable: 'NO'
ok: [test-152] => 
    out.rcvar:
        sendmail_enable: 'NO'
ok: [www-01] => 
    out.rcvar:
        sendmail_enable: 'NO'
ok: [repos] => 
    out.rcvar:
        sendmail_enable: 'NO'
ok: [test-151] => 
    out.rcvar:
        sendmail_enable: 'NO'

PLAY RECAP *********************************************************************
log-server-01              : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
pkg-repo                   : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
repos                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
repos-devel                : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test-151                   : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test-152                   : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test-153                   : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
www-01                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
www-02                     : 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 smartd.
  hosts: iocage

  vars:

    debug: false
    start_cmd_enable: "{{ rcvar.rcvar.smartd_enable == 'YES' }}"
    start_cmd: "{{ start_cmd_enable | ternary('start', 'onestart') }}"
    
  tasks:

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

    - ansible.builtin.debug:
        msg: |
          rcvar.rcvar: {{ rcvar.rcvar }}
          rcvar.rcvar.smartd_enable: {{ rcvar.rcvar.smartd_enable }}
          start_cmd_enable: {{ start_cmd_enable }}
          start_cmd: {{ start_cmd }}
      when: debug | bool

      # 500ms is enough to complete 'service smartd (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 smartd. By default wait 500ms to complete the command.
      register: out
      vbotka.freebsd.service:
        script: smartd
        command: "{{ start_cmd }}"

    - ansible.builtin.debug:
        var: out

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

    - ansible.builtin.debug:
        var: out

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

    - ansible.builtin.debug:
        var: out

      # 200ms is not enough to complete 'service smartd (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 smartd is started. See the next status.
    - name: Start smartd. Wait 200ms to complete the command.
      register: out
      vbotka.freebsd.service:
        script: smartd
        command: "{{ start_cmd }}"
        wait: 0.2

    - ansible.builtin.debug:
        var: out

    - name: Get smartd status.

      register: out
      vbotka.freebsd.service:
        script: smartd
        command: status

    - ansible.builtin.debug:
        var: out

Playbook output - start apcupsd

(env) > ansible-playbook -i iocage.ini pb-test-07.yml
PLAY [Test module vbotka.freebsd.service. Start smartd.] ***********************

TASK [Get smartd rcvar.] *******************************************************
ok: [iocage_06]

TASK [ansible.builtin.debug] ***************************************************
ok: [iocage_06] => 
    msg: |-
        rcvar.rcvar: {'smartd_enable': 'YES'}
        rcvar.rcvar.smartd_enable: YES
        start_cmd_enable: True
        start_cmd: start

TASK [Start smartd. By default wait 500ms to complete the command.] ************
ok: [iocage_06]

TASK [ansible.builtin.debug] ***************************************************
ok: [iocage_06] => 
    out:
        changed: false
        failed: false
        rc: 0
        start: smartd already running?  (pid=5752).
        stderr: |-
            smartd already running?  (pid=5752).
        stderr_lines:
        - smartd already running?  (pid=5752).
        stdout: ''
        stdout_lines: []

TASK [Get smartd status.] ******************************************************
ok: [iocage_06]

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

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

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

TASK [Start smartd. Wait 200ms to complete the command.] ***********************
changed: [iocage_06]

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

TASK [Get smartd status.] ******************************************************
ok: [iocage_06]

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

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