don't print statement if "command not found" and compare variable value with list of values

i’m trying this in a playbook:


vars:
actionTodo: “{{ variable_actionTodo }}”
servicesList: “{{ variable_servicesList }}”
actionTodo_list: [start,stop,rstart,rstop,status,rstatus]

  • name: manage services using systemctl
    tags: manage services using systemctl
    shell: systemctl {{actionTodo}} {{servicesList}}
    with_items:

  • “{{servicesList}}”
    when: actionTodo != “” and servicesList != “”
    ignore_errors: true
    register: p2

  • debug:
    var: p2

i’d like to compare:

  • actionTo value with value from actionTo_list
  • and avoid printing “command not found” node without systemctl

I’d suggest not using the shell: module, instead use the systemd: module.

Then setup the when: clause with a third that only executes this play on OS versions that have systemctl (e.g. RHEL 7+, etc). You run a play right before it that registers the full path of systemctl found on the system (maybe use shell: which systemctl).

Something like this:

  • name: manage services using systemctl
    tags: manage services using systemctl
    systemd:
    name: {{servicesList}}
    state: {{actionTodo}}
    with_items:
  • “{{servicesList}}”
    when:
  • ansible_os_family == “RedHat” and ansible_lsb.major_release|int >= 7
  • actionTodo != “”
  • servicesList != “”
    ignore_errors: true
    register: p2

Correction to my previous email:
You COULD run a play right before it that registers the full path of systemctl found on the system (maybe use shell: which systemctl), but that is not a stable method in some cases. I suggest using systemd: with the OS version check if needed.