---
title: User Input
layout: default
---

User input can be required in a task or during configuration:

```ruby
# used in a configuration
ask(:database_name, "default_database_name")

# used in a task
desc "Ask about breakfast"
task :breakfast do
  ask(:breakfast, "pancakes")
  on roles(:all) do |h|
    execute "echo \"$(whoami) wants #{fetch(:breakfast)} for breakfast!\""
  end
end
```

When using `ask` to get user input, you can pass `echo: false` to prevent the
input from being displayed. This option should be used to ask the user for
passwords and other sensitive data during a deploy run.

```ruby
ask(:database_password, 'default_password', echo: false)
```


The symbol passed as a parameter will be printed as text for the user and the
input will be saved to this variable:

```ruby
ask(:database_encoding, 'UTF-8')
# Please enter :database_encoding (UTF-8):

fetch(:database_encoding)
# => contains the user input (or the default)
#    once the above line got executed
```


You can use `ask` to set a server- or role-specific configuration variable.

```ruby
ask(:password, nil)
server 'example.com', user: 'ssh_user_name', port: 22, password: fetch(:password), roles: %w{web app db}
```


You can also show your own message by using `prompt` option:

```ruby
  ask(:breakfast, "pancakes", prompt: "What's for breakfast?")
```

**Important!** `ask` will not prompt the user immediately. The question is
deferred until the first time `fetch` is used to obtain the setting. That means
you can `ask` for many variables, but only the variables used by your task(s)
will actually prompt the user for input.
