{"record":{"id":"51e8ee667df9e13b","repo":"puppetlabs/puppet","slug":"could-not-find-value-for-expression","errorCode":null,"errorMessage":"Could not find value for %{expression}","messagePattern":"Could not find value for %(.+?)","errorType":"exception","errorClass":"Puppet::Settings::InterpolationError","httpStatus":null,"severity":"error","filePath":"lib/puppet/settings.rb","lineNumber":1524,"sourceCode":"\n    def convert(value, setting_name)\n      case value\n      when nil\n        nil\n      when String\n        failed_environment_interpolation = false\n        interpolated_value = value.gsub(/\\$(\\w+)|\\$\\{(\\w+)\\}/) do |expression|\n          varname = ::Regexp.last_match(2) || ::Regexp.last_match(1)\n          interpolated_expression =\n            if varname != ENVIRONMENT_SETTING || ok_to_interpolate_environment(setting_name)\n              if varname == ENVIRONMENT_SETTING && @environment\n                @environment\n              elsif varname == \"run_mode\"\n                @mode\n              elsif !(pval = interpolate(varname.to_sym)).nil?\n                pval\n              else\n                raise InterpolationError, _(\"Could not find value for %{expression}\") % { expression: expression }\n              end\n            else\n              failed_environment_interpolation = true\n              expression\n            end\n          interpolated_expression\n        end\n        if failed_environment_interpolation\n          # TRANSLATORS '$environment' is a Puppet specific variable and should not be translated\n          Puppet.warning(_(\"You cannot interpolate $environment within '%{setting_name}' when using directory environments.\") % { setting_name: setting_name } +\n                             ' ' + _(\"Its value will remain %{value}.\") % { value: interpolated_value })\n        end\n        interpolated_value\n      else\n        value\n      end\n    end\n","sourceCodeStart":1506,"sourceCodeEnd":1542,"githubUrl":"https://github.com/puppetlabs/puppet/blob/e227c27540975c25aa22d533a52424a9d2fc886a/lib/puppet/settings.rb#L1506-L1542","documentation":"Puppet::Settings::ValuesFromSection#convert expands $name and ${name} tokens inside String setting values via gsub. After handling the environment special-case (only interpolatable where allowed) and run_mode, any other name is resolved with interpolate(varname.to_sym); when that returns nil, Puppet::Settings::InterpolationError 'Could not find value for $x' is raised. Variable names are restricted to word characters (\\w+), so ::-qualified or dashed names can never resolve.","triggerScenarios":"puppet.conf values like `certdir = $confdirf/ssl` (typo), `basemodulepath = $progdir:...` (setting does not exist), or referencing a setting removed in the current Puppet version; a ${vardir} token in a setting defined later or never defined; environment-variable-style names that were never Puppet settings.","commonSituations":"Hand-edited or templated puppet.conf with stale variable names; upgrading Puppet where a setting was removed/renamed and old configs still interpolate it; copying snippet configs from tutorials that assume settings the deployment never declared.","solutions":["Check the exact token from the message against `puppet config print` output to see if such a setting exists; fix typos.","Declare the missing setting in the appropriate section, or replace the token with the literal value.","Use only single-word setting names in interpolation ($name or ${name}); names with ::, dots, or dashes are invalid here by construction."],"exampleFix":"# before (puppet.conf)\n[main]\ncertdir = $ssldirf/certs\n\n# after\n[main]\ncertdir = $ssldir/certs","handlingStrategy":"validation","validationCode":"tokens = value.scan(/\\$(?:\\{(\\w+)\\}|(\\w+))/).flatten.compact\ntokens.each do |name|\n  next if name == 'environment' || name == 'run_mode'\n  raise Puppet::Error, \"unknown interpolation target $#{name}\" if Puppet.settings.setting(name.to_sym).nil?\nend","typeGuard":"resolvable_tokens = ->(v) { v.scan(/\\$(?:\\{(\\w+)\\}|(\\w+))/).flatten.compact.all? { |n| %w[environment run_mode].include?(n) || !Puppet.settings.setting(n.to_sym).nil? } }","tryCatchPattern":"begin\n  converted = Puppet.settings[:mysetting]\nrescue Puppet::Settings::InterpolationError => e\n  raise unless e.message.include?('Could not find value for')\n  Puppet.err(\"#{e.message} — declare the setting or fix the typo\")\n  raise\nend","preventionTips":["Interpolate only single-word ($name / ${name}) references to settings you know exist","Names with :: or dashes are never resolvable in settings interpolation","Check `puppet config print` for the canonical setting name before referencing it"],"tags":["puppet","settings","interpolation","undefined-variable"],"backgroundTag":"undefined-variable-interpolation","analyzedSha":"e227c27540975c25aa22d533a52424a9d2fc886a","analyzedAt":"2026-08-21T20:49:46.650Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}