首页 > 解决方案 > 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:权限被拒绝(公钥)

我在多台机器上尝试了相同的代码,但所有机器都处于相同状态。我的代码有什么问题?

标签: puppet

解决方案


问题似乎是这样的:

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 介于粗略黑客和最后手段之间的某个位置,并且基本上所有代码都应该在模块中的类中,而不是直接在节点块中。


推荐阅读