【导读】
运维人员,经常要编译源码包,这个时候就可以让puppet 执行外部命令。其实就是直接调用shell来完成。今天就为大家介绍运维自动化之exec资源管理。
【基础】
作为运维人员,肯定是对一门语言熟练掌握,因为此资源是通过shell来完成相关操作,需要对shell有一定的基础。
【puppet exec 介绍】
puppet执行外部命令,多 次反复用这个方式执行命令是有威胁性的,因此建议对执行的命令进行加锁或者类似的处理.
你也可以让exec只有在收到一个其他资源的事件的时候才执行. 因为exec资源是一种挥发性资源,命令执行完了,这个资源
可以说就处理完了. 因此在不同的类里面,exec资源的名字可以是相同的 ,注意下面的例子红色字体,这是exec资源特殊的地方.
?
1
2
3
exec
{ "make" : cwd =>
"/prod/build/dir" , path =>
"/usr/bin:/usr/sbin:/bin"
}
exec
{ "make" : cwd =>
"/test/build/dir" , path =>
"/usr/bin:/usr/sbin:/bin"
}
上面摘自puppet中文(hmy )同学的文档,英文不好,就直接贴了他的翻译。
注意:在不同的类定义相同名字的exec资源,如果是其他类型的资源,在执行puppet的时候得到一个错误,但是在exec资源里面,这却是正确的. 不过为了方便起见,建议每个exec资源的名字最好是唯一的.
【puppet exec 参数介绍】
command: 将会被执行的命令,必须为被执行命令的绝对路径,或者得提供该命令的搜索路径。如果命令被成功执行,所有的输出会被记录在实例的正常(normal)日志里,但是如果命令执行失败(既返回值与我们所指定的不同),那么所有的输出会在错误(err)日志中被记录。
这个是exec资源类型的名变量(namevar)。
creates:
指定命令所生成的文件。如果提供了这个参数,那么命令只会在所指定的文件不存在的情况的被执行:
cwd:
指定命令执行的目录。如果目录不存在,则命令执行失败。
env:
我们不建议使用这个参数,请使用‘environment’。这一部分还未完成。
environment
为命令设定额外的环境变量。要注意的是如果你用这个来设定PATH,那么PATH的属性会被覆盖。多个环境变量应该以数组的形式来设定。
group
定义运行命令的用户组。在不同的平台下的运行的结果无法确定,由于不同用户运行命令的时候,变量是不变的,所以这是平台的问题,而不是Ruby或Puppet的问题。
logoutput
是否记录输出。默认会根据exec资源的日志等级(loglevel) 来记录输出。若定义为on_failure,则仅在命令返回错误的时候记录输出。可取的值为:true,false和其他合法的日志等级。
onlyif
如果这个参数被设定了,则exec只会在onlyif设定的命令返回0时才执行。例如:
exec { "logrotate": path => "/usr/bin:/usr/sbin:/bin", onlyif => "test `du /var/log/messages | cut -f1` -gt 100000" }
只有在test返回true的时候logrotate才会被运行。
需要注意的是onlyif定义的命令跟主命令遵循同样的规则,也就是说如果path没有被设置的话,需要使用绝对路径。
除此之外,onlyif还可以接受数组做为其值,例如:
onlyif => ["test -f /tmp/file1", "test -f /tmp/file2"]
上面的代码限定了只有在所有数组中的条件返回true时exec才会被执行。
path
命令执行的搜索路径。如果path没有被定义,命令需要使用绝对路径。路径可以以数组或以冒号分隔的形式来定义。
refresh
定义如何更新命令。当exec收到一个来自其他资源的事件时,默认只会重新执行一次命令。不过这个参数允许你定义更新时执行不同的命令。
refreshonly
该属性可以使命令变成仅刷新触发的,也就是说只有在一个依赖的对象被改变时,命令才会被执行。仅当命令与其他对象有依赖关系时,这个参数才有意义。当你要触发某个行为时,会显得很有用:
# Pull down the main aliases file file { "/etc/aliases": source => "puppet://server/module/aliases" } # Rebuild the database, but only when the file changes exec { newaliases: path => ["/usr/bin", "/usr/sbin"], subscribe => File["/etc/aliases"], refreshonly => true }
要注意的是只有subscribe和notify可以促发行为,而不是require,所以在使用refreshonly时,只有同时使用subscribe或notify才有意义。有效的值为true, false。
returns
指定返回的代码。如果被执行的命令返回了其他的代码,一个错误(error)会被返回。默认值是0,可以定义为一个由可以接受的返回代码组成的数组或单值。
timeout
命令运行的最长时间。如果命令运行的时间超过了timeout定义的时间,那么这个命令就会被终止,并作为运行失败处理。当定义为负值时就会取消运行时间的限制。timeout的值是以秒为单位的。
unless
如果这个变量被指定了,那么exec会执行,除非unless所设定的命令返回0。例如:
?
1
2
3
4
exec
{ "/bin/echo root >> /usr/lib/cron/cron.allow" :
path =>
"/usr/bin:/usr/sbin:/bin" ,
unless =>
"grep root /usr/lib/cron/cron.allow 2>/dev/null"
} 上面这段代码先用grep在cron.allow文件(Solaris系统中)中找root,如果没有找到,就写入root。
要注意的是这个参数里的命令跟主命令遵循同样的规则,也就是说如果path没有被设置的话,需要使用绝对路径。
user
定义运行命令的用户。 注意如果你使用了这个参数,那么任何的错误输出不会在当下被捕捉,这是Ruby的一个bug。
If you are using Puppet to create this user, the exec will automatically require the user, as long as it is specified by name.
【puppet exec 示例】
1. 比如编译某个软件,执行 make命令
代码示例
?
1
2
3
4
5
6
7
8
9
file
{ “/var/nagios/configuration”:
source
=> “puppet://$pupptserver/nagios/”,
recurse =>
true ,
before => Exec["nagios-rebuid" ]
}
exec
{ “nagios-rebuild”:
command
=> “/usr/bin/make”,
cwd => “/var/nagios/configuration”
}
2.设置一个默认的PATH路径,这样我们不用每次都写path路径。
代码示例:
?
1
Exec { path => [
"/bin/" ,
"/sbin/"
, "/usr/bin/" ,
"/usr/sbin/"
] }
3.如上例,我有个命令是在/usr/local/sbin路径下,不在默认的PATH里。
代码示例:
?
1
2
3
4
exec
{ "squid" :
command
=> "/usr/local/sbin/squid" ,
path =>
"/usr/local/sbin/" ,
}
注意:这里设置了path值,会覆盖掉默认的PATH 值 。
4. 如果某个文件已存在就不执行exec.
代码示例:
?
1
2
3
4
5
exec
{ "/var/lib/puppet/report" :
command
=> "/bin/mkdir -p /var/lib/puppet/report" ,
creates =>
"/var/lib/puppet/report"
}
上例中如果/var/lib/puppet/report存在,puppet就不执行exec.
5.有时候我们需要满足某个条件的时候,才执行exec命令。
代码示例:
?
1
2
3
4
5
6
7
exec
{ "logrotate" :
path =>
"/usr/bin:/usr/sbin:/bin" ,
onlyif =>
"test `du /var/log/messages | cut -f1` -gt 100000"
}
注意:设置only只有在命令结果返回为0的时候才执行。
onlyif 也可以接受 数组做为其值,例如:
?
1
onlyif => ["test -f /tmp/file1" ,
"test -f /tmp/file2" ]
上面的代码限定了只有在所有数组中的条件返回true时exec才会被执行。
6. 当两个资源有依赖关系,如当某个配置文件有改动时,exec执行相应的命令
代码示例:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
file
{ "/etc/aliases" :
source
=> " puppet://server/module/aliases " ,
}
exec
{ newaliases:
path => ["/usr/bin" ,
"/usr/sbin" ],
subscribe => File["/etc/aliases" ],
refreshonly =>
true ,
}
7.记录puppet 执行失败后的log日志。
代码示例:
?
1
2
3
4
5
6
7
8
9
exec
{ "delete_str_tmp" :
path =>
"/usr/local/bin/:/bin:/usr/sbin" ,
command
=> 'find /tmp/ -name "*.str" -type f | xargs -n 1 rm' ,
logoutput =>
"on_failure" ,
}
【puppet exec 总结】
puppet管理exec 资源主要是调用shell来完成,有一定的风险性。只要熟悉使用shell ,可以很方便的写出属与自己的
类,或者模块等。下章会为大家介绍puppet运维自动化管理 cron资源。
原创文章,转载请注明: 文章地址puppet
运维自动化之Exec资源管理
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com