Search code examples
ansiblejinja2

Get string value in ansible list


i've this list in my inventory :

employee_list:
- { emp_id: 101, name: Kiven, depatement: "id=10,job=IT", number: 00014646}

How i get the value of "Job" using Ansible?


Solution

  • The value of job is contained in the depatement subentry. You can parse the value of depatement via regex to extract the value of job.

    - name: Define employee_list
      set_fact:
        employee_list:
          - { emp_id: 101, name: Kiven, depatement: "id=10,job=IT", number: 00014646}
          - { emp_id: 102, name: Eve, depatement: "id=11,job=WelcomeDesk", number: 00014657}
          - { emp_id: 103, name: Kevin, depatement: "id=12", number: 00014667}
    
    
    - name: Print out job from the employees
      debug:
        msg: "{{ item.emp_id }} has job {{ item.depatement | regex_findall('job=([\\w]+)', '\\1') | first | default('unknown') }}"
      with_items: "{{ employee_list }}"
    

    Leads to the following output:

    TASK [Define employee_list] ********************************************************************************************
    ok: [localhost]
    
    TASK [Print out job from the employees] ********************************************************************************
    ok: [localhost] => (item={'emp_id': 101, 'name': 'Kiven', 'depatement': 'id=10,job=IT', 'number': 6566}) => {
        "msg": "101 has job IT"
    }
    ok: [localhost] => (item={'emp_id': 102, 'name': 'Eve', 'depatement': 'id=11,job=WelcomeDesk', 'number': 6575}) => {
        "msg": "102 has job WelcomeDesk"
    }
    ok: [localhost] => (item={'emp_id': 103, 'name': 'Kevin', 'depatement': 'id=12', 'number': 6583}) => {
        "msg": "103 has job unknown"
    }
    

    regex_findall always returns a list, if nothing is found an empty list ([]) is returned. first takes the first element from the list, default is a fallback if the job specification was not found and an empty list was returned.

    More about regex_findall in the Ansible docs.