On Wednesday, October 19, 2016 at 4:51:20 PM UTC-5, re-g...@wiu.edu wrote:
>
>
>
> On Tuesday, October 18, 2016 at 9:49:23 AM UTC-5, jcbollinger wrote:
>>
>>
>>
>> On Monday, October 17, 2016 at 3:15:51 PM UTC-5, re-g...@wiu.edu wrote:
>>>
>>>
>>>
>>> On Friday, October 14, 2016 at 5:08:31 PM UTC-5, re-g...@wiu.edu wrote:
>>>>
>>>>
>>>>
>>>> On Thursday, October 13, 2016 at 9:15:58 AM UTC-5, Rob Nelson wrote:
>>>>>
>>>>> I've worked with saz in the past and believe he would be very 
>>>>> receptive to PRs that address this issue, as well, if RG or anyone else 
>>>>> wanted to contribute them. That would be one of the better solutions to 
>>>>> the 
>>>>> problem.
>>>>>
>>>>> Rob Nelson
>>>>> rnel...@gmail.com
>>>>>
>>>>>
>>>>> I think I've given you a pretty good handle on the nature of the 
>>>>>> problem, and I'm inclined to think that a solution that addresses the 
>>>>>> problem at its root will take care of the whole suite of issues.
>>>>>>
>>>>>
>>>> Lots and lots of thanks to jcbollinger.
>>>> Here is what I have done as a result of this thread:
>>>>
>>>> Submitted an issue with saz-rsyslog:
>>>> Duplicate Declaration Class[Rsyslog] with The Foreman as ENC during 
>>>> catalog compilation #237
>>>> https://github.com/saz/puppet-rsyslog/issues/237
>>>>
>>>> Posted a follow-up question to a related thread on The Foreman mail 
>>>> list to determine if The Foreman also may be exhibiting a bug, or if the 
>>>> issue may be my configuration:
>>>> Duplicate declaration error.
>>>> https://groups.google.com/d/topic/foreman-users/k0JgABtszdU/discussion 
>>>>   (my post is waiting for approval as of 22:00 GMT 10/14/2016)
>>>>
>>>> My current thought at this time is two points:
>>>> 1. saz-rsyslog is written in such a way that declaring a subclass 
>>>> before the parent class causes duplicate declaration errors - but I am 
>>>> told 
>>>> the module inheritance should be addressed, and would resolve this issue.
>>>> 2. The Foreman, under undetermined circumstances (maybe my 
>>>> misconfiguration), will randomly declare parent classes and subclass out 
>>>> of 
>>>> order - but I am told this is not an issue with puppet modules that use 
>>>> inheritance correctly - thus there might be an underlying bug with The 
>>>> Foreman because this error will not appear under modules' expected 
>>>> inheritance.
>>>>
>>>>
>>> This is what was posted on The Foreman mail list group:
>>> https://groups.google.com/d/topic/foreman-users/k0JgABtszdU/discussion
>>>
>>>> This is an issue with the format of the ENC YAML used between Foreman 
>>>> and Puppet, and is best fixed in the module. 
>>>> The list of classes is given as a hash/dictionary and so has no 
>>>> particular order defined - it's down to the Puppet master/server to 
>>>> iterate over it, and it probably does so in no particular order. It 
>>>> isn't under Foreman's control.
>>>
>>>
>>> I now believe this is truly the root of my problem. 
>>>
>>> The evidence is looking at the ENC output and the Puppet-generated 
>>> Catalog file on each of the master puppet servers.
>>> As you can see below, the puppet-generated catalog on the 
>>> secondary-master puppet server has put rsyslog::client before rsyslog - 
>>> this causes the failure.
>>> However, The Foreman ENC output is the same on both primary and 
>>> secondary master puppet servers.
>>>
>>>
>>
>> You have taken a step backward there.  I remind you that duplicate 
>> declaration errors occur *during catalog building*, and that catalog 
>> building fails if one occurs.  It is therefore impossible to compare a 
>> catalog from the failure case to a catalog from the success case, because 
>> no catalog is ever created in the failure case.
>>
>>
> Then I was mistaken in thinking that the node file 
> (/var/lib/puppet/yaml/node/server1.mydomain.example.com.yaml) was the data 
> (catalog pre-data) written to a file before the catalog compilation 
> procedure.
>


But you said you were looking at the *catalog* not "catalog pre-data". I'm 
sure you appreciate the tremendous difference between those.

 

> I assumed this because both the foreman and node files are created new 
> every time server1 performs a puppet agent update, even when the result is 
> a 400 error for the catalog compilation.
> If I am mistaken in this, then I need someone to tell me how to get the 
> data of the catalog that is failing to be compiled, so that I can compare 
> it with other sources.
>
> Here is the procedure I have been assuming (I am not an expert on puppet 
> internals):
> 1. (server1)puppet-agent -> puppet-master
> 2. puppet-master -> (exec)puppet[external_nodes] 
> server1.mydomain.example.com -> foreman ENC
> 3. foreman ENC -> 
> /var/lib/puppet/yaml/foreman/server1.mydomain.example.com.yaml -> 
> puppet-master
> 4. puppet-master 
> -> /var/lib/puppet/yaml/node/server1.mydomain.example.com.yaml -> 
> puppet-master(compile-catalog)
> 5. puppet-master(compile-catalog) -> Error -> 400 Server Error -> 
> (server1)puppet-agent
>
> I was assuming the node file is the data of the catalog to be compiled. I 
> had noticed it is updated in every puppet agent run, even when the run is 
> in error. And it was the differing piece between primary and secondary 
> puppet masters.
> Please correct me.
>


The YAML files in question are just byproducts of catalog building, not, as 
I understand it, intermediate files in the catalog-building process.  In 
any event, an ENC certainly delivers its results to Puppet via its standard 
output, not by writing them to a regular file.  Nor would I expect any ENC 
to create or update files under /var/lib/puppet in any case.

 

> Please let me know how to get the data of the catalog the puppet master is 
> failing to compile for the puppet agent.
>


If you are not assigning any classes or resources directly via a site 
manifest, and you are not using Hiera or any other form of external data 
besides variables assigned via Foreman, then the facts reported by the 
node, the ENC output for that node, and the master's standard top-scope 
variables together constitute the data from which catalog building 
proceeds.  It is possible, however, for evaluation of specific manifests to 
result in arbitrary data being gleaned from the catalog-building 
environment by use of Puppet functions, such as generate(), which can run 
an external command, and template() / inline_template(), which can run 
arbitrary Ruby code.

You can get the latest facts reported by a given node via the 'puppet facts 
find <node_certname>' command on the master.  If you're using puppetdb, 
then you can get them from there, too.

 

>  
>
>>  
>>
>>> Is this correct, that the yaml file in /var/lib/puppet/yaml/node/ is 
>>> exclusively generated by Puppet based on the ENC yaml?
>>> If this is correct, then this is the root of the problem.
>>>
>>
>>
>> I'm not sure what significance you're attributing to those particular 
>> files, but it's probably the wrong significance.  Yes, to the best of my 
>> knowledge and understanding, Puppet generates those files based on the 
>> node's certificate and facts, and the associated ENC output (if any).  But 
>> no, there is no reason to think that the root of your problem lies here.
>>
>>
> As I said earlier, I now assume I misunderstood this as being the file 
> holding the data to be compiled as the catalog.
> I apologize for the misunderstanding, but that I intended it as the "root" 
> of the catalog-compilation "problem". You are right that it is not the root 
> of the entire underlying problem.
> Again, I need help to find the catalog data trying to be compiled, but 
> which fails, if this /.../node/.. file is not that data.
>


The starting point for classes to be applied is the combination of ENC 
output with the site manifest.  I cannot speak to what may be in your site 
manifest.  What file or files constitute your site manifest depends on your 
Puppet configuration.  Some of the more likely possibilities are '<puppet 
root>/manifests/site.pp', '<puppet 
root>/environments/production/manifests/site.pp', or jointly all files of 
the form '<puppet root>/environments/production/manifests/*.pp'.  Within 
the site manifest, declarations at top scope and within the node block best 
matching the target machine (if any match at all) are relevant.

 

>  
>>
>>> Is there a configuration issue causing this issue? Where would I begin 
>>> looking for something that may be causing this puppet-catalog problem?
>>>
>>
>>
>> There is an unsupported-use-of-module issue ultimately causing all your 
>> problems, as I have been saying since the beginning.  It would be best to 
>> solve *that* problem, either by choosing a different module or by 
>> restricting yourself to supported uses of the module you have chosen (e.g. 
>> by using automated data binding to assign values to class parameters).
>>
>>
> "restricting yourself to supported uses of the module"
> So using The Foreman as ENC has not been an official tested use of the 
> module and thus is not supported? This is true for all modules on forge I 
> have reviewed, except for the ones published by The Foreman group.
> To be supported, should I instead restrict my use of either declaring my 
> classes in a site.pp or use hiera?
>


Puppet supports declaring classes via an ENC generally.  Inasmuch as its 
implementation violates the DSL's documented constraints, however, the '
rsyslog::client' class is not supported at all in the sense of the term I 
was using.

Since avoiding that class is not a viable solution (unless by choosing an 
altogether different module), the next best thing would be to stick to uses 
that are well known to work despite not actually being supported -- in this 
case, that would be to avoid using (the ENC analog of) a resource-like 
declaration for the base class, rsyslog.  You have exactly one option for 
customizing that class's parameters without modifying it or using a 
resource-like declaration: automated data binding.

 

>
> "using automated data binding to assign values to class parameters"
> What is automated data binding? Is that what I get when using hiera?
>


It is documented here: 
https://docs.puppet.com/hiera/3.2/puppet.html#automatic-parameter-lookup.  
It is based on Hiera, but it would not be quite correct to say it's "what I 
get when using hiera", because Hiera supports other uses as well.

 

> Would that mean I would forgo the use of The Forman to instead use hiera?
>


It would mean that you forgo using The Foreman for setting the parameters 
of class rsyslog, at least for those nodes to which you also assign another 
class from the same module, such as rsyslog::client.  You should otherwise 
be able to continue using The Foreman as you currently do.

 

> I have been assuming hiera was relatively the same as using The Foreman as 
> ENC? Reference: 
> https://ask.puppet.com/question/527/are-hiera-and-foreman-parameters-mutually-exclusive/
>  
> <https://www.google.com/url?q=https%3A%2F%2Fask.puppet.com%2Fquestion%2F527%2Fare-hiera-and-foreman-parameters-mutually-exclusive%2F&sa=D&sntz=1&usg=AFQjCNFi7mdJ0ZSw80VSK1NGgNAFWZuVTA>
>  
>


No, they are not the same thing at all, though they can serve many of the 
same purposes (and the answer you linked says pretty much the same thing).  
Hiera is not an ENC, and Puppet does not use it in the same way or via the 
same interface that it uses an ENC.  Binding values to class parameters via 
(hiera-supported) automatic data binding has different semantics than does 
binding parameter values via an ENC.  From a Foreman perspective, you might 
view automated data binding as affecting the default values for class 
parameters.

 

> I am grasping at straws. I have been assuming what I can find different 
> between the servers would reveal the issue.
>


Indeed, the problems are mysterious, and it is entirely reasonable to 
suppose that differing behavior arises from discoverable differences 
between machines.  Myself, I had high hopes for an explanation in terms of 
differing versions of Ruby.  I guess there's still a chance that a 
difference in the installed Ruby modules might factor in.  And I wasn't 
kidding when I suggested replacing the machine on which the misbehavior is 
observed with a clone of one of those that behave as you want.

However, I also hold out some suspicion that the problem may not be in the 
machine at all, but rather in the inputs (ENC output varying over time; 
differences in other parts of the ENC output; node facts).  Or the 
difference may be in the dynamic operating environment, including Puppet 
runtime state.  I'm not sure how to test that directly, but it might be 
interesting to swap masters to see whether the problem sticks with the 
machine or with the workload.

 

> I guess I need someone to tell me that if a puppet module is having the 
> issue we describe in this thread, that due to the intended and expected 
> nature of some function/process "X" in The Foreman or Puppet, I can expect 
> to see the module's inheritance issue cause catalog-compilation errors at 
> random times.
>
>  

> Example: it was suggested that the hash keys are not always ordered the 
> same. So due to python sometimes ordering the hash keys differently, a 
> module with inheritance issues like saz-rsyslog will sometimes cause a 
> catalog compilation error, and sometimes not be an issue. This means Puppet 
> expects modules to not have an inheritance issue like we are describing in 
> order to guarantee there will not be issues during deployment, like in my 
> case.
>


Well, the problem with hashes is that hash iteration order is not 
necessarily predictable in advance.  However, given the same hash 
implementation, initialized the same way, and subjected to the same 
sequence of additions and removals, you should see the same iteration order 
on every trial.  On the other hand, if the sequence of additions and 
removals changes, and especially if more, fewer, or different keys are 
added in different trials, then you cannot rely on iteration order to be 
consistent, even in part.  That's one reason why I earlier pointed out that 
the problem does not have to be in the portion of the ENC output that 
pertains directly to the rsyslog classes.

So no, I cannot tell you that with everything remaining the same, you 
should expect that Puppet's catalog building behavior might vary from run 
to run.  Quite the opposite.  But on the other hand, you can never have 
*everything* exactly the same.

I sympathize with you in your difficulty discovering the specific 
difference(s) that explain the variation in outcome, and some of my 
suggestions have been aimed at helping you there.  But you should not 
assume that figuring it out will lead you to a solution you like better 
than those I have proposed.  It might do.  It also might not.  And I cannot 
evaluate for you whether it's worthwhile to keep looking.


John

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to puppet-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/puppet-users/f5e35c10-df99-4f38-8a89-d71b925a2cad%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to