Make effective ansible conditions

Viewed 35

I want to create a directory as it is showed on example below:

- hosts: localhost

  tasks:

    - name: Find out if cne_env is empty
      shell: '[[ ! -z "$CNE_vCNE" ]] && echo "Not empty" || echo "Empty"'
      register: cne_env
      
    - name: Print version
      debug:
        msg: "Environment: {{ cne_env.stdout }}"

    - name: Create Directory to save logs
      become: yes
      file:
        path: /var/log/dir_files_daemon_logs/
        state: directory
        mode: "0755"
        owner: "cuser if {{ cne_env.stdout  }}  == 'Not empty' else  adminusr"
        group: "cuser if {{ cne_env.stdout }}  == 'Not empty' else  adminusr"

But, Always it creates dir with owner cuser instead of adminusr when it is empty. See output.

~]$ ansible-playbook main.yaml 
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Find out if cne env is empty] ******************************************
changed: [localhost]

TASK [Print version] ***********************************************************
ok: [localhost] => {
    "msg": "Environment: Empty"
}

TASK [Create Directory to save logs] *******************************************
fatal: [localhost]: FAILED! => {"changed": false, "gid": 1002, "group": "cuser", "mode": "0755", "msg": "chown failed: failed to look up user cuser if Empty  == 'Not empty' else  adminusr", "owner": "cuser", "path": "/var/log/dir_files_daemon_logs/", "secontext": "unconfined_u:object_r:var_log_t:s0", "size": 6, "state": "directory", "uid": 1001}

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

How can I make these conditions effective?

owner: "cuser if {{ cne_env.stdout  }}  == 'Not empty' else  adminusr"
group: "cuser if {{ cne_env.stdout }}  == 'Not empty' else  adminusr"
1 Answers

How can I make these conditions effective?

By writing correct jinja2 statements which will effectively be parsed as such:

    owner: "{{ 'cuser' if cne_env.stdout == 'Not empty' else 'adminusr' }}"
    group: "{{ 'cuser' if cne_env.stdout == 'Not empty' else 'adminusr' }}"

Meanwhile this is how I would rewrite your entire approach:

- hosts: localhost

  vars:
    cne_env_is_empty: "{{ ansible_env['CNE_vCNE'] | default('') | length == 0 }}"
    cne_dir_user: "{{ cne_env_is_empty | bool | ternary('adminusr'. 'cuser') }}"
    cne_dir_group: "{{ cne_dir_user }}"

  tasks:
    - name: Create Directory to save logs
      become: yes
      file:
        path: /var/log/dir_files_daemon_logs/
        state: directory
        mode: "0755"
        owner: "{{ cne_dir_user }}"
        group: "{{ cne_dir_group }}"
Related