Édouard Lopez
Édouard Lopez

Reputation: 43421

How can I pass variable to ansible playbook in the command line?

How can one pass variable to ansible playbook in the command line?
The following command didn't work:

$ ansible-playbook -i '10.0.0.1,' yada-yada.yml --tags 'loaddata' django_fixtures="tile_colors"

Where django_fixtures is my variable.

Upvotes: 306

Views: 463895

Answers (11)

jarv
jarv

Reputation: 5596

You can use the --extra-vars option. See the docs

Upvotes: 36

Édouard Lopez
Édouard Lopez

Reputation: 43421

Reading the docs I find the section Passing Variables On The Command Line, that gives this example:

ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"

Others examples demonstrate how to load from JSON string (≥1.2) or file (≥1.3)

Upvotes: 399

samnoon
samnoon

Reputation: 1753

In Ansible, we can define variables when running our playbook by passing variables at the command line using the --extra-vars (or -e) argument.

Bellow are some ways to pass variables to an Ansible playbook in the command line:

Method 1: key=value format

ansible-playbook site.yml --extra-vars "arg1=demo1 arg2=demo2"

Method 2: JSON string format

ansible-playbook site.yml --extra-vars '{"arg1":"demo1","arg2":"demo2"}'

The site.yml playbook will be:

---

- name: ansible playbook to print external variables
  hosts: localhost
  connection: local

  tasks:
  - name: print values
    ansible.builtin.debug:
      msg: "variable1 = {{ arg1 }}, variable2 = {{ arg2 }}"
    when: arg1 is defined and arg2 is defined
      

Method 3: Read from an external JSON file

If you have a lot of special characters, use a JSON or YAML file containing the variable definitions.

ansible-playbook site.yml --extra-vars "@vars.json"

The vars.json file:

{
   arg1: "demo1",
   arg2: "demo2"
}

Upvotes: 10

user164328
user164328

Reputation: 81

This also worked for me if you want to use shell environment variables:

ansible-playbook -i "localhost," ldap.yaml --extra-vars="LDAP_HOST={{ lookup('env', 'LDAP_HOST') }} clustername=mycluster env=dev LDAP_USERNAME={{ lookup('env', 'LDAP_USERNAME') }} LDAP_PASSWORD={{ lookup('env', 'LDAP_PASSWORD') }}"

Upvotes: 7

Nitesh Jain
Nitesh Jain

Reputation: 167

 s3_sync:
      bucket: ansible-harshika
      file_root: "{{ pathoftsfiles  }}"
      validate_certs: false 
      mode: push
      key_prefix: "{{ folder }}"

here the variables are being used named as 'pathoftsfiles' and 'folder'. Now the value to this variable can be given by the below command

sudo ansible-playbook multiadd.yml --extra-vars "pathoftsfiles=/opt/lampp/htdocs/video/uploads/tsfiles/$2 folder=nitesh"

Note: Don't use the inverted commas while passing the values to the variable in the shell command

Upvotes: 9

Naveen Goyal
Naveen Goyal

Reputation: 93

ansible-playbook release.yml --extra-vars "username=hello password=bye"

#you can now use the above command anywhere in the playbook as an example below:
tasks:
- name: Create a new user in Linux
shell: useradd -m -p {{username}} {{password}}"

Upvotes: 4

Rajeev Singh
Rajeev Singh

Reputation: 51

ansible-playbok -i <inventory> <playbook-name> -e "proc_name=sshd"

You can use the above command in below playbooks.

---
- name: Service Status
gather_facts: False
tasks:
- name: Check Service Status (Linux)
shell: pgrep "{{ proc_name }}"
register: service_status
ignore_errors: yes
debug: var=service_status.rc`

Upvotes: 5

Ali Atakan
Ali Atakan

Reputation: 429

ansible-playbook test.yml --extra-vars "arg1=${var1} arg2=${var2}"

In the yml file you can use them like this

---
arg1: "{{ var1 }}"
arg2: "{{ var2 }}"

Also, --extra-vars and -e are the same, you can use one of them.

Upvotes: 16

GreensterRox
GreensterRox

Reputation: 7160

Other answers state how to pass in the command line variables but not how to access them, so if you do:

--extra-vars "version=1.23.45 other_variable=foo"

In your yml file you assign these to scoped ansible variables by doing something like:

vars:
    my_version: "{{ version }}"
    my_other_variable: {{ other_variable }}

An alternative to using command line args is to utilise environmental variables that are already defined within your session, you can reference these within your ansible yml files like this:

vars:
    my_version: "{{ lookup('env', 'version') }}"
    my_other_variable: {{ lookup('env', 'other_variable') }}

Upvotes: 206

OpenITeX
OpenITeX

Reputation: 507

For some reason none of the above Answers worked for me. As I need to pass several extra vars to my playbook in Ansbile 2.2.0, this is how I got it working (note the -e option before each var):

ansible-playbook site.yaml -i hostinv -e firstvar=false -e second_var=value2

Upvotes: 40

lanni654321
lanni654321

Reputation: 1087

ansible-playbook release.yml -e "version=1.23.45 other_variable=foo"

Upvotes: 48

Related Questions