can we not use 2 var_files in a playbook

280 views
Skip to first unread message

Narmada Karthika

unread,
May 19, 2023, 1:21:36 AM5/19/23
to Ansible Project
I am getting error saying  I am using 2 var_files.
ERROR! failed at splitting arguments, either an unbalanced jinja2 block or quotes:

I also tried using include_vars which gave me same error, the values in these 2 files need to be replace at diff locations at play book
some one please suggest what is the best way for this

 name: post call to get servergroup
  hosts: localhost
  become: true
  gather_facts: no
  tasks:
    - name: set the facts per host
      set_fact:
        access_token: "{{ hostvars.localhost.output.stdout }}" # this is the output of the above play
    - name: Make a post call to get server details
      shell: |
        cd /var/output/
        curl --location --request GET "{{ serverlist }}" \--header 'Authorization: Bearer "{{ access_token }}" > /var/output/"{{ item }}".json
        jq -r '.[]|.serverData[].servers[]' "{{ item }}".json > /home/deploy-user/ansible/group_vars/"{{ item }}".yml
      # item and server list from one file and
register: data
    - debug: msg="data , {{ repo }}" # this need to replaced from one var file
      loop:
        - dev
        - uat
        - stg2

Dick Visser

unread,
May 19, 2023, 3:50:22 AM5/19/23
to ansible...@googlegroups.com
On Fri, 19 May 2023 at 07:21, Narmada Karthika <chitt...@gmail.com> wrote:

> I am getting error saying I am using 2 var_files.

What is that error exactly?

> ERROR! failed at splitting arguments, either an unbalanced jinja2 block or quotes:

This is another error then?

> I also tried using include_vars which gave me same error, the values in these 2 files need to be replace at diff locations at play book
> some one please suggest what is the best way for this
> name: post call to get servergroup
> hosts: localhost
> become: true
> gather_facts: no
> tasks:
> - name: set the facts per host
> set_fact:
> access_token: "{{ hostvars.localhost.output.stdout }}" # this is the output of the above play
> - name: Make a post call to get server details
> shell: |
> cd /var/output/
> curl --location --request GET "{{ serverlist }}" \--header 'Authorization: Bearer "{{ access_token }}" > /var/output/"{{ item }}".json
> jq -r '.[]|.serverData[].servers[]' "{{ item }}".json > /home/deploy-user/ansible/group_vars/"{{ item }}".yml
> # item and server list from one file and


Instead of having ansible execute several shell commands piped
together, you should use native modules, like
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/uri_module.html,
register the result, and then operate/make decisions based on that.

> register: data
> - debug: msg="data , {{ repo }}" # this need to replaced from one var file
> loop:
> - dev
> - uat
> - stg2

"replaced from" is unclear - you usually replace something with
something, or by something.
Rather than guessing what you might mean, please try to be more clear.

Todd Lewis

unread,
May 19, 2023, 6:59:28 AM5/19/23
to ansible...@googlegroups.com, uto...@gmail.com
Your problem is overquoting. The in-line shell script is already in a kind of quotes, so you don't have to quote again your jinja expressions' mustaches. All those double-quotes remain in the fully templated shell script.

Or it might be that the opening single quote of your --header value is never closed.

Or both of those things.

Rowe, Walter P. (Fed)

unread,
May 19, 2023, 8:07:45 AM5/19/23
to ansible...@googlegroups.com
Your curl command places the output in /var/output/{{ item }}.json.
Your jq command reads the output from {{ item }}.json which is not /var/output/{{ item }}.json.

Walter
--
Walter Rowe, Division Chief
Infrastructure Services, OISM
Mobile: 202.355.4123

--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/41e35941-ac2e-48fe-9654-489f0c298c7dn%40googlegroups.com.

Narmada Karthika

unread,
May 19, 2023, 3:19:16 PM5/19/23
to Ansible Project
thank you all for your findings and recommendations

In the same playbook I would like to explain one more scenario , I am using set_facts to use above playbook output as input in the playbook, and I have variables.yml 

It has to go through loop and get the server details from each environment, will my below playbook work
my variables.yml file
# Environment and os as input to pull all servers out of this
# item should be replaced with the item from the loop and pass it to below playbook

vars_files:
    - "variables.yml"
  tasks:
    - name: set the facts per host
      set_fact:
        access_token: "{{ hostvars.localhost.output.stdout }}" # this is the output of the above play
    - name: Make a post call to get server details
      shell: |
        cd /var/output/
        curl --location --request GET {{ serverlist }} \--header Authorization: Bearer {{ access_token }} > /var/output/servers1.json
jq -r '.[]|.serverData[].servers[]' servers1.json > /home/deploy-user/ansible/group_vars/servers1.yml
      register: data
    - debug: msg="data , {{ serverlist }}" # this need to replaced from one var file
      loop:
        - dev
        - uat
        - stg2

Todd Lewis

unread,
May 19, 2023, 4:37:37 PM5/19/23
to Ansible Project
> will my below playbook work
I don't think so.

1. Your serverlist is a string with "{{ item }}" in it, but you're using it in a shell module invocation with no loops, i.e. where "item" isn't defined.

2. In your shell script, your jq output is being directed in group_vars/server1.yml with replacement. Once you fix issue #1 and start looping, you'll find servers1.yml contains the data only for the last iteration.

I'm puzzled by your placement of the serverlist definition in a separate file rather than in a vars: section in the playbook, or even hard-coded directly in the embedded shell script. Nor is it clear to me what you expect the final debug step to show you. I mean, we know it will look like this:
TASK [unnamed debug loop] ******************************************************
ok: [localhost] => (item=dev) => {
    "msg": "data , https://test-dev.test.com/testapi/test/server?environment=dev&os=linux"
}
ok: [localhost] => (item=uat) => {
    "msg": "data , https://test-dev.test.com/testapi/test/server?environment=uat&os=linux"
}
ok: [localhost] => (item=stg2) => {
    "msg": "data , https://test-dev.test.com/testapi/test/server?environment=stg2&os=linux"
}

but what's the point?

Narmada Karthika

unread,
May 19, 2023, 4:58:03 PM5/19/23
to Ansible Project
Thankyou for taking time and looking into it..
you made a valid questions, 
1. I am trying this approach so that I can pass {item} as jenkins parameters. when dev fro item group is given it should print all servers from that env.
2.  group_vars/server1.yml  I am trying to get the first part working so I did not specify the output file here. ( will make a note next time not to miss it)
also can you please elaborate more here "Your serverlist is a string with "{{ item }}" in it, but you're using it in a shell module invocation with no loops, i.e. where "item" isn't defined." 
I mean best possibilities to fulfill my need.
Reply all
Reply to author
Forward
0 new messages