Error handling in playbooks — Ansible Documentation (2023)

'; */ // Create a banner if we're not on the official docs site if (location.host == "docs.testing.ansible.com") { document.write('

'); } // Create a banner current_url_path = window.location.pathname; var important = false; var msg = '

'; if (startsWith(current_url_path, "/ansible-core/")) { msg += 'You are reading documentation for Ansible Core, which contains no plugins except for those in ansible.builtin. For documentation of the Ansible package, go to the latest documentation.'; } else if (startsWithOneOf(current_url_path, ["/ansible/latest/", "/ansible/6/"])) { /* temp extra banner to advertise AnsibeFest2021 */ banner += extra_banner; msg += 'You are reading the latest (stable) community version of the Ansible documentation. If you are a Red Hat customer, refer to the Ansible Automation Platform Life Cycle page for subscription details.'; } else if (startsWith(current_url_path, "/ansible/2.9/")) { msg += 'You are reading the latest Red Hat released version of the Ansible documentation. Community users can use this version, or select latest from the version selector to the left for the most recent community version.'; } else if (startsWith(current_url_path, "/ansible/devel/")) { /* temp extra banner to advertise AnsibleFest2021 */ banner += extra_banner; /* temp banner to advertise survey important = true; msg += 'Please take our Docs survey before December 31 to help us improve Ansible documentation.'; */ msg += 'You are reading the devel version of the Ansible documentation - this version is not guaranteed stable. Use the version selection to the left if you want the latest (stable) released version.'; } else { msg += 'You are reading an older version of the Ansible documentation. Use the version selection to the left if you want the latest (stable) released version.'; } msg += '

'; banner += important ? '
' : ''; banner += msg; banner += important ? '
' : ''; banner += '

When Ansible receives a non-zero return code from a command or a failure from a module, by default it stops executing on that host and continues on other hosts. However, in some circumstances you may want different behavior. Sometimes a non-zero return code indicates success. Sometimes you want a failure on one host to stop execution on all hosts. Ansible provides tools and settings to handle these situations and help you get the behavior, output, and reporting you want.

  • Ignoring failed commands

  • Ignoring unreachable host errors

  • Resetting unreachable hosts

  • Handlers and failure

  • Defining failure

  • Defining “changed”

  • Ensuring success for command and shell

  • Aborting a play on all hosts

    • Aborting on the first error: any_errors_fatal

    • Setting a maximum failure percentage

  • Controlling errors in blocks

    (Video) Error Handling in Playbooks | Ansible tutorial

Ignoring failed commands

By default Ansible stops executing tasks on a host when a task fails on that host. You can use ignore_errors to continue on in spite of the failure.

- name: Do not count this as a failure ansible.builtin.command: /bin/false ignore_errors: yes

The ignore_errors directive only works when the task is able to run and returns a value of ‘failed’. It does not make Ansible ignore undefined variable errors, connection failures, execution issues (for example, missing packages), or syntax errors.

Ignoring unreachable host errors

New in version 2.7.

You can ignore a task failure due to the host instance being ‘UNREACHABLE’ with the ignore_unreachable keyword. Ansible ignores the task errors, but continues to execute future tasks against the unreachable host. For example, at the task level:

- name: This executes, fails, and the failure is ignored ansible.builtin.command: /bin/true ignore_unreachable: yes- name: This executes, fails, and ends the play for this host ansible.builtin.command: /bin/true

And at the playbook level:

- hosts: all ignore_unreachable: yes tasks: - name: This executes, fails, and the failure is ignored ansible.builtin.command: /bin/true - name: This executes, fails, and ends the play for this host ansible.builtin.command: /bin/true ignore_unreachable: no

Resetting unreachable hosts

If Ansible cannot connect to a host, it marks that host as ‘UNREACHABLE’ and removes it from the list of active hosts for the run. You can use meta: clear_host_errors to reactivate all hosts, so subsequent tasks can try to reach them again.

Handlers and failure

Ansible runs handlers at the end of each play. If a task notifies a handler butanother task fails later in the play, by default the handler does not run on that host,which may leave the host in an unexpected state. For example, a task could updatea configuration file and notify a handler to restart some service. If atask later in the same play fails, the configuration file might be changed butthe service will not be restarted.

You can change this behavior with the --force-handlers command-line option,by including force_handlers: True in a play, or by adding force_handlers = Trueto ansible.cfg. When handlers are forced, Ansible will run all notified handlers onall hosts, even hosts with failed tasks. (Note that certain errors could still preventthe handler from running, such as a host becoming unreachable.)

Defining failure

Ansible lets you define what “failure” means in each task using the failed_when conditional. As with all conditionals in Ansible, lists of multiple failed_when conditions are joined with an implicit and, meaning the task only fails when all conditions are met. If you want to trigger a failure when any of the conditions is met, you must define the conditions in a string with an explicit or operator.

You may check for failure by searching for a word or phrase in the output of a command

- name: Fail task when the command error output prints FAILED ansible.builtin.command: /usr/bin/example-command -x -y -z register: command_result failed_when: "'FAILED' in command_result.stderr"
(Video) Error handling in ansible playbook

or based on the return code

- name: Fail task when both files are identical ansible.builtin.raw: diff foo/file1 bar/file2 register: diff_cmd failed_when: diff_cmd.rc == 0 or diff_cmd.rc >= 2

You can also combine multiple conditions for failure. This task will fail if both conditions are true:

- name: Check if a file exists in temp and fail task if it does ansible.builtin.command: ls /tmp/this_should_not_be_here register: result failed_when: - result.rc == 0 - '"No such" not in result.stdout'

If you want the task to fail when only one condition is satisfied, change the failed_when definition to

failed_when: result.rc == 0 or "No such" not in result.stdout

If you have too many conditions to fit neatly into one line, you can split it into a multi-line YAML value with >.

- name: example of many failed_when conditions with OR ansible.builtin.shell: "./myBinary" register: ret failed_when: > ("No such file or directory" in ret.stdout) or (ret.stderr != '') or (ret.rc == 10)

Defining “changed”

Ansible lets you define when a particular task has “changed” a remote node using the changed_when conditional. This lets you determine, based on return codes or output, whether a change should be reported in Ansible statistics and whether a handler should be triggered or not. As with all conditionals in Ansible, lists of multiple changed_when conditions are joined with an implicit and, meaning the task only reports a change when all conditions are met. If you want to report a change when any of the conditions is met, you must define the conditions in a string with an explicit or operator. For example:

tasks: - name: Report 'changed' when the return code is not equal to 2 ansible.builtin.shell: /usr/bin/billybass --mode="take me to the river" register: bass_result changed_when: "bass_result.rc != 2" - name: This will never report 'changed' status ansible.builtin.shell: wall 'beep' changed_when: False

You can also combine multiple conditions to override “changed” result.

(Video) Automation with Ansible || Handling Errors (Live Demo)

- name: Combine multiple conditions to override 'changed' result ansible.builtin.command: /bin/fake_command register: result ignore_errors: True changed_when: - '"ERROR" in result.stderr' - result.rc == 2

Note

Just like when these two conditionals do not require templating delimiters ({{ }}) as they are implied.

See Defining failure for more conditional syntax examples.

Ensuring success for command and shell

The command and shell modules care about return codes, so if you have a command whose successful exit code is not zero, you can do this:

tasks: - name: Run this command and ignore the result ansible.builtin.shell: /usr/bin/somecommand || /bin/true

Aborting a play on all hosts

Sometimes you want a failure on a single host, or failures on a certain percentage of hosts, to abort the entire play on all hosts. You can stop play execution after the first failure happens with any_errors_fatal. For finer-grained control, you can use max_fail_percentage to abort the run after a given percentage of hosts has failed.

Aborting on the first error: any_errors_fatal

If you set any_errors_fatal and a task returns an error, Ansible finishes the fatal task on all hosts in the current batch, then stops executing the play on all hosts. Subsequent tasks and plays are not executed. You can recover from fatal errors by adding a rescue section to the block. You can set any_errors_fatal at the play or block level.

You can use this feature when all tasks must be 100% successful to continue playbook execution. For example, if you run a service on machines in multiple data centers with load balancers to pass traffic from users to the service, you want all load balancers to be disabled before you stop the service for maintenance. To ensure that any failure in the task that disables the load balancers will stop all other tasks:

---- hosts: load_balancers_dc_a any_errors_fatal: true tasks: - name: Shut down datacenter 'A' ansible.builtin.command: /usr/bin/disable-dc- hosts: frontends_dc_a tasks: - name: Stop service ansible.builtin.command: /usr/bin/stop-software - name: Update software ansible.builtin.command: /usr/bin/upgrade-software- hosts: load_balancers_dc_a tasks: - name: Start datacenter 'A' ansible.builtin.command: /usr/bin/enable-dc

In this example Ansible starts the software upgrade on the front ends only if all of the load balancers are successfully disabled.

(Video) 12. Ansible tutorial: error handling

Setting a maximum failure percentage

By default, Ansible continues to execute tasks as long as there are hosts that have not yet failed. In some situations, such as when executing a rolling update, you may want to abort the play when a certain threshold of failures has been reached. To achieve this, you can set a maximum failure percentage on a play:

---- hosts: webservers max_fail_percentage: 30 serial: 10

The max_fail_percentage setting applies to each batch when you use it with serial. In the example above, if more than 3 of the 10 servers in the first (or any) batch of servers failed, the rest of the play would be aborted.

Note

The percentage set must be exceeded, not equaled. For example, if serial were set to 4 and you wanted the task to abort the play when 2 of the systems failed, set the max_fail_percentage at 49 rather than 50.

Controlling errors in blocks

You can also use blocks to define responses to task errors. This approach is similar to exception handling in many programming languages. See Handling errors with blocks for details and examples.

See also

Intro to playbooks

An introduction to playbooks

Tips and tricks

Tips and tricks for playbooks

Conditionals

Conditional statements in playbooks

Using Variables

All about variables

User Mailing List

Have a question? Stop by the google group!

Real-time chat

How to join Ansible chat channels

FAQs

What happens when one task is failed in playbook? ›

Handlers and Failure

If a task later on in the same play fails, the service will not be restarted despite the configuration change. You can change this behavior with the --force-handlers command-line option, or by including force_handlers: True in a play, or force_handlers = True in ansible.

How do you execute a failed playbook again? ›

You can achieve similar effect by just using the --step flag e.g: ansible-playbook playbook. yml --step . The step asks you on before executing each task and you could choose (N)o/(y)es/(c)ontinue . With this approach you selectively execute tasks when needed and also continue from point where it failed, after fixes.

What is Changed_when in Ansible? ›

Ansible changed_when property or parameters is defined to deal with the output of the specific task once a task is triggered on the remote node and based on the return code or the output, we can determine whether the task should be reported in the ansible statistic or need to use the trigger to handle the condition and ...

How do I debug my playbook? ›

Playbook Debugger
  1. Using the debugger keyword. On a task. On a play.
  2. Configuration or environment variable.
  3. As a Strategy.
  4. Available Commands. p(print) task/task_vars/host/result. task.args[key] = value. task_vars[key] = value. u(pdate_task) r(edo) c(ontinue) q(uit)
  5. Use with the free strategy.
27 May 2022

What are the common playbook issues? ›

Common Playbook Issues

Playbook is written in yaml format and the above two are the most common issues in yaml/playbook. Yaml does not support tab based indentation and supports space based indentation, so one needs to be careful about the same.

Can we pass variables in playbook? ›

With Ansible, users have the flexibility to accept external input while executing their Ansible playbooks without changing the Ansible playbook content. This can be done via the ability to pass extra variables to an Ansible playbook. This feature is available when using the Ansible CLI or Ansible Tower.

How do I check my playbook syntax? ›

Use this command to check the playbook for syntax errors: $ ansible-playbook <playbook. yml> --syntax-check.

Can a playbook have multiple plays? ›

A Playbook can have multiple Plays and a Play can have one or multiple Tasks. In a Task a Module is called, like the Modules in the previous chapter. The goal of a Play is to map a group of hosts to a list of Tasks. The goal of a Task is to implement Modules against those hosts.

How do you handle long running tasks in Ansible? ›

For long running asynchronous tasks, it's good to set poll=0 so that Ansible can immediately jump to the next task after starting the current one without waiting for the result. Register: It is basically used to register the results on a task in a variable.

What is Idempotency in Ansible? ›

Idempotent: An action which, when performed multiple times, has no further effect on its subject after the first time it is performed. In simple words, it means that if any module runs the first time then it should not run again. This will save our CPU time. So, we need to have every module idempotent in nature.

What is chdir in Ansible? ›

Changing the Default Directory

You can change and specify the directory path where you want to run the command using the chdir parameter. This parameter is available for both command and shell module. You can also change the default shell by specifying the absolute path of the require shell in the executable parameter.

What is Group_vars and Host_vars in Ansible? ›

The host_vars is a similar folder to group_vars in the repository structure. It contains data models that apply to individual hosts/devices in the hosts. ini file. Hence, there is a YAML file created per device containing specific information about that device.

What is playbook format? ›

Playbooks are the files where Ansible code is written. Playbooks are written in YAML format. YAML stands for Yet Another Markup Language. Playbooks are one of the core features of Ansible and tell Ansible what to execute. They are like a to-do list for Ansible that contains a list of tasks.

What is a playbook document? ›

A business playbook (sometimes called a corporate playbook) houses all your company's processes, policies, and standard operating procedures (SOPs) in one place. And it outlines exactly how your business does what it does - down to each role, responsibility, business strategy, and differentiator.

What is debug in Ansible playbook? ›

Ansible offers a task debugger so you can fix errors during execution instead of editing your playbook and running it again to see if your change worked. You have access to all of the features of the debugger in the context of the task.

What is the difference between a playbook and a role? ›

Ansible playbook is a script file which contains all the tasks that need to be performed along with all the ingredients required to perform these tasks. Roles are ways of automatically certain var files, tasks, and handlers based on the known file structure.

How do I view Ansible logs? ›

Ansible doesn't create it's own logs by default - you have to tell it to do so, using an ansible. cfg file.
...
cfg files, in this order:
  1. ANSIBLE_CONFIG (an environment variable)
  2. ansible. cfg (in the current directory)
  3. . ansible. cfg (in the home directory)
  4. /etc/ansible/ansible. cfg.

Why do we need playbooks? ›

A playbook reflects a plan; an approach or strategy defining predetermined responses worked out ahead of time.” While you needn't expect your employees to channel Tom Brady and memorize the playbook, it is critical to have a playbook on hand for guidance.

Can we keep secret data in playbook? ›

Ansible Vault lets you keep sensitive data, such as passwords and keys, in encrypted files. Here's how to use it in playbooks to improve automation workflow safety. Ansible Vault is a feature in the Ansible automation engine that allows you to encrypt any data file.

What does {{ }} mean in Ansible? ›

Ansible uses the jinja2 template. the {{ }} are used to evaluate the expression inside them from the context passed. So {{ '{{' }} evaluates to the string {{ And the while expression {{ docroot }} is written to a template, where docroot could be another template variable.

How do I keep secret data in my playbook? ›

How do I keep secret data in my playbook? ¶ If you would like to keep secret data in your Ansible content and still share it publicly or keep things in source control, see Vault. This can be used to keep verbose output but hide sensitive information from others who would otherwise like to be able to see the output.

How do I test Ansible playbook locally? ›

There are four ways to run ansible playbook locally and we have listed them all here.
  1. Method1: Specify Localhost in your hosts directive of your playbook.
  2. Method2: Using local_action clause in the ansible playbook.
  3. Method3: Add an entry in your Inventory.
  4. Method4: Specify in the Ansible Command line.
1 Jan 2022

Which syntax is used to write Ansible playbooks? ›

This page provides a basic overview of correct YAML syntax, which is how Ansible playbooks (our configuration management language) are expressed. We use YAML because it is easier for humans to read and write than other common data formats like XML or JSON.

Can I run multiple Ansible playbooks in parallel? ›

Ansible is not designed to run multiple playbooks at the same time in one process - for example, because the tasks differ from playbook to playbook and there is no step "taskA" in playbook1 and playbook2 at the same time. You need to run every playbook in one separate process (like with ansible-playbook ... & ).

How do I combine playbooks? ›

you can run more playbooks using "ansible-playbook [OPTIONS] *. yml" command. This will execute all the playbooks NOT IN PARALLEL WAY, but in serial way, so first one playbook and after the execution, another playbook. This command can be helpful if you have many playbooks.

Where are Ansible playbooks stored? ›

By default, Ansible assumes your playbooks are stored in one directory with roles stored in a sub-directory called roles/ . As you use Ansible to automate more tasks, you may want to move your playbooks into a sub-directory called playbooks/ .

How do you handle fatal errors in Ansible? ›

If you set any_errors_fatal and a task returns an error, Ansible finishes the fatal task on all hosts in the current batch, then stops executing the play on all hosts. Subsequent tasks and plays are not executed. You can recover from fatal errors by adding a rescue section to the block.

How do I speed up Ansible execution? ›

8 ways to speed up your Ansible playbooks
  1. Identify slow tasks with callback plugins. ...
  2. Disable fact gathering. ...
  3. Configure parallelism. ...
  4. Configure SSH optimization. ...
  5. Disable host key checking in a dynamic environment. ...
  6. Use pipelining. ...
  7. Use execution strategies. ...
  8. Use async tasks.
26 Jan 2022

How many nodes can Ansible manage? ›

Ansible Tower offers free for handling up to 10 nodes. Anything more than that might require a paid license. Ansible Tower provides a neat graphical user interface with a dashboard using which one can group the hosts, variables, jobs, etc. Ansible AWX is free i.e an open source upstream project for Ansible Tower.

Why delete is idempotent? ›

Saying that Delete is idempotent means that if you invoque DELETE /team/1 several time the state of the system stay unchanged (in fact the first call DELETE /team/1 delete the team. In other words, delete is idempotent because duplicated call let the state of system unchanged.

Why is rest idempotent? ›

From a RESTful service standpoint, for an operation (or service call) to be idempotent, clients can make that same call repeatedly while producing the same result. In other words, making multiple identical requests has the same effect as making a single request.

Which REST calls are idempotent? ›

GET , PUT , DELETE , HEAD , OPTIONS and TRACE are idempotent.

Is chdir and cd same? ›

The cd command, also known as chdir (change directory), is a command-line shell command used to change the current working directory in various operating systems. It can be used in shell scripts and batch files.

What is Getcwd ()? ›

The getcwd() function returns the current working directory.

How do I check my ping in Ansible? ›

The simplest way to run the Ansible ping module is to run a simple AD HOC command in the terminal. The above command starts by calling Ansible, followed by the specific pattern of the host. In this case, we want to ping 'all' hosts. The next part, '-m,' specifies the module that we want to use.

What is the difference between Include_task and Import_task `? ›

include_tasks : Includes a file with a list of tasks to be executed in the current playbook. import_tasks : Imports a list of tasks to be added to the current playbook for subsequent execution.

How many types of variables are there in Ansible? ›

Scoping variables

Ansible has three main scopes: Global: this is set by config, environment variables and the command line. Play: each play and contained structures, vars entries (vars; vars_files; vars_prompt), role defaults and vars.

What is localhost in Ansible? ›

This ensures that the proper connection and Python are used to execute your tasks locally. You can override the built-in implicit version by creating a localhost host entry in your inventory. At that point, all implicit behaviors are ignored; the localhost in inventory is treated just like any other host.

What is basic syntax of Ansible? ›

Ansible uses YAML syntax for expressing Ansible playbooks. This chapter provides an overview of YAML. Ansible uses YAML because it is very easy for humans to understand, read and write when compared to other data formats like XML and JSON.

What language is used in Ansible? ›

Ansible

What size is a playbook? ›

It measures 335 x 240 mm making it ideal for larger works. Each page is ruled on 1 side and blank on the other.

What is the difference between a playbook and a run book? ›

Playbooks versus runbooks

A playbook is a unique overarching set of guides that an organization has prepared and compiled for its teams. In contrast, a runbook is a specific outline for helping with a task, bridging the differences in staff skill sets.

What is inside a playbook? ›

A playbook is composed of one or more 'plays' in an ordered list. The terms 'playbook' and 'play' are sports analogies. Each play executes part of the overall goal of the playbook, running one or more tasks.

What is verbose Ansible? ›

One of the first options anyone picks up is the debug option. To understand what is happening when you run the playbook, you can run it with the verbose ( -v ) option. Every extra v will provide the end user with more debug output.

Why is Ansible playbook skipping tasks? ›

Ansible runs or skips all tasks with tags that match the tags you pass at the command line. If you have added a tag at the block or play level, with roles , or with an import, that tag applies to every task within the block, play, role, or imported role or file.

Can we debug shell script? ›

The debugging options available in the Bash shell can be switched on and off in multiple ways. Within scripts, we can either use the set command or add an option to the shebang line. However, another approach is to explicitly specify the debugging options in the command-line while executing the script.

What will happen when a running task fails in Hadoop? ›

If a task is failed, Hadoop will detects failed tasks and reschedules replacements on machines that are healthy. It will terminate the task only if the task fails more than four times which is default setting that can be changes it kill terminate the job. to complete.

What does task failed successfully mean? ›

Idiom: Task failed successfully Meaning: A task that was not completed successfully, but the failure was not due to the person's lack of effort. 7:19 AM · Aug 3, 2020 ·Twitter Web App. 1.

How do you retry a failed task in Airflow? ›

Rerunning tasks or full DAGs in Airflow is a common workflow. To rerun a task in Airflow you clear the task status to update the max_tries and current task instance state values in the metastore. After the task reruns, the max_tries value updates to 0 , and the current task instance state updates to None .

How do you run or skip specific tasks in playbook? ›

The easiest way to run only one task in Ansible Playbook is using the tags statement parameter of the “ansible-playbook” command. The default behavior is to execute all the tags in your Playbook with --tags all .

What happens if the Namenode crashes? ›

If Namenode gets down then the whole Hadoop cluster is inaccessible and considered dead. Datanode stores actual data and works as instructed by Namenode. A Hadoop file system can have multiple data nodes but only one active Namenode.

What happens if the Namenode fails? ›

Whenever the active NameNode fails, the passive NameNode or the standby NameNode replaces the active NameNode, to ensure that the Hadoop cluster is never without a NameNode. The passive NameNode takes over the responsibility of the failed NameNode and keep the HDFS up and running.

What are the three running modes of Hadoop? ›

Hadoop Mainly works on 3 different Modes:

Standalone Mode. Pseudo-distributed Mode. Fully-Distributed Mode.

How do you troubleshoot a task? ›

Troubleshooting Tasks
  1. Step 1: Verify the Task Did Not Run.
  2. Step 2: Verify the Task was Resumed.
  3. Step 3: Verify the Permissions Granted to the Task Owner.
  4. Step 4: Verify the Condition.

How do you handle a failed project? ›

How To Get A Project Back On Track
  1. Step 1: Swallow Your Pride & Halt Proceedings. ...
  2. Step 2: Analyze The Underlying Issues. ...
  3. Step 3: Call A Meeting With All Affected Parties. ...
  4. Step 4: Work Together To Decide Whether The Project Is Worth Saving. ...
  5. Step 5: Assign New Tasks & Improve Morale. ...
  6. Step 6: Monitor The Situation Regularly.
22 Mar 2021

How do you process a failure? ›

Top tips for coping with failure
  1. Give yourself permission to feel. ...
  2. Practise self-compassion. ...
  3. Reflect on the experience and adopt a growth mindset. ...
  4. Revisit your goals and create a plan for the future.

How many tasks can you execute in parallel in Airflow? ›

Apache Airflow's capability to run parallel tasks, ensured by using Kubernetes and CeleryExecutor, allows you to save a lot of time. You can use it to execute even 1000 parallel tasks in only 5 minutes.

How do you increase Airflow exception? ›

Raise when creating a DAG run for DAG which already has DAG run entry. Raise when a DAG ID is still in DagBag i.e., DAG file is in DAG folder. Raise when a Task with duplicate task_id is defined in the same DAG. Raise when a Task cannot be added to a TaskGroup since it already belongs to another TaskGroup.

How do you pass data between tasks in Airflow? ›

The first method for passing data between Airflow tasks is to use XCom, which is a key Airflow feature for sharing task data.
...
The limit for the size of the XCom is determined by which metadata database you are using:
  1. Postgres: 1 Gb.
  2. SQLite: 2 Gb.
  3. MySQL: 64 Kb.

Videos

1. Ansible troubleshooting - Syntax Error
(Ansible Pilot)
2. Ansible blocks
(Robert de Bock)
3. Avoiding common mistakes in your Ansible playbooks
(Red Hat Ansible Automation)
4. Ansible Handlers Tutorial | Ansible Notify And Handler
(Thetips4you)
5. Managing Task Failures in Ansible | #Ansible #FullCourse #Ansibleforbeginners | techbeatly
(techbeatly)
6. Ansible 101 - Episode 5 - Playbook handlers, environment vars, and variables
(Jeff Geerling)
Top Articles
Latest Posts
Article information

Author: Gregorio Kreiger

Last Updated: 01/01/2023

Views: 5640

Rating: 4.7 / 5 (77 voted)

Reviews: 84% of readers found this page helpful

Author information

Name: Gregorio Kreiger

Birthday: 1994-12-18

Address: 89212 Tracey Ramp, Sunside, MT 08453-0951

Phone: +9014805370218

Job: Customer Designer

Hobby: Mountain biking, Orienteering, Hiking, Sewing, Backpacking, Mushroom hunting, Backpacking

Introduction: My name is Gregorio Kreiger, I am a tender, brainy, enthusiastic, combative, agreeable, gentle, gentle person who loves writing and wants to share my knowledge and understanding with you.