Depending on how complex the hosts file needs to be, what LenR may be best or I have sometimes also approached this kind of issue by using parameterized classes can work well too. You can use a define classname ($variables_to_pass_to_template) { } and then you don't have to work with ERB-type conditionals. Its a matter of preference in my opinion. So it would do something like this:
define location-based-hosts ($my_specific_hosts) {
file { "etc/hosts":
ensure => present,
content => template("puppet:///hosts/hosts_template.erb"),
}
}
Then call it with:
hosts::location-based-hosts { "us-west":
my_specific_hosts => "list of the important host entries",
}
And finally, in the hosts_template.erb:
127.0.0.1 localhost
<%= my_specific_hosts %>
The syntax should be good but I may have missed something. Again its all matter of preference but I have all my templates set up this way, that way my templates look as close to the end file as possible and all the "magic" happens in my manifests.