Use o atributo audit para rastrear o conteúdo do arquivo ou o número da versão do pacote e acionar a alteração assinando o recurso do pacote. Alguns problemas com isso, isso não funciona com --noop porque o arquivo state.yaml atualizará o arquivo md5 checksum / versão do pacote no modo --noop. Não tenho certeza se isso é um bug pendente, pois não posso rastreá-lo no momento.
file { '/etc/tzinfo':
audit => content,
}
exec { '/usr/bin/mysql_tzinfo_to_sql':
subscribe => File['/etc/tzinfo'],
}
Um método mais confiável é apenas duplicar o arquivo em outro lugar e usá-lo para acionar atualizações (o local não é importante, estamos apenas acompanhando o tzinfo original como fonte).
file { '/etc/puppet/stage/tzinfo':
source => '/etc/tzinfo',
}
exec { '/usr/bin/mysql_tzinfo_to_sql':
subscribe => File['/etc/tzinfo'],
}
O segundo método, claro, não funciona com pacotes, mas você evitaria os problemas --noop e state.yaml.
Em relação à terceira questão, sim, você pode usar pipe e redirecionamentos (use um título e coloque o comando no atributo de comando):
exec {
'/bin/echo foo | grep foo > /tmp/foo':
}