Perl 6 - the future is here, just unevenly distributed

IRC log for #salt, 2018-01-30

| Channels | #salt index | Today | | Search | Google Search | Plain-Text | summary

All times shown according to UTC.

Time Nick Message
00:00 saltslackbridge joined #salt
00:03 tiwula joined #salt
00:08 jas02 joined #salt
00:25 zerocoolback joined #salt
00:45 Bryson joined #salt
00:45 tiwula joined #salt
00:48 nona joined #salt
01:00 sh123124213 joined #salt
01:02 jas02 joined #salt
01:11 shiranaihito joined #salt
01:17 tiwula joined #salt
01:26 ahrs joined #salt
01:41 jas02 joined #salt
01:42 onlyanegg joined #salt
01:43 tiwula joined #salt
01:59 Seanobi joined #salt
01:59 Seanobi left #salt
02:02 mntnman joined #salt
02:02 nomeeed joined #salt
02:04 mntnman left #salt
02:07 tiwula joined #salt
02:08 cyteen_ joined #salt
02:13 sh123124213 joined #salt
02:29 schemanic joined #salt
02:38 schemanic Hello, does anyone use salt-formula at all? I'm trying to get mine functions working but the formula doesn't seem to want to  put mine_functions defs anywhere onto my minions.
02:56 jas02 joined #salt
02:56 kojiro joined #salt
02:58 ilbot3 joined #salt
02:58 Topic for #salt is now Welcome to #salt! <+> Latest Versions: 2016.11.8, 2017.7.2 <+> Support: https://www.saltstack.com/support/ <+> Logs: http://irclog.perlgeek.de/salt/ <+> Paste: https://gist.github.com/ <+> See also: #salt-devel, #salt-offtopic, and https://saltstackcommunity.herokuapp.com (for slack) <+> We are volunteers and may not have immediate answers
02:58 kojiro I realize that dnsutil.A returns a list of results, and I only want the first one, but I can't even get that far
02:59 kojiro I'd expect {{fqdns | map(salt['dnsutil.A']) | map(first) }} to do what I want, but instead I get the same error
02:59 kojiro given a list of fqdns, I'd like to render a template using a list of IP addresses those FQDNs resolve to.
02:59 nomeed joined #salt
03:01 stanchan joined #salt
03:02 sh123124213 joined #salt
03:05 evle joined #salt
03:28 jas02 joined #salt
03:53 sh123124213 joined #salt
03:59 rh10 joined #salt
04:18 stanchan joined #salt
04:21 jas02 joined #salt
04:31 pipps joined #salt
04:51 lompik joined #salt
04:54 rh10 joined #salt
05:00 jas02 joined #salt
05:01 sh123124213 joined #salt
05:09 jas02 joined #salt
05:14 stduolc joined #salt
05:16 pipps joined #salt
05:33 onlyanegg joined #salt
05:43 lompik joined #salt
05:47 indistylo joined #salt
06:01 sh123124213 joined #salt
06:06 armyriad joined #salt
06:13 golodhrim joined #salt
06:19 jas02 joined #salt
06:27 LocaMocha joined #salt
06:31 zerocoolback joined #salt
06:37 sh123124213 joined #salt
06:39 ivanjaros joined #salt
06:48 LocaMocha joined #salt
06:52 LocaMocha joined #salt
07:03 zerocoolback joined #salt
07:07 golodhrim joined #salt
07:12 jas02 joined #salt
07:18 zulutango joined #salt
07:19 sh123124213 joined #salt
07:19 jas02 joined #salt
07:19 sh123124213 joined #salt
07:28 JPT joined #salt
07:36 jas02 joined #salt
07:51 jas02 joined #salt
07:54 LostSoul joined #salt
07:57 jas02 joined #salt
07:57 Ricardo1000 joined #salt
07:58 jas02 joined #salt
08:02 saltslackbridge joined #salt
08:02 armyriad joined #salt
08:04 zerocoolback joined #salt
08:09 Hybrid joined #salt
08:17 Tucky joined #salt
08:19 aviau joined #salt
08:23 aldevar joined #salt
08:25 mattfoxxx joined #salt
08:27 sergeyt joined #salt
08:30 zerocoolback joined #salt
08:30 Appleman1234_wor joined #salt
08:32 fredvd joined #salt
08:34 Appleman1234_wor left #salt
08:35 ivanjaros joined #salt
08:42 zerocoolback joined #salt
09:13 sergeyt joined #salt
09:22 zerocoolback joined #salt
09:24 _val_ Is this http://sprunge.us/iNfZ  <--  the same as setting   path.data = /var/lib/elasticsearch  and  path.logs = /var/log/elasticsearch?
09:25 indistylo joined #salt
09:29 _val_ This is what I get when I run  pillar.get: http://sprunge.us/VFFI
09:29 preludedrew joined #salt
09:29 pualj joined #salt
09:30 aruns joined #salt
09:31 Hybrid joined #salt
09:32 mikecmpbll joined #salt
09:32 saltslackbridge <ryan.walder> _val_ are you using a formula with a `map.jinja` or `defaults.yaml` file? With the pillar you've given there, no it wouldn't however if the formula has those as defaults then yes it would
09:34 _val_ ryan.walder: I am not using a formular or anything.
09:34 mikecmpbll sometimes i want to write state files to do things that aren't part of my highstate. these are usually only run once and i don't particularly need them cluttering up my salt configuration git repo. is there a general approach to this sort of thing?
09:34 _val_ Now I am hard-coding those paths, but I wanted it to make it more flexible.
09:36 saltslackbridge <mts-salt> mikecmpbil: you can write a state into a new sls file and call it with state.sls
09:36 Mattch joined #salt
09:36 mikecmpbll outside of git i guess
09:36 saltslackbridge <mts-salt> if you want it to be centrally managed then you can put it into the master's state tree manually rather than via git
09:38 saltslackbridge <ryan.walder> _val_ in thaty case you'd need to define the paths in the pillar
09:38 _val_ ryan.waldner Could you give me an example?
09:38 saltslackbridge <ryan.walder> mikecmpbll I usually stick stuff like that in `/srv/salt/oneoffs`
09:38 _val_ Kinda noobish at jinja / all this
09:38 saltslackbridge <ryan.walder> sure, one sec
09:38 mikecmpbll saltslackbridge : ok :) cool
09:39 _val_ ryan.walder nice! Thanks in advance
09:39 mikecmpbll when you say "call it with state.sls", what do you mean by that?
09:40 saltslackbridge <mts-salt> mikecmpbil: salt <minion> state.sls <your sls file relative to salt:// >
09:40 saltslackbridge <ryan.walder> so salt'machine' state.sls nameofoneoff
09:40 saltslackbridge <mts-salt> don't forget, slack-specific formatting doesn't show in irc :slightly_smiling_face:
09:41 saltslackbridge <ryan.walder> yeah, keep forgetting i'#m in irc
09:45 mikecmpbll is that different from state.apply?
09:45 saltslackbridge <ryan.walder> same thing for the most part
09:46 saltslackbridge <ryan.walder> state.apply with no args runs  state.highstate, with args rins state.sls
09:46 mikecmpbll gotcha
09:48 saltslackbridge <ryan.walder> _val_ https://github.com/ryanwalder/valexample
09:49 saltslackbridge <ryan.walder> basically with the `map.jinja` you set defaults which the formula uses, then if you need to change the defaults you just specify the pillar with the same name
09:50 saltslackbridge <ryan.walder> so in `map.jinja` you have `example.home` = `/var/lib/example` and if you wanted to change it you'd make a pillar with `example:home` = `/home/example`
09:53 _val_ ryan.walder: is all that (that much) needed for just to set path?
09:54 _val_ ryan.walder: Ok let me have a look first, it seems more complicated than I expected
09:55 saltslackbridge <ryan.walder> if you just want the paths then you can remove everything but the `files` key from the `map.jinja`
09:55 saltslackbridge <ryan.walder> just included a few more examples
09:56 saltslackbridge <ryan.walder> but you need the `map.jinja` and the `{% from ... %}` at the top of the file
09:56 _val_ ryan.waldner: as this: http://sprunge.us/EiMC
09:56 _val_ ?
09:56 saltslackbridge <ryan.walder> yup
09:57 _val_ And init.sls?
09:57 saltslackbridge <ryan.walder> obviously you can change `files` to `paths` or whatever you like
09:58 saltslackbridge <ryan.walder> You also need to change `example` to `elasticsearch`
09:59 saltslackbridge <ryan.walder> then in the init.sls you would do `{% from 'elasticsearch/map.jinja' import elasticsearch with context %}` at the top
09:59 preludedrew joined #salt
09:59 _val_ ah yes I got that
09:59 _val_ http://sprunge.us/GjZE
09:59 _val_ I just did so btw, that part I do understand. Let me go back to map.jinja
09:59 saltslackbridge <ryan.walder> yup, that looks about right
10:01 mikecmpbll is there a way in a state to make sure that a pkg is the latest version only if it's already installed?
10:02 saltslackbridge <ryan.walder> mikecmpbll: pkg.latest with only_upgrade i think
10:02 saltslackbridge <ryan.walder> only works with apt by the looks of it though
10:03 mikecmpbll derp how didn't i spot that
10:03 saltslackbridge <ryan.walder> and if not installed the state will fail
10:03 saltslackbridge <ryan.walder> what usecase do you have for that out of interest?
10:04 saltslackbridge <ryan.walder> seem counter intuitive to me
10:09 defsdoor joined #salt
10:10 mikecmpbll upgrading linux-generic package on VPS that don't have managed kernel
10:11 defsdoor I've got 2 servers, identical (as far as they are debian 9, same python etc..) put one complains that there's no filter regex_replace, whereas the other works fine (and does execute the filter)
10:11 mikecmpbll on some the kernel upgrades are managed by the provider, some not, and the presence of the linux-generic package is a litmus test for that.
10:11 saltslackbridge <ryan.walder> ah, makes sense
10:18 defsdoor hmm strange - different package versions
10:18 aruns joined #salt
10:19 saltslackbridge <ryan.walder> sounds like you need to managet them, with some kind of config management ;)
10:43 aanriot joined #salt
10:46 pbandark joined #salt
10:46 sybix joined #salt
10:57 mavhq joined #salt
11:24 sergeyt joined #salt
11:59 zerocoolback joined #salt
12:06 kettlewell joined #salt
12:10 _val_ ryan.walder: Thanks a lot for your effort! I learned a lot from the examples you posted.
12:10 saltslackbridge <ryan.walder> No worries, glad to help
12:13 * babilen scowls at saltslackbridge .. pesky you, messing up my nick colouring, indendation and easy backlog digestions
12:18 aldevar left #salt
12:19 XenophonF :/
12:21 aldevar joined #salt
12:22 colegatron joined #salt
12:25 aruns__ joined #salt
12:28 golodhrim joined #salt
12:29 zerocoolback joined #salt
12:36 coredumb babilen: it's really a mess :(
12:37 aldevar left #salt
12:38 Pistahh joined #salt
12:45 dendazen joined #salt
12:45 sergeyt joined #salt
12:49 oida joined #salt
12:50 dendazen joined #salt
12:50 av_ joined #salt
12:51 sergeyt joined #salt
12:52 swills joined #salt
12:52 swills joined #salt
12:52 swills_ joined #salt
12:57 DammitJim joined #salt
12:58 aldevar joined #salt
13:01 _val_ ryan.walder: What does the ...import elasticsearch with context %}  mean?
13:01 _val_ especially the context?
13:02 aldevar joined #salt
13:03 saltslackbridge <ryan.walder> The elasticsearch bit is importing the elasticsearch variable from the map.jinja, the with context is a jinja thing: https://jinja.readthedocs.io/en/latest/templates.html#import-context-behavior
13:04 aldevar1 joined #salt
13:07 _val_ ryan.walder: but what does  file.managed:  on this own?
13:08 _val_ file.manged:
13:08 _val_ - name: {{ file }}
13:08 _val_ .....
13:08 _val_ So the for loop is iterating through the elasticsearch.paths and the - name {{ file }} would then be expanded to:  - name:  /var/lib/elasticsearch/elasticsearch.conf  ?
13:09 defsdoor _val_ you cant have multiple top level file managed
13:10 defsdoor i do {{ file }} ; file.managed and skip name:
13:10 sergeyt joined #salt
13:10 defsdoor {{file}}: even ;)
13:13 _val_ well this is what I have now.. so .. do I need to use  salt '*' state.sls and set the pillar?
13:15 Nahual joined #salt
13:18 saltslackbridge <ryan.walder> _val_, that's correct, {{ file }} translates into /path/to/file/in/pillar
13:20 _val_ ryan.walder: how do I test this from salt master?
13:21 _val_ I mean how do I do a pillar.get on these key/values?
13:22 saltslackbridge <ryan.walder> the best way would be with `state.show_sls`
13:22 saltslackbridge <ryan.walder> that will show the result of the map.jinja merging the pillar and what yaml gets rendered after the loops etc...
13:24 _val_ doesn't do much
13:25 _val_ ryan.walder: I did a pillar.items but there is no such 'item'
13:26 _val_ I got a lot of those values.. but not the ones I was looking for.
13:27 golodhrim joined #salt
13:27 saltslackbridge <ryan.walder> without being able to see your code, and your pillar and the result you're getting I can't really help
13:27 Cadmus joined #salt
13:29 indistylo joined #salt
13:31 aruns__ joined #salt
13:32 saltslackbridge <ryan.walder> Oh, I think I see the issue, as defsdoor says it's likely because it's rendering `file.managed` twice under the same top level which will cause an error
13:32 swills joined #salt
13:32 swills joined #salt
13:34 _val_ ryan.walder: https://dpaste.de/CtCt/raw
13:34 _val_ this is what I have.
13:35 _val_ path.logs: and path.data: are hardcoded... I just wanted to use some jinja syntax in there :)
13:36 _val_ That is the output of elasticsearch.yml
13:36 XenophonF joined #salt
13:37 indistylo joined #salt
13:38 saltslackbridge <ryan.walder> wait so you're actually wanting to use the file paths in the config, not file.managed?
13:39 Cadmus Hello, I'm writing something using the orch runner, but I need multiple `tgt`s. I there a sensible way of doing that? I want a pillar for the 'primary' node and one for 'ohger' nodes, but be able to combine them if I have a thing I want to do on all of them.
13:39 Cadmus Before I get myself in a mess is there a good example of what I'm trying to do?
13:40 _val_ ryan.walder: yes
13:42 schemanic joined #salt
13:44 _val_ ryan.walder: more like this https://github.com/saltstack-formulas/elasticsearch-formula/blob/master/elasticsearch/config.sls
13:48 Hybrid joined #salt
13:50 Cadmus I have a suspicion what I want is a lost of globs, and that's not going to work
13:53 aanriot joined #salt
13:55 tiwula joined #salt
14:00 sergeyt joined #salt
14:02 saltslackbridge <ryan.walder> _val_ that code would be the same but change `{% for dir in (data_dir, log_dir) %}` to `{% for dir in elasticsearch.paths %}` or whatever you named it
14:02 saltslackbridge <ryan.walder> you're just saying "loop over this list"
14:09 Hybrid joined #salt
14:15 gh34 joined #salt
14:22 edrocks joined #salt
14:24 fredvd joined #salt
14:27 yidhra joined #salt
14:33 Hybrid joined #salt
14:34 sergeyt joined #salt
14:38 racooper joined #salt
14:41 Hybrid1 joined #salt
14:43 jrenner left #salt
14:46 oida joined #salt
14:50 jrenner joined #salt
14:51 schemanic_ joined #salt
14:53 jas02 joined #salt
15:04 jas02 joined #salt
15:06 gmoro joined #salt
15:07 cgiroua joined #salt
15:10 jas02 joined #salt
15:11 sergeyt joined #salt
15:27 chowmein__ joined #salt
15:28 englishm_work joined #salt
15:32 mikecmpb_ joined #salt
15:40 edrocks joined #salt
15:40 peters-tx Haven't had an update in a while; any idea when we might expect the next one?  Last was 2017.7.2, Oct 4 2017 (RHEL6 here)
15:43 evle1 joined #salt
15:45 ipsecguy joined #salt
15:48 DammitJim joined #salt
15:54 K0HAX joined #salt
15:57 babilen peters-tx: .3 has not been released yet if that's what you're asking
15:58 babilen Waiting for it as .2 introduced bugs that affect our states
15:59 peters-tx babilen, Yeah
16:01 babilen I hope it doesn't take too long
16:03 ouemt joined #salt
16:03 deftjack joined #salt
16:04 deftjack Any suggestions on: https://paste.fedoraproject.org/paste/KZjSCsVudV3OLak-l4ZcnQ   TIA
16:04 deftjack Trying to take action based on on if ipv4 grain contains certain ip range.
16:04 noraatepernos joined #salt
16:05 deftjack Ive tried all sorts of permutations and all fail the same way noted or act as if the jinja code isnt even in the file.
16:05 MTecknology awe.. one of those js-required pbin sites, eh?
16:05 deftjack I block js and its not complaining for me...
16:06 MTecknology I get a blank white page.
16:06 deftjack I can paste some where else if there is a place.
16:06 MTecknology I'm pretty sure you're not blocking it.
16:06 deftjack Been using fpaste for like 9 years. heh
16:06 MTecknology dpaste.com is decent
16:07 * deftjack looks at plugin. Unless its lying, it is. Anyhow...
16:07 deftjack moment will paste there.
16:07 MTecknology or gist if you want multi-files
16:08 deftjack http://dpaste.com/2FQQF2Y
16:08 jeffspeff joined #salt
16:09 saltslackbridge <ryan.walder> how many ips are you expecting per machine?
16:10 saltslackbridge <ryan.walder> `{% if grains['ipv4'][0].startswith('...') %}`may be more efficent
16:10 saltslackbridge <mts-salt> deftjack: you could write a pillar that matches against cidr if that helps, then check for the pillar
16:10 deftjack I tried that no joy.
16:10 saltslackbridge <ryan.walder> assuming you always want to match the first
16:10 deftjack Id expect one but it returns a list of lists.
16:10 deftjack From what I can tell because 127 is included in the grain.
16:10 deftjack So always at least 2 come back.
16:11 saltslackbridge <mts-salt> give us an example of what to match and what not to
16:11 deftjack {% if grains['ipv4'] == '10.64.*' %} even tried things like that.
16:11 deftjack I just want to set nameservers if "10.64" is in the ip list.
16:11 deftjack ipv4 grain that is.
16:11 saltslackbridge <mts-salt> that's definitely a pillar thing
16:12 deftjack Why pillar? The grain has the info.
16:12 saltslackbridge <ryan.walder> {% if "10.64" in grains['ipv4'] %}?
16:12 deftjack And regardless. Should not this be doable?
16:12 saltslackbridge <ryan.walder> not sure it matches on partials though
16:12 saltslackbridge <mts-salt> because pillar is controlled by the server and grains are controlled by the minion
16:12 deftjack And its a minion thing entirely.
16:13 deftjack There are times when matching the exact ip could be useful as well.
16:13 saltslackbridge <mts-salt> we have a 'network' pillar so that the local subnet gets network-specific values and the states just use the corresponding variables
16:13 deftjack Seems odd to have to set the same thing twice when its automatically be set as it is.
16:13 deftjack Kind of violates the whole idea of needlessly duplicating data.
16:13 saltslackbridge <mts-salt> duplicating where? i only have ip addresses in pillar
16:13 babilen deftjack: tbh: I wouldn't do it like that .. just target the right kind of data to the minion by subnet (cf. https://docs.saltstack.com/en/latest/topics/targeting/compound.html) in the pillar top.sls
16:13 saltslackbridge <ryan.walder> could you use `grains['ip_interfaces:eth0'][0]`?
16:14 saltslackbridge <mts-salt> that's precisely what i'm talking about
16:14 saltslackbridge <ryan.walder> if you know the iface name
16:14 deftjack So looking to ipv4 grain that contains the data I want is the wrong data. Ok....
16:14 babilen And use network.ip_addrs cidr=? / type={public,private} in other locations
16:14 babilen That interface and parsing IP addresses madness will drive you nuts
16:14 deftjack Would you suggest I not use the grain in config files as well?
16:14 MTecknology man, cleaning HIDs is disgusting..
16:15 deftjack Regardless of all of this. See why that code is not working?
16:15 saltslackbridge <mts-salt> because you're using string comparison with a wildcard
16:15 babilen https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.network.html#salt.modules.network.ipaddrs -- you can also feed that info easily into the mine and retrieve it for other minions if you have to
16:15 saltslackbridge <mts-salt> 'startswith' would be the appropriate method to use
16:15 babilen (suitable salt function aliases)
16:15 deftjack In my paste Im not using a wildcard
16:16 deftjack Im using starts with in my post: http://dpaste.com/2FQQF2Y
16:16 MTecknology deftjack: I haven't looked at the backlog yet, but 1-18 is pillar data, ya?
16:16 saltslackbridge <mts-salt> the entire top section would be trivial in pillar using cidr matching
16:17 saltslackbridge <mts-salt> yep, top 18 lines, all pillar
16:18 saltslackbridge <mts-salt> then the jinja template could just read direct from the pillar, wouldn't even need the defaults
16:18 babilen deftjack: I have to leave now, but do yourself a favour and target the nameserver data by subnet/cidr (S@ compound matcher) to your minions
16:18 babilen i also recommend to never hardcode interfaces
16:18 babilen Or parse IP addresses as strings
16:18 saltslackbridge <mts-salt> ```  10.0.0.0/8:     - match: ipcidr     - network.internal```
16:19 saltslackbridge <mts-salt> pillar really is easy to use
16:19 deftjack So the answer is dont user grains.
16:19 deftjack use
16:19 MTecknology {% if salt.network.ip_addrs(cidr='10.64.0.0/24') %} nameservers = ['10.64.0.33','10.1.1.111','10.1.1.110'] {% elif salt.network.ip_addrs(cidr='10.64.0.0/24') %} nameservers = [...] {% else %} nameservers = default {% end..
16:19 saltslackbridge <mts-salt> i prefer not to, no.
16:19 saltslackbridge <mts-salt> MTecknology: yuck! :slightly_smiling_face:
16:20 deftjack The docs indicate to use grains for things like dynamic info, non-private, system specific, auto set etc.
16:20 deftjack Seems very strange the ip being largely unique to a system within an environment would not use a grain that has already, automatically, public info, could change, has been set.
16:20 saltslackbridge <mts-salt> grains can be overriden. they have defaults, sure, but they can all be replaced. even id
16:20 MTecknology mts-salt: It's not the prettiest, but it's similar to what he has and pretty straight forward and easy to tidy up however he wanst later.
16:21 deftjack So why do grains even exist?
16:21 MTecknology iirc, id is a special grain that's not so easily changed
16:21 saltslackbridge <mts-salt> for cases where you want to store information. the point i'm making is how much trust you put into it
16:21 saltslackbridge <mts-salt> id can be changed, it's just reset back to the minion id on startup
16:22 deftjack I cant trust the system to set ipv4?
16:22 saltslackbridge <mts-salt> change it after startup, grains.get id and it'll be the new value. so any use of id after that in pillar can be subverted
16:22 saltslackbridge <mts-salt> it'll set a default, but it can be changed
16:22 deftjack Every system has this grain set. Every system is correct. Failing to understand why I should not trust it.
16:22 MTecknology but "grains" is just a dict, it's not calling the module
16:22 MTecknology If you call the module, wouldn't you get the accurate name?
16:23 deftjack Why would I call something for info when the info is already there?
16:23 saltslackbridge <mts-salt> precisely my point. the dict can be changed after it's been initially populated
16:23 MTecknology gotcha
16:23 saltslackbridge <mts-salt> grains is for stuff that can change. it's that simple
16:23 mikecmpbll joined #salt
16:23 deftjack Well in that case you should never use grains and rather always call something that generates said data that populates the grain. Unless you just want to put "notes" in something I suppose.
16:24 saltslackbridge <mts-salt> yes, it's pre-populated, but it's a copy of the underlying information, not a definitive unchanging version of it
16:24 aldevar joined #salt
16:24 MTecknology the dict object is meant for quick/easy access
16:24 saltslackbridge <mts-salt> i use grains as hints, yes. but my states don't rely on them
16:24 saltslackbridge <mts-salt> anything i rely on comes from pillar
16:24 MTecknology in general, you /should/ be able to trust the data salt gives you, but it's also possible for another dev/admin to screw with what you expected.
16:25 saltslackbridge <mts-salt> or end-users. and oh yes there are a few of those that would like to make the bofh's life harder
16:25 saltslackbridge <mts-salt> so i don't trust minions, i use the master to tell them what to do
16:26 deftjack It would seem to me then grains just should not be used and the documentation should probably be updated indicating you should not use them for anything but human set items such as comments or notes.
16:26 deftjack Id still very much like to understand why my code does not work and does what it does though as it sure appears to be violating deliminters, scope or something.
16:26 MTecknology deftjack: you may be taking their level of paranoia to the next extreme..
16:26 deftjack And at the very least code that would work with the grain if for no other reason that curiousity.
16:26 saltslackbridge <mts-salt> different people have different needs, i'm just explaining mine
16:27 MTecknology deftjack: so what do you get from 'salt-call grains.get ipv4'?
16:27 deftjack MT Im merely reflecting the state of the doc to what is being suggested here. Im taking it nowhere but to make things consistent.
16:27 saltslackbridge <mts-salt> my orignal point stands, however. nameservers is a configuration setting and would be perfectly suited to being in pillar
16:28 * MTecknology +1
16:28 deftjack local:
16:28 deftjack - 10.64.0.61
16:28 deftjack - 127.0.0.1
16:28 MTecknology use a pastebin or fit it to one line
16:28 deftjack Im not suggesting its not suitable for pillar to put the record straight.
16:29 deftjack http://dpaste.com/0RD33P1
16:29 MTecknology what's the name of the sls file?
16:30 deftjack init.sls   inside the dns directory
16:30 MTecknology I meant the full path
16:31 deftjack /opt/user_git_work/salt/core/dns
16:31 MTecknology the full /salt/ path
16:32 MTecknology based on multiple bits of info and some guess work... I'm assuming approx.. salt://core/dns/init.sls?
16:33 deftjack You mean when I do a state.apply and Im specific?  ie: salt "host.foo.com" state.apply  core.dns  salteenv=dev
16:33 deftjack Yes
16:33 MTecknology k.. that's the info I was after
16:33 MTecknology run that on the host itself, but s/salt/salt-call -l debug/ and pbin that.
16:33 swa_work joined #salt
16:35 izombie joined #salt
16:35 ivanjaros joined #salt
16:39 izombie Any idea why vagrant user might not have mysql access permision?
16:39 MTecknology that doesn't at all sound anything like a salt-related question
16:39 Creme joined #salt
16:42 babilen deftjack: You can use grains, but you don't want to for network related information (IMHO) as there are better tools to tackle problems related to it
16:42 izombie MTecknology: Okay, let me elaborate. Have deployed a vagrant instance through salt and mysql database has been created, but through root user. When I try to login with vagrant user, it complains permission error. So what permissions are lacking besides being in sudo gorup?
16:43 MTecknology izombie: right... that's not at all a salt question. You should probably find a more appropriate debugging/app-specific channel.  When you find a solution, we can help you implement that with salt, but right now, it sounds like you're just general troubleshooting.
16:43 MTecknology deftjack: I got bored... https://gist.github.com/MTecknology/5f6b53c363f7d31a2a1a2a33ea36b2f0
16:43 viq izombie: system users and DB users are completely independent. You probably need to tell your mysql client to connect as root user
16:45 izombie viq: Yes, I do that through `mysql -u root` and adding prefixing sudo is letting vagrant user in
16:45 deftjack salt-call -l debug state.apply core.dns test=true saltenv=dev    Ive run this before but didnt notice anything other than what I knew it was doing. Sorry, I was trying to remove what I thought might be sensitive info in the debug. Hopefully got it all.   http://dpaste.com/19FHYXC
16:45 saltslackbridge <mts-salt> MTecknology: i'd consider layering a default then a cidr-specific pillar, rather than using jinja
16:45 saltslackbridge <mts-salt> other variables can quickly be added per-network if required
16:45 izombie viq: But in another instance that I've deployed vagrant user can login directly without sudo, so I'm trying to understand what's different in my deployment.
16:47 swa_work joined #salt
16:48 deftjack MTecknology: Thanks. I get that. Id still like to understand the issue Im seeing though. s/ipv4/whatevermygrainis  and I have no reason to think the same thing would not happen. My first inclination is my lack of understanding of how things are parsed is the issue but I have not been able to track the issue down.
16:49 MTecknology deftjack: man... that's a lot of whitespace from all that templating.. http://dpaste.com/19FHYXC#line-52
16:49 deftjack In all fairness its largely "borrowed" from an admin here. Ill use that as my defense. =)
16:49 saltslackbridge <mts-salt> i'd be tempted to put a comment in containing what your grain resolves to at that point, then use slsutil.renderer to see what gets spat out. i remember dumping the entire context dictionary once - that was huge!
16:49 deftjack Pretty much only the code at the top is mine.
16:49 MTecknology ooooh... I see your issue
16:49 MTecknology derp
16:50 izombie MTecknology: :P I'm trying to figure out why vagrant can login into mysql in one salt deployed instance and can't in another.
16:50 deftjack Let me guess. Missing , } or the like.
16:50 saltslackbridge <mts-salt> izombie: is it possible someone manually granted permissions? :slightly_smiling_face:
16:50 MTecknology deftjack: You set a default, but then you never set the actual value. You're iterating over a string of chars.
16:51 saltslackbridge <mts-salt> of course. it should be context rather than default
16:51 saltslackbridge <mts-salt> missed that
16:51 MTecknology the "default" is right..
16:51 MTecknology just needs two more lines    -context: nameservers: {{ nameservers }}
16:52 MTecknology and at that point, you've already ensured that nameservers is set to /something/, so there's no real point in the default.
16:53 deftjack Ok so the context removes the need for my "catch all" if you will. If Im following you. Not sure I get the iterating a string of chars. Are you stalkinga bout the "for ip in ips" portion?
16:54 saltslackbridge <mts-salt> without a context, nameservers only has a default, not an actual value
16:54 MTecknology which is literally the string "missing"
16:55 saltslackbridge <mts-salt> so the value that gets expanded is a string, and iterating that loops over the characters
16:55 deftjack I dont see how missing gets in there is part of my issue.
16:55 saltslackbridge <mts-salt> because there's no value. jinja supplies that string for you
16:55 Church- So quick question, keep getting timeouts when trying to deploy salt-minions to vm's in a private network with the master, central US, and asmterdamn using salt-cloud, a map file and the salitfy driver. Always timeouts, anybody know how to debug this?
16:55 deftjack At what point in my code is that happening. Each step of the way the nameserver is being set explicitly and not from what is parsed etc.
16:55 MTecknology deftjack: http://dpaste.com/19FHYXC#line-116
16:56 swa_work joined #salt
16:56 deftjack Yes, I knew missing was in there. But how?
16:56 saltslackbridge <mts-salt> you're not specifying the value 'missing', jinja is doing that
16:56 saltslackbridge <mts-salt> it's a default provided by the context
16:56 MTecknology what do you mean "but how?"
16:57 MTecknology that's the rendered state... it's there because that's what's in the actual state your running.
16:57 deftjack Still confused. At each step of my code I assign nameservers including when its not assigned. Should it not have something in it under all circumstances before it gets to the "defaults:" point
16:57 MTecknology please re-read what I told you?
16:58 saltslackbridge <mts-salt> you're assigning a variable in your state. this is not the same variable you see in your template. the context is used to pass variables in to the template, and in your case the context doesn't have a value so substitutes the string 'missing'
16:58 tracphil joined #salt
16:58 MTecknology https://docs.saltstack.com/en/latest/ref/states/all/salt.states.file.html
16:58 saltslackbridge <mts-salt> so it's fine in your state, it's not making it to your template
16:59 MTecknology (because it's not defined in the state)
16:59 saltslackbridge <mts-salt> well yes, it is, but it's not passed from the state into the context that gets passed in to the template renderer
16:59 MTecknology It's defined in the sls file, not in the state.
17:00 MTecknology oh, right... the default is
17:00 Bryson joined #salt
17:00 saltslackbridge <mts-salt> the jinja variable is defined in the sls file, yes, and exists in the state in the default
17:00 Church- So yeah, any words of wisdom on this?
17:01 deftjack {% set nameservers = ['10.1.1.110','10.1.1.111','10.64.0.33'] %}   If I hard code that with no logic around it I dont see this happen (need to go back and confrm, tried too many things) so is it the conditionals some how that change this behavior?  Guess I dont understand how its "not making it to your template".
17:01 MTecknology words of wisdom: be patient and wait for volunteers to help
17:01 deftjack This is where my true lack of understanding of salt comes in. Im not all that familiar.
17:01 saltslackbridge <mts-salt> church: are you by any chance restarting the salt minion during one of your states? if so it'll never return :slightly_smiling_face:
17:01 aviau joined #salt
17:02 Church- MTecknology: Yeah, point. Apologies.
17:02 swa_work joined #salt
17:02 saltslackbridge <mts-salt> deftjack: you need to consider the template expansion of the sls file as a totally separate operation to the template expansion of the managed file. they're two operations
17:02 saltslackbridge <mts-salt> the context is how information gets from one to the other
17:02 Church- mts-salt: No minions installed, this is simply tring to bring up new minions across the world on already provisioned vm's.
17:02 Church- trying*
17:02 MTecknology deftjack: each "block" that starts with a tag is what defines a state. A state is a data structure that directs salt to do things. Whatever happens outside of that particular state, is something the state doesn't know about unless you tell it.
17:03 MTecknology if that makes sense..
17:03 Church- Might just go write up a script to manually install each of them I guess.
17:03 Church- Worst, comes to worst.
17:03 saltslackbridge <mts-salt> church: if you were in slack i'd suggest asking in the cloud channel :slightly_smiling_face:
17:04 Church- Aye, guess I'll go join it.
17:04 MTecknology Church-: there's soooooo many things that could cause timeout errors. We'd need a lot more info to try to help you debug that.
17:04 deftjack So how do I always ensure something is defined in the state?  If I just set the variable it has always worked even for other templates but clearly not all the time. Id know how to keep a variable in scope in C or python but this...
17:04 AnalogLifestyle joined #salt
17:04 Church- MTecknology: Aye point, so what grab a debug log then?
17:05 saltslackbridge <mts-salt> think of the context as an object that you put variables in to, so that the template can get them out again
17:05 MTecknology do things become reachable after the deployment finishes?
17:05 MTecknology if not, then do a deployment, leave it broken, and figure out what step got missed.
17:05 saltslackbridge <mts-salt> i've had minions take a while to start up before their key appears on the master, but i'm not using cloud to deploy them
17:05 MTecknology salt-cloud is pretty good about making sure that sort of race condition doesn't happen.
17:06 Church- I'm an idjit.
17:06 saltslackbridge <mts-salt> aye, pity it doesn't work with custom kvm host and custom windows image :slightly_smiling_face:
17:06 Church- Figured out my issue.
17:06 MTecknology Yay!
17:06 saltslackbridge <mts-salt> i had to roll my own deployment
17:06 Church- Is there a way to specifiy what ssh port it tries to connect on?
17:06 * MTecknology uses proxmox and VPS providers
17:06 Church- Forget I have non standard ports as my infra standard.
17:06 MTecknology yucky!
17:07 Church- Go proxmox.
17:07 * MTecknology hates security via obscurity
17:07 Church- Eh, a bit. But less easy for automated scripts to hamer at least.
17:07 Church- I mean I use fail2ban and carefully written firewall scripts.
17:07 deftjack Church-: Probably unrelated to your problem but timeouts and minions "vanishing" on my end seems to have largely been solved with tcp_keepalive: True in the minion config.
17:07 Church- But still, every bit helps.
17:07 Church- Good to know, thanks.
17:08 MTecknology non-standard ssh port doesn't really help unless you have a proper IDS/IPS in place because most services advertise the service they are when connecting. You'd need it tuned to detect port scanning... which is bloody hard to do properly.
17:09 MTecknology https://docs.saltstack.com/en/latest/topics/cloud/misc.html#ssh-port
17:09 MTecknology interesting how that option is displayed twice
17:11 Church- Huh, aye.
17:11 Church- Where does that go? provider, profile?
17:11 MTecknology actual conf
17:11 MTecknology cloud.d/foo.conf
17:11 aldevar left #salt
17:13 Church- Gotcha.
17:14 Church- Okay, adding it to the map file worked as well.
17:14 sergeyt joined #salt
17:14 sjorge joined #salt
17:14 MTecknology "the map file" sounds like a custom term
17:15 Church- Nah, when using map files with salt-cloud
17:15 MTecknology deftjack: My salt setup has evolved past this point significantly, but it's worked well for half a decade in corporate environments managing ~500 nearly-all-unique snowflakes.  https://github.com/MTecknology/saltstack-demo/
17:16 izombie MTecknology: You were right. It had nothing to do with salt, it was .my.cnf file
17:16 izombie viq: ^^
17:16 MTecknology Glad you got it figured out. :)
17:17 Church- Bah, now I need to go rotate public keys. Ick.
17:17 Church- So much manual stuff for an automated setup.
17:17 MTecknology because?
17:17 izombie MTecknology: =)
17:18 MTecknology Church-: I don't understand where pubkeys comes into the picture, but I've been working on fully-automated deployment to any supported VPS provider (including proxmox).  Add to inventory, wait for highstate to be done.
17:20 MTecknology At this point, I'm mostly prettying things up while I wait for a new feature from netbox.
17:20 Church- MTecknology: Huh, thought it needed ssh keys on the hosts to deploy the minions?
17:21 Church- Am I wrong? I'd love to be.
17:21 pbandark1 joined #salt
17:21 MTecknology in DO, you define specific pubkeys that can be installed into the new node, then your master has the private key to connect to it.
17:22 Church- Huh, not using digital ocean. Main network is on liquidweb, then branches are on ramnode throughout the world.
17:22 Church- Good to know however.
17:22 MTecknology deftjack: did you get what you'll use from my resolvconf stuff? If so, I'm going to delete it.
17:26 deftjack Im still lost. No idea why its not passed to template. As far as I can see there should be no reason that at least the not defined statement runs and sets it. Also clearly comething is being set because in the debug it shows both the ips and the word nameserver in it.
17:26 Hybrid joined #salt
17:26 babilen Still trying to make insanity work?
17:27 MTecknology deftjack: paste an updated run log
17:27 MTecknology babilen: I can appreciate the effort to understand what's wrong. As long as he doesn't keep it, anything learned will be useful.
17:28 deftjack I havent actually changed anything. Trying to understand the mechanics first. I dont see anything insane about wanting to parse a grain.
17:28 MTecknology (keep insanity, not learning)
17:28 MTecknology there's nothing wrong with parsing a grain (except that you iterate over the same list twice.
17:28 MTecknology s/./)/
17:29 deftjack You are referring to the two for loops?
17:29 MTecknology yup
17:30 babilen deftjack: The "insanity" stems from the kind of states/code you end up with if you adopt that patterns. It's very hard to reason about the various bits were "settings" come from, as you don't have a single defined source
17:30 deftjack Ok, that was an attempt to deal with what seemed to be a list of lists. Last iteration of code. Ill rollback to a prior git version that did not do that. In those cases I didnt get the missing but basically it was always just hitting the last if not defined...
17:30 babilen It's not so much about the "parsing grains" per se
17:31 MTecknology babilen: in this case, he's struggling with jinja rendering vs. yaml rendering, and state formation.
17:31 deftjack babilen: I get that and for this Ill move to pillars but this is, I think, a good lesson for me to understand these mechanics.  ie: replace nameservers with foo list of comments, dunno.
17:31 swa_work joined #salt
17:32 babilen Please note that I have nothing against you understanding the exact mechanics of whats happening :)
17:32 deftjack Alright, I appreciate all the help. Greatly, Ill plug away at this and see where I get and bug you with my insanity as I get stuck again at a later point. =)
17:33 MTecknology deftjack: http://dpaste.com/19FHYXC#line-52 <-- this is the rendered jinja... see the file it refers to? and the output?
17:33 babilen Do you have a paste that exemplifies what's happening, deftjack ?
17:33 MTecknology deftjack: What do you /NOT/ see?+
17:35 MTecknology also- that really /should/ be  nameservers: ['missing'] ... stop iterating over a string.
17:36 deftjack MTecknology: I have other iterations of mangling this code and at first I was not making use of multiple loops until it appeared to be a list of lists. In those others I did not see the "missing" issue but it also never caught scenarios where ipv4 had an instance to match 10.64 and hence would just hit the last segment of code and set namservers to the catch all.
17:37 swa_work joined #salt
17:37 MTecknology missing: http://dpaste.com/19FHYXC#line-164
17:41 oida joined #salt
17:45 onlyanegg joined #salt
17:49 Rr4sT joined #salt
17:52 swa_work joined #salt
17:55 swa_work joined #salt
18:06 viq can engines be configured via a pillar, or does that need to go into config file?
18:07 K0HAX joined #salt
18:19 noraatepernos joined #salt
18:32 pppingme joined #salt
18:41 bbbryson joined #salt
18:43 tiwula joined #salt
18:44 nixjdm joined #salt
18:48 ymasson joined #salt
18:52 noraatepernos joined #salt
18:58 swa_work joined #salt
19:00 gtmanfred did I fix it?
19:00 gtmanfred ugh, npm is too old
19:06 saltslackbridge joined #salt
19:06 gtmanfred woo
19:06 gtmanfred fixed
19:07 gtmanfred i forgot what that server was for, and deleted the docs server for kitchen-salt and the bridge
19:07 gtmanfred probably should create some automation to set that stuff up, if only someone knew some software to do that
19:07 agustafson joined #salt
19:11 viq If only :D
19:17 Eric_TheITGuy joined #salt
19:50 pipps joined #salt
19:52 pipps joined #salt
19:55 qu3u3 joined #salt
19:57 aldevar joined #salt
19:59 pipps joined #salt
20:27 fredvd joined #salt
20:27 XenophonF joined #salt
20:29 aldevar left #salt
20:31 aldevar joined #salt
20:35 pipps joined #salt
20:36 drserver joined #salt
20:37 mikecmpbll joined #salt
20:38 pipps99 joined #salt
20:40 concerti joined #salt
20:40 concerti is it possible to use pillar data to do an if statement in a state? ex; {% if pillar['role'] == 'dev' %}
20:40 dlloyd yes
20:41 concerti very cool ty
20:41 pipps joined #salt
20:45 Soren__ joined #salt
20:56 Edgan concerti: there are better ways
20:58 Edgan concerti: You can use map.jinja files, and have defaults. Then you can merge in pillars in a layered way so that dev can have it's own password and prod can have it's own password.
20:58 DammitJim joined #salt
20:58 Edgan concerti: https://storage.cygnusx-1.org/formula.txt   Then you can avoid lots of if statements. You can also do case statements in the map.jinja for different distributions.
21:16 MTecknology arguably, that multi-layered approach is only better if it suits your needs
21:16 gtmanfred concerti: if role is a list, you would want to do `{%- if 'dev' in pillar.get('role', []) %}`
21:16 gtmanfred fyi
21:23 pipps joined #salt
21:26 concerti this is a state I am writing to ensure one group of users exists on dev servers and another group of users exists on prod servers
21:27 concerti so I think the pillar approach is the most simple way
21:27 concerti the map.jinja looks advanced but powerful
21:29 deftjack MTecknology: Did you actually try your pillar example for the nameservers because salt.network.ip_addrs(cidr= is not working at all for me. Maybe Im missing something the follow everything, even systems with 192 addresses, are matching the second statement elif. ie: http://dpaste.com/3E2BZRW
21:29 MTecknology nope, why would I? I have no systems with that hostname. I just read the docs.
21:30 deftjack I gave up trying to understand what was going on with the rendering issues I have. Too much to do. Too little time. Just need to get it to work at this point.
21:30 deftjack I was just curious if you had as if it worked for you then that would be more an indicator Im missing something.
21:30 deftjack Yah the docs seems to show that should work.
21:30 MTecknology that timezone thing almost makes me sad.
21:31 MTecknology UTC > *
21:31 deftjack Doesnt matter anyhow since the ifs dont work so its of little consequence.
21:31 MTecknology uhm?...
21:32 MTecknology that's some pretty failed logic right there.
21:33 deftjack Need to fix one problem before another is all. No failure in logic.
21:33 MTecknology "doesn't matter" is the failure
21:34 deftjack It doesnt at this point within the context of what Im doing.
21:34 MTecknology anyway.. good luck
21:34 deftjack It will though.
21:46 Trauma joined #salt
21:57 K0HAX joined #salt
21:58 pipps joined #salt
22:02 pipps99 joined #salt
22:04 xMopx What could cause salt to tell me `No minions matched the target. No command was sent, no jid was assigned.` when the targeted minion actually *does* exist?
22:15 Edgan xMopx: Provide examples of the salt command and the hostname
22:18 xMopx Edgan: `salt 'foo123-bar456-baz789.example2' test.ping`
22:18 xMopx hostname matches the above
22:19 saltslackbridge <gtmanfred> the hostname doesn’t matter, the minion id is what matters.
22:19 saltslackbridge <gtmanfred> check salt-key for the minionid
22:20 xMopx saltslackbridge / gtmanfred: the hostname matches the key name as well, yeah
22:20 Edgan xMopx: /etc/salt/minion_id on the system
22:20 xMopx right, it all matches
22:20 Edgan xMopx: You can also do salt 'foo123*'
22:21 Edgan xMopx: I am curious if a wildcard catches it
22:21 xMopx It does act correctly when I target '*.example2', yeah
22:22 Edgan xMopx: There are no non-standard characters in this hostname?
22:22 xMopx Edgan: definitely not, it's auto-generated by other tooling
22:22 Edgan xMopx: I would still try foo123* and grow it till it stops working
22:22 xMopx ah good point
22:23 Edgan *.example2 shows that part isn't the problem
22:23 Edgan xMopx: Are you typing it or cut and pasting it?
22:24 xMopx Edgan: bit of both
22:24 Edgan xMopx: I would cut and paste the whole thing and see if that works. Something that comes to mind is l vs I, depending on your font.
22:25 xMopx Edgan: i screwed up earlier, '*.example2' does not match the minion.
22:25 Edgan ah, interesting
22:26 Edgan xMopx: does *2 match?
22:26 xMopx i can't get it to match with any substring of the name
22:26 xMopx the name that shows up in salt-key -L, to be clear
22:26 Edgan Which is the one that should work
22:26 xMopx the key was created via api and shared with the minion, if that matters
22:27 Edgan xMopx: Sure we aren't mixing up salt masters?
22:27 xMopx i will check my other one but im quite sure
22:27 Eric_TheITGuy joined #salt
22:27 xMopx yeah, it's not in the other one haha
22:27 Edgan xMopx: tried restarting the minion and master?
22:28 Edgan as in the processes
22:28 xMopx id like to avoid needing to do that
22:28 Edgan xMopx: I have never seen salt not match a host on the master with the salt command if it is in salt-key
22:29 Edgan xMopx: and I have hostnames like foo-bar-blaz-01.env.region.provider.acme.com
22:29 xMopx yeah my first thought was that dashes were forbidden or something silly, but no
22:30 xMopx since when this went wrong, some other minions in the same working set were fine
22:30 Edgan xMopx: yeah, the issue shouldn't be dashes
22:30 Edgan xMopx: version of salt?
22:31 xMopx 2017.7.2 on both sides Edgan
22:31 Edgan xMopx: is it only this host? Do all other hosts work?
22:32 xMopx do you mean only that minion? yeah, other minions connected to the same master work
22:32 xMopx this is dev, luckily. in prod i have nodes with names generated in the same way and have not encountered this
22:32 xMopx 2017.7.2 too
22:33 Edgan xMopx: Even if the minion wasn't running I would expect the master to just say it isn't running, not have a problem with matching
22:33 xMopx i guess dev-land probably got abused in some way and i should keep digging
22:34 Edgan xMopx: Is the host maybe in the accepted and denied list on the master?
22:34 Edgan xMopx: I have seen that happen before
22:35 Edgan xMopx: My suggestion is focus on the master
22:35 xMopx ahh shit that's it
22:35 xMopx i was grepping for the minion name in salt-key -L but not looking at the section....
22:35 Edgan xMopx: Still not sure it would cause your problem, but worth trying
22:36 xMopx i accepted the key and it behaves as expected now :)
22:36 Edgan :)
22:36 xMopx thanks for that!
22:36 Edgan You are welcome.
22:37 xMopx i guess my key preseeding and sharing strategy has some flaws
22:39 sh123124213 joined #salt
22:40 pipps joined #salt
22:48 tiwula joined #salt
22:50 packeteer joined #salt
22:52 Eric_The1 joined #salt
22:54 ciastek joined #salt
22:55 Eric_TheITGuy joined #salt
22:58 ciastek i have a state, that put an existing certificate into java's keystore. it has both onlyif/unless (checks if given alias is already in the keystore) and onchanges (checks if the (managed) certificate had changed). the problem is, that if the certificate had changed, onlyif/unless would still prevent the state from running (as the old certificate's alias is already in the keystore).
22:59 ciastek how should i try to express the state, that should be run when one of following happens: 1) some other state had changes, 2) some "check command" had returned true or false. ?
23:01 ciastek now i look for some intermediate state, that would report "i've changed" based on the command passed, so the only requisite needed would be "onchanges", but i'm not sure if it's the right directoin
23:02 pipps joined #salt
23:11 ciastek I've found nice intermediate state: cmd.run with stateful: True and name: "check_cert && echo 'changed=no' || echo 'changed=yes'. good enough.
23:15 pipps99 joined #salt
23:15 MTecknology onchanges sounds about right for what I read
23:30 pipps joined #salt
23:30 pipps99 joined #salt
23:31 fredvd joined #salt
23:40 mrueg joined #salt
23:40 onlyanegg joined #salt
23:58 pipps99 joined #salt

| Channels | #salt index | Today | | Search | Google Search | Plain-Text | summary