GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community. Already on GitHub? Sign in to your account. Fedora 27 Kernel: 4. Hi all, on a templates used to generate application ports I need to increase the port number in a for loop. The "change of this behaviour" has been discussed on this issue and also discussed here. As workaround comment on stackOverflow from Peter Hollingsworth I used:.
This workaround will work on a python jinja2 script, but it doesn't on a jinja2 template used with the templates module. Is it a bug?
If these files are inaccurate, please update the component name section of the description or use the! Is namespace available in older jinja2 versions so people can write templates compatible with both versions?
Running a for-loop over a Jinja2 dictionary
Otherwise there isn't a reasonable upgrade path here for large code as it is impossible to have two versions of jinja2 coexist at once. Skip to content. Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.
Sign up. New issue. Jump to bottom. Copy link Quote reply. This comment has been minimized. Sign in to view. I am facing the same exact issue. Sign up for free to subscribe to this conversation on GitHub. Already have an account?
Sign in. Linked pull requests. You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window.At the time of this posting, iterating over dictionaries inside a Jinja template is poorly documented, especially if you need access to the jinja dictionary keys and it's something I end up doing alot. Of course running a for-loop over a jinja dictionary is as basic an activity as you're likely to do, for whatever reason it's buried in the Jinja2 documentation.
I see thousands of people trying to find out how to do it hitting this page every day. Loop over each item in a sequence. For example, to display a list of users provided in a variable called users:. If you need to retain both the key and value when doing a for-loop over a jinja dictionary, use iteritems like this Note, however, that Python dicts are not ordered; so you might want pass a sorted list of tuples instead.
Doing these things in Jinja is easy after you know. Full email text Recently, we shared our commitment If you haven't I've been a software developer and engineering manager for the last 18 years, currently focused on building SaaS products for SMB and enterprise companies.
I founded API Canary in to allow companies with mission critical production systems to catch outages before their customers do. We're currently hiring so come check us out. Previously I co-founded and served as CTO of Gigwalka mobile work marketplace designed to help businesses mobilize people so they can get field work done.
I love meeting new people from all walks of life, drop me a line below and introduce yourself. Running a for-loop over a Jinja2 dictionary At the time of this posting, iterating over dictionaries inside a Jinja template is poorly documented, especially if you need access to the jinja dictionary keys and it's something I end up doing alot.
So here's how you do it, nice and simple Pause reading for 5 seconds Join My Mailing List! I very infrequently send out emails about my projects. I would really appreciate it if you would add yourself to my email list.
Note: I will never share your email with anyone else. To: mattccrampton Howdy! About I've been a software developer and engineering manager for the last 18 years, currently focused on building SaaS products for SMB and enterprise companies.But these configuration files may vary for each remote servers or each cluster.
Subscribe to RSS
But apart from some few parameters, all other settings will be same. Creating static files for each of these configurations is not an efficient solution. And It will take a lot more time and every time a new cluster is added you will have to add more files. This is where Ansible template modules come into play. A template in Ansible is a file which contains all your configuration parameters, but the dynamic values are given as variables. You can do much more than replacing the variables though, with the help of Jinj2 templating engine.
The template files will usually have the. In the following task. Double braces cover the variables. Note: If no file name is given in the destination parameter, and only the directory path, then the name of the file will be template file name.
It can be used to iteratively go through the values of a list, dictionary etc. In the following example, I am looping through the value 0 to 2 using the python range function.
On each iteration, a line with the variable is printed. But, in the above example, each iteration is printed on new lines. It is because it is retaining the whitespaces. But in some scenarios, we may want to remove the white spaces. So, how can we do that? For such scenarios, we can use the minus sign - to manually strip the whitespaces including newlines. This will remove the white spaces at the end of the block.
The resulting output shows all the variables on the same line. For more information on how to control the whitespaces checkout the jinja2 documentation. In the below task, I am looping over the list1 variable in the template, using the for loop structure.
Note that, after each iteration, a new line is also added. So the three list items will be in three lines. We are using the dictionary since the source and destination will be different for each template.
In the following example, I am rendering three templates, each with different source and destination. You might give a lot of comments in your code for clarity. You can also give the comments in the template file. This can be relative or absolute path.
Additional attributes of the template module There are other modules of template module which we can use to change some default behaviours force — If the destination file already exists, then this parameter decides whether it should be replaced or not.
So if there is any difference between the rendered source file and the destination file, destination file would be replaced. Mode — If you want to set the permissions for the destination file explicitly, then you can use this parameter. The backup file will be created every time there is a change in the destination directory.
A timestamp would be appended to the filename. It is possible to use this in ansible templates also using the jinja2 format. Now, let us see how to use ansible variables like list or dictionary in the templates files. Using list variables in Ansible templates In the below task, I am looping over the list1 variable in the template, using the for loop structure. Ansible template comment example You might give a lot of comments in your code for clarity.Mist, das klappt leider noch nicht!
Im Moment testen wir neue Funktionen und du hast uns mit deinem Klick geholfen. Vielen Dank! There have been posts about Ansible on this blog before, so this one will not go into Ansible basics again, but focus on ways to improve your use of variables, often, but not only used together with the template module, showing some of the more involved features its Jinja 2 -based implementation offers.
The examples are mostly taken right out of our Ansible provisioning for CenterDevice, with only slight adaptations for conciseness. The bare metal machines we use as the basis for our OpenStack infrastructure have different capabilities.
We use this information to set up host aggregates. For use in playbooks and in templates Ansible automatically puts it into the hostvars dictionary. Sometimes, though, just expanding pre-defined variables is not good enough. Running external programs via the shell and command modules often produces output and exit codes you may want to use in the subsequent flow of your playbook.
Knowing that mktemp prints the name of the created temp file to standard out lets us use it like so:. Often you are interested in the exit code of a command to base decisions on. If, for example, you grep for some search term, grep informs you via its exit code if it found the term or not:. This snipped uses gpg --list-keys and grep to check if the key is already known in the gpg keychain. Combined with the temporary file created shown earlier, the following snippet gracefully handles importing of the gpg key into the keychain on the target system if not present yet and to continue without interruption if it already is:.
Tasks other than command or shell also provide result output that can be registered into variables. See this example, where we set up several MySQL servers for replication automatically the roles come from host variables, set up in the inventory :. The values are then fed into the next task which configures the slave accordingly.
Server Fault is a question and answer site for system and network administrators. It only takes a minute to sign up. There's a unappreciated but very useful answer here which explains how to loop through the interface facts for an arbitrary number of interfaces.
This is fantastic, but I want to access the individual items of the interface information - such as the address, and the MTU. I can't work out how to extract these fields. I was expecting to use something like:.
But that produces an error when the template is filled. How do I address the sub-elements of the dictionary, please? I can probably set facts in a loop in the playbook, as debugging seems able to reference the sub-elements, but I'd rather keep everything in the template.
Further Update: I've had an epiphany: for some interfaces there is no address, so ipv4 does not exist. I'll find out how to limit to when the interface does have an address, and write an answer to my question. This works. NOTE that you can't have the condition check for a sub-element of in this case 'ipv4' like so:. Sign up to join this community.
The best answers are voted up and rise to the top. Home Questions Tags Users Unanswered. Ansible jinja2 template: How to loop through sub-elements of interface facts Ask Question. Asked 2 years ago. Active 2 years ago. Viewed 4k times.Jinja2 is a modern and designer-friendly templating language for Python frameworks. It is fast, reliable and widely used for dynamic file generation based on its parameter.
In this blog, I like to share how and where jinja2 template language used in Ansible and how we can create better Ansible playbook.
Variable definitions are needed for Jinja to resolve expressions. In Ansible, more then 21 places we can declare or define variable or value to the variable, below we have shared three important places:. Pass the path to a file containing variable definitions using the —vars-file option. The file path must be one of the following:. When —vars-file is passed, Ansible Container checks if the path is an absolute path to a file. If not, it checks for the file relative to the project path, which is the current working directory.
If the file is still not found, it looks for the file relative to the ansible folder within the project path. For example:. This templating will helpful for many automation. Basically, it will return the system stats and assigned it to respected variables. Auto generated variable definitions using the ansible stats system resources. Based on the condition it will revert the values for the respected variables.
Running a for-loop over a Jinja2 dictionary
When we have the variable definition ready we need to apply it for generating the configuration file with required fields. Above will have the condition mapping along with the variable precedence. If the condition matches it will return the values with respect to the resource or it will keep the default value. The above cnf was generated using the template.
I hope it will give you a better idea about templating using Jinja2. Experienced Database Administrator with a demonstrated history of working in the information technology and services industry.
View all posts by Dhanasekar Ravindran. You are commenting using your WordPress. You are commenting using your Google account. You are commenting using your Twitter account. You are commenting using your Facebook account. Notify me of new comments via email. Notify me of new posts via email. Skip to content. The file path must be one of the following: Absolute file path Relative to the project path Relative to the ansible folder When —vars-file is passed, Ansible Container checks if the path is an absolute path to a file.
For example: - hosts: Command to get complete stats about the system. Below is the sample yaml file which has the syntax and the variables. Playbook: - hosts: Key takeaways: Easy to debug.
Line numbers of exceptions directly point to the correct line in the template even with the column number. Configurable syntax with respected the yaml files.Sometimes you want to repeat a task multiple times. In computer programming, this is called a loop.
Repeated tasks can be written as standard loops over a simple list of strings. You can define the list directly in the task:. You can pass a list directly to a parameter for some plugins. Most of the packaging modules, like yum — Manages packages with the yum package manager and apt — Manages apt-packageshave this capability. When available, passing the list to a parameter is better than looping over the task. For example:. When combining Conditionals with a loop, the when: statement is processed separately for each item.
See The When Statement for examples. To loop over a dict, use the dict2items Dict Filter :. When you use register with a loop, the data structure placed in the variable will contain a results attribute that is a list of all responses from the module. This differs from the data structure returned when using register without a loop:.
You can use Jinja2 expressions to iterate over complex lists.
For example, a loop can combine nested lists:. You can use the until keyword to retry a task until a certain condition is met. This task runs up to 5 times with a delay of 10 seconds between each attempt. To see the results of individual retries, run the play with -vv. You must set the until parameter if you want a task to retry. If until is not defined, the value for the retries parameter is forced to 1. More information on the patterns can be found on Patterns: targeting hosts and groups.
The loop keyword requires a list as input, but the lookup keyword returns a string of comma-separated values by default. Ansible 2. When looping over complex data structures, the console output of your task can be enormous.
This is for making console output more readable, not protecting sensitive data. This directive specifies a variable name to contain the current loop index:.
However, by default Ansible sets the loop variable item for each loop. This means the inner, nested loop will overwrite the value of item from the outer loop. If Ansible detects that the current loop is using a variable which has already been defined, it will raise an error to fail the task. As of Ansible 2. This option will expose the following information. With the release of Ansible 2. In many cases, loop syntax is better expressed using filters instead of more complex use of query or lookup.
Note We added loop in Ansible 2. We are looking to improve loop syntax - watch this page and the changelog for updates. The loop keyword will not accept a string as input, see Ensuring list input for loop: query vs. You may need to use flatten 1 with loop to match the exact outcome.
Note You must set the until parameter if you want a task to retry. Ensuring list input for loop : query vs. Note This is for making console output more readable, not protecting sensitive data.