Forum: CFEngine Help
Subject: Re: /etc/resolv.conf: if updating, backup first
Author: zzamboni
Link to topic: https://cfengine.com/forum/read.php?3,23954,23957#msg-23957

Matt,

First, you can avoid the wait (which is cf-agent's default ifelapsed period 
between consecutive evaluations of the same promise) by using the -K option. 
This is useful in cases like this when you are testing.

I got similar results using your given example - CFEngine edits the file every 
time.

The problem is the way you are calling my_resolvconf. You have the following:

            edit_line     => my_resolvconf("${search}", "${nameservers}", 
"${commented}"),

Since you are making reference to the slist variables with scalar notation 
($(nameservers) instead of @(nameservers)), implicit looping is happening at 
this point. Effectively, you are calling my_resolvconf multiple times on each 
run, with all the different combinations of the list variables. Hence you get 
the weird and seemingly random changes.

The solution is to pass the whole lists into the bundle, and let implicit 
looping happen inside the bundle. This way the bundle gets called only one 
time, and it expand the lists into their values. So you need to change the 
edit_line line to this:

           edit_line     => my_resolvconf( "$(search)" ,  @(resolv.nameservers) 
, @(resolv.commented) ),

You can see here that we are expanding $(search) as before, but @nameservers 
and @commented are being passed as lists into the bundle (their names need to 
be fully qualified so that the bundle can expand them correctly). Now we get 
the desired behavior:

bash-3.2$ cat /tmp/resolv.conf
search mydomain.com
#nameserver 192.168.185.220
#nameserver 4.2.2.1
nameserver 192.168.184.7
nameserver 192.168.187.103
bash-3.2$ cf-agent -KI -f ./testresolv.cf
bash-3.2$ cf-agent -KI -f ./testresolv.cf
bash-3.2$ cf-agent -KI -f ./testresolv.cf


If you let CFEngine create the file from scratch, there's two steps to 
convergence, while CFEngine gets the order right, but after that there are no 
changes:

bash-3.2$ rm /tmp/resolv.conf*; touch /tmp/resolv.conf
bash-3.2$ cf-agent -KI -f ./testresolv.cf
 -> Edited file /tmp/resolv.conf
bash-3.2$ cat /tmp/resolv.conf
search mydomain.com
nameserver 192.168.184.7
nameserver 192.168.187.103
#nameserver 192.168.185.220
#nameserver 4.2.2.1
bash-3.2$ cf-agent -KI -f ./testresolv.cf
 -> Edited file /tmp/resolv.conf
bash-3.2$ cat /tmp/resolv.conf
search mydomain.com
#nameserver 192.168.185.220
#nameserver 4.2.2.1
nameserver 192.168.184.7
nameserver 192.168.187.103
bash-3.2$ cf-agent -KI -f ./testresolv.cf
bash-3.2$ cf-agent -KI -f ./testresolv.cf
bash-3.2$ cf-agent -KI -f ./testresolv.cf


Hope this helps.

_______________________________________________
Help-cfengine mailing list
Help-cfengine@cfengine.org
https://cfengine.org/mailman/listinfo/help-cfengine

Reply via email to