how to set default verbosity in ansible.cfg - ansible

I want to set default verbosity level in ansible. I set default_verbosity=1 in anisble.cfg but this is not working. If I set environment variable ANSIBLE_VERBOSITY=1 then I can see verbose level 1 output for my running tasks.
As per my current requirement, I want to set this value in ansible.cfg.
Can anyone help me on this?

Use verbosity instead of default_verbosity in ansible.cfg file as:
$ cat ansible.cfg
[defaults]
verbosity = 1
verbosity can be 0|1|2|3|4 representing None|-v|-vv|-vvv|-vvvv.
Assuming, the config file is kept under specific locations ansible looks into.
ansible-config list can also be used to list all the available configuration file settings.

Related

How to set Fileinput directory value from properties?

If my flow is File Input -> Compute Node -> File Output, how can I set the File Input directory value based on a User Defined Property? I will have a different file drop directory for dev, qa and prod and don’t want this hard coded anywhere. If it cannot be done using my User Defined Properties, how else can I accomplish this?
Create configurable properties per environment and define the input directory there.
Properties for dev:
# File: yourapp-dev.properties
yourflow#File Input.inputDirectory = ./yourapp/dev/in
Properties for qa:
# File: yourapp-qa.properties
yourflow#File Input.inputDirectory = ./yourapp/qa/in
Apply the properties per environment. For dev it would be:
mqsiapplybaroverride -b yourapp.bar -p yourapp-dev.properties -r
Now you can deploy yourapp.bar to the dev environment.

How to overwrite a default variable in ansible.cfg dynamically?

I have a playbook with the following task that must copy the 2 Gb file from local to remote servers and extract files:
- name: Copy archived file to target server and extract
unarchive:
src: /path_to_source_dir/file.tar.gz
dest: /path_to_dest_dir
This task fails because ansible copies file to /home mount point on the target server and there's not enough space there:
sftp> put /path_to_source_dir/file.tar.gz /home/my_user_name/.ansible/tmp/ansible-tmp-1551129648.53-14181330218552/source
scp: /home/my_user_name/.ansible/tmp/ansible-tmp-1551129648.53-14181330218552/source: No space left on device
The reason for that is because ansible.cfg has a default parameter:
remote_tmp = ~/.ansible/tmp
How to overwrite this parameter from the playbook (if possible) and make ansible to copy file to the same destination directory specified in the task? So it would be like this:
remote_tmp = /path_to_dest_dir/.ansible/tmp
And the destination path is going to be different each time for a different target server!
Cleaning /home is not an option for me.
The answer here unfortunately is not very clear to me.
There are a few different ways to achieve what you are looking to do. Which one is a matter of preference and your use case.
You found the first way, setting an environment variable before running the playbook. Great for a quick on-the-fly job. Remembering to do that every time you run a certain playbook is indeed annoying. A slight variation of that is to use the environment keyword to set that variable for the play. You can also set environment variable in a role, block or a single task. https://docs.ansible.com/ansible/devel/reference_appendices/playbooks_keywords.html?highlight=environment%20directive. Here is an example of it in use: https://docs.ansible.com/ansible/devel/reference_appendices/faq.html?highlight=environment.
Using the environment keyword in a play et al works well for a specific application of automation, but what if you want Ansible to always use a different remote tmp path for specific servers? Like all variables, the remote_tmp can be sourced from inventory host and group variables not just the config file or environment variables. You need to mind you variable precedence if it is being set in different places. With this you could set remote_tmp in your inventory for that host or a group of hosts. Ansible will always use that path for that host or hosts in that group without having to define it in every play or roles. If you need to change that path, you change it in your inventory and it changes the behavior for all playbook runs without any additional edits. Here is an example of it being used as a host variable in static inventory: https://docs.ansible.com/ansible/devel/reference_appendices/faq.html?highlight=remote_tmp#running-on-solaris
So while the specific issue of "dynamically" setting the remote tmp directory on a host is not a best practice topic per se, it does become an example of the best practice of making the most of variables in Ansible.
For reference, remote temporary directories are handled by the shell plugins. While many parameters are shared, there are others that are specific to the shell Ansible using. Ansible uses sh by default. https://docs.ansible.com/ansible/latest/plugins/shell/sh.html
Hope that helps. Happy automating.

Set local_tmp as an ansible variable

Is it possible to set local_tmp as a variable in a playbook or pass it on the command-line instead? The only way, as I see it, to set this variable is by writing it to a file in a pre-determined location or by creating the file in an arbitrary location and setting the environment variable ANSIBLE_CONFIG to point to it.
What I want is to overrirde the default value of local_tmp by specifying it on either the command-line or in a playbook.
You can do:
ANSIBLE_LOCAL_TEMP=/tmp/.ansible/tmp ansible-playbook myplaybook.yml

How to detect an inventory environment in Ansible?

I have the requirement to skip some steps in my scripts when I run a deployment against production.
When a playbook is started, it always requires an environment (-i option), so there would be information I could query to distinguish which steps to take.
This leads me to ask:
How can I query the environment I am running a playbook in?
As an alternative, I could provide an extra variable as a parameter like -e "env=prod". But this would be redundant, since I have specified the environment already with -i...
Another option would be to set up a group environment, put all hosts of this environment in there, and define a group_var called env: prod. But putting all hosts in this group is overkill.
Bottom line: can I query the environment? Is there another option I'm not considering?
From Magic Variables in the Ansible documentation:
Also available, inventory_dir is the pathname of the directory holding Ansible’s inventory host file, inventory_file is the pathname and the filename pointing to the Ansible’s inventory host file.
Use string manipulation to extract the information you want from the above variable (e.g., the last segment from the path).
A filter exists to extract the last part of a pathname/filename :
managing-file-names-and-path-names
So you can use inventory_file | basename

How to ignore my inventory option in .ansible.cfg?

I've double-checked that Ansible is reading my .ansible.cfg file (it is).
However, if I use the setting:
inventory = /my/local/inventory
I keep getting the error message No hosts matched if I ignore the -i option when running ansible.
I've tried ansible -vvv but that hasn't shed any light.
I've also looked at https://github.com/ansible/ansible/issues/11907 and checked there aren't any ENV variables set.
Any other suggestions?
You said .ansible.cfg which is the file it will search for in your home directory. If you are expecting an Ansible configuration for the current directory, make sure it is called ansible.cfg. See the docs for more information on search order for Ansible config.

Resources