puppet - Puppet:客户端机器上的“puppet agent --test”。我无法在主机和客户端机器上执行 ssh
问题描述
#/etc/puppetlabs/code/environments/production/modules/mymodule/manifests/init.pp
class mymodule {
file { "/bin/extend_shutdown.sh":
mode => "0644",
owner => 'root',
group => 'root',
source => 'puppet:///modules/mymodule/extend_shutdown.sh',
}
file { "/bin/server_shutdown.sh":
mode =>"777",
owner =>'root',
group => 'root',
source => 'puppet:///modules/mymodule/server_shutdown.sh',
}
file { "/bin/user_activity.sh":
mode =>"777",
owner =>'root',
group => 'root',
source => 'puppet:///modules/mymodule/user_activity.sh',
}
file { "/bin/new_cron.sh":
mode =>"777",
owner =>'root',
group =>'root',
source => 'puppet:///modules/mymodule/new_cron.sh',
}
file { "/home/azureuser/shutdown.sh":
mode =>"777",
owner =>'root',
group =>'root',
source => 'puppet:///modules/mymodule/shutdown.sh',
}
file { "/bin/tag.sh":
mode => "777",
owner => 'root',
group => 'root',
source =>'puppet:///modules/mymodule/tag.sh',
}
#file { "/etc/profile":
#mode => "777",
#owner => 'root',
# group => 'root',
# source =>'puppet:///modules/mymodule/profile',
# }
file { "/etc/.bash_aliases":
mode => "777",
owner => 'root',
group => 'root',
source =>'puppet:///modules/mymodule/.bash_aliases',
}
#file { "/etc/profile.d/alias.sh":
# mode => "777",
# owner =>'root',
# group =>'root',
# source => 'puppet:///modules/mymodule/alias.sh',
# }
file { "/bin/max_timetrack.sh":
mode => "777",
owner =>'root',
group => 'root',
source => 'puppet:///modules/mymodule/max_timetrack.sh',
}
}
#azureuser@disk-bkp:/rescue/etc/puppetlabs/code/environments/production/manifests$ cat site.pp
node default {
include mymodule
cron {'user_tracking':
ensure => 'present',
command => 'bash /bin/user_activity.sh',
hour => ['*'],
minute => ['30'],
user => 'root',
}
#cron {'shutdown1':
# ensure =>'present',
# command => 'bash /bin/server_shutdown.sh',
# hour => ['*'],
# minute => ['*/15'],
# user => 'azureuser',
#}
cron {'new_cron':
ensure => 'present',
command => 'bash /bin/new_cron.sh',
hour => ['*'],
minute => ['*'],
user => 'root',
}
exec {'shutdown_running_status':
command => 'cat /var/log/syslog | grep server_shutdown.sh',
provider => shell,
}
exec { 'reconfigure_cron':
command => 'bash /home/azureuser/test.sh',
provider => shell,
}
exec {'input.log':
command => 'user=`whoami`;sudo touch /usr/bin/input_${user}.log ; sudo chmod 777 /usr/bin/input_${user}.log',
provider => shell,
}
exec {'profile':
command => 'echo "source /etc/.bash_aliases" >> /etc/bash.bashrc',
path => [ '/bin', '/sbin' , '/usr/bin', '/usr/sbin' ],
provider => 'shell',
unless => 'cat /etc/bash.bashrc |grep -i /etc/.bash_aliases',
}
exec {'getting_tag':
command => 'sudo bash /bin/tag.sh',
path => [ '/bin', '/sbin' , '/usr/bin', '/usr/sbin' ],
provider => 'shell',
}
exec {'folder_creation':
command => 'sudo mkdir /pg',
path => [ '/bin', '/sbin' , '/usr/bin', '/usr/sbin' ],
provider => 'shell',
unless => 'ls -ld /pg',
}
exec {'deleting_log_file':
command => 'sudo cd /pg/; sudo rm *',
path => [ '/bin', '/sbin' , '/usr/bin', '/usr/sbin' ],
provider => 'shell',
}
}
在客户端机器上执行后,客户端和主服务器可以正常工作一到两个小时puppet agent --test
,然后它们就会中断。看起来该/bin
文件夹正在被删除。我收到此错误:
错误:ubuntu@18.222.8.217:权限被拒绝(公钥)
我在多台机器上尝试了相同的代码,但所有机器都处于相同状态。我的代码有什么问题?
解决方案
问题似乎是这样的:
exec {'deleting_log_file': command => 'sudo cd /pg/; sudo rm *', path => [ '/bin', '/sbin' , '/usr/bin', '/usr/sbin' ], provider => 'shell', }
执行cd
命令 viasudo
不会影响宿主 shell 的工作目录,所以后续rm *
会以当时 Puppet 代理的工作目录运行。这不太可能/pg
,因此您要求 Puppet 删除与您预期不同的文件。删除的文件是/bin
.
您因几个错误的决定而一枪打死自己。首先,您可能会更好地使用Tidy
资源而不是使用自己的资源Exec
:
tidy { 'Clean out /pg':
path => '/pg',
age => 0,
recurse => true,
rmdirs => false,
}
但是要小心,因为如果/pg
有子目录(这可能会或可能不会反映您的版本中的另一个缺陷),其效果与您的原始效果不同。
选择了一个Exec
代替,没有必要sudo
在命令中引入。如果代理完全可以执行请求的操作,那么它就不需sudo
要这样做,因为它首先会以特权运行。如果 Puppet 在没有特权的情况下运行,那么sudo
将无济于事,因为 Puppet 不会提供密码。如果命令刚刚出现cd /pg; rm *
,那么它更有可能起作用。
选择了一个Exec
,也没有必要通过两个命令的复合来表达想要的操作。改用rm /pg/*
. cd
这消除了由于失败或失效而导致错误文件被删除的任何风险。这里的一般原则是首选绝对路径。
因此,如果您坚持使用Exec
,那么这会更好:
exec {'deleting_log_file':
command => '/bin/rm /pg/*',
provider => 'shell',
}
总体而言,您的代码相当不习惯。Puppet 不是脚本引擎,不应将 Puppet 清单视为或构建为脚本类似物。除其他事项外,Exec
应考虑使用 s 介于粗略黑客和最后手段之间的某个位置,并且基本上所有代码都应该在模块中的类中,而不是直接在节点块中。
推荐阅读
- python - ValueError:未找到 data_id 554 的数据集
- vue.js - 是什么导致 vue.js 内存泄漏
- sass - 安装 parallelshell@3.0.2 和 onchange@7.1.0 后尝试运行 npm start 时遇到问题
- google-chrome-extension - 我什么时候需要在我的 chrome 扩展程序中使用“主机权限”?
- javascript - 启用时未启用 Angular UI 开关
- lightningchart - LightningchartJS BUG报告:实时应用程序中的波形每隔一段时间就会冻结
- azure - Azure 流分析:如何在运行时和以编程方式更新查询?
- java - 将用户输入创建的值存储在循环内以用于循环的其他迭代
- php - 如何在 laravel 中修剪视频并进入刀片
- python - 在 vscode 中未检测到 Discord.py