让厨师来告诉docker是否已安装在Linux上

太太

我试图在安装护罩的节点上找到Docker的存在。

资源块如下所示:

ruby_block "install_docker" do
not_if {shell_out('docker -v').stdout =~ /Docker version/i}
block do
    #command_out = shell_out('docker version --format \'{{.Server.Version}}\'')
end
action :create
notifies :write, 'log[installing_docker_log]', :immediately
notifies :install, 'package[install_docker_ce]', :immediately
notifies :install, 'yum_package[install_docker_ce_cli]', :immediately
notifies :install, 'yum_package[install_containerd_io]', :immediately
notifies :create, "directory[create_docker_dir]", :immediately
notifies :create, "directory[create_etc_docker_dir]", :immediately
notifies :create, "cookbook_file[create_docker_daemon_json]", :immediately
notifies :create, "cookbook_file[create_docker_99_docker_config]", :immediately
notifies :run, "execute[chgrp docker_dir]", :immediately
notifies :run, "execute[chmod docker_dir]", :immediately
notifies :run, "execute[chgrp /etc/docker]", :immediately
notifies :run, "execute[chmod /etc/docker]", :immediately end

在厨房里跑的时候,我得到这个输出,说守卫失败了。如果未安装docker,则失败。所以我假设shell_out函数抛出异常,但是我对ruby和Chef还是陌生的,所以不确定如何使其静音。

我是否要检查docker是否以其他方式安装?非常感谢您提供的任何帮助。

       Compiled Resource:
       ------------------
       # Declared in /tmp/kitchen/cache/cookbooks/kpmi_linux_base/recipes/install_docker.rb:54:in `from_file'

       ruby_block("install_docker") do
         action [:create]
         default_guard_interpreter :default
         declared_type :ruby_block
         cookbook_name "kpmi_linux_base"
         recipe_name "install_docker"
         block #<Proc:0x000000000470c8b8 /tmp/kitchen/cache/cookbooks/kpmi_linux_base/recipes/install_docker.rb:56>
         not_if { #code block }
       end

       System Info:
       ------------
       chef_version=16.1.16
       platform=centos
       platform_version=7.6.1810
       ruby=ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
       program_name=/opt/chef/bin/chef-client
       executable=/opt/chef/bin/chef-client


   Running handlers:
   [2020-06-05T18:30:39+00:00] ERROR: Running exception handlers
   Running handlers complete
   [2020-06-05T18:30:39+00:00] ERROR: Exception handlers complete
   Chef Infra Client failed. 0 resources updated in 10 seconds
   [2020-06-05T18:30:39+00:00] FATAL: Stacktrace dumped to /tmp/kitchen/cache/chef-stacktrace.out
   [2020-06-05T18:30:39+00:00] FATAL: Please provide the contents of the stacktrace.out file if you file a bug report
   [2020-06-05T18:30:39+00:00] FATAL: Errno::ENOENT: ruby_block[install_docker] (kpmi_linux_base::install_docker line 54) had an error: Errno::ENOENT: No such file or directory - docker
德拉科·阿特

您的问题不是“如何知道,是否已安装docker”,实际上是您使用Chef的方式。您正在尝试使用Chef资源编写一个普通的bash脚本。与bash脚本相比,这没有给您带来任何优势,但是使事情变得更加复杂。

查看您的代码,我看到您:

  1. 检查是否安装了docker
  2. 如果尚未安装,请安装并配置它。

Chef很聪明,所以您不必做第1点。立即转到第2点。您的食谱应如下所示:

package 'docker_ce'           # install docker_ce package
yum_package 'docker_ce_cli'   # install docker_ce_cli package
yum_package 'containerd_io'   # install containerd_io package

directory '/etc/docker' do    # create /etc/docker directory
  owner 'root'                # set owner for /etc/docker
  group 'root'                # set group for /etc/docker
  mode '0755'                 # set mode for /etc/docker
end

cookbook_file [...] do
  owner 'root'                
  group 'root'                
  mode '0755'
end

[...]

大部分Chef内置资源(如程序包,目录,文件等),除了execute,ruby_block和仅运行任意代码的其他资源外,都是幂等的这意味着,如果已经安装了该软件包,则不会尝试再次安装它;如果该目录存在,它将不会尝试创建它,等等。因此,您不必自己进行检查,Chef会这样做。您只需要描述计算机的所需状态。

另请注意,您不需要execute更改模式或组的资源,可以在directorycookbook_file资源本身内部设置模式和所有者/组

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何判断Chef客户端是否已安装在Linux上?

Docker绑定安装在Linux上是否会降低性能?

如何检查目录是否已安装在光盘X上以及是否未安装目录

CEPH RBD安装在Linux上是否支持引导设备?

有没有一种有效的方法来查询产品是否已安装在Windows上并检索IdentifyingNumber

如何检查CentOS 5.x系统上的/ tmp目录是否已安装在tmpfs上?

如何检查我的其他应用程序是否已安装在iOS 10上?

检查我的应用程序是否已安装在Windows Phone上

检查Windows安全修补程序是否已安装在多台服务器上

检测程序是否安装在机器上

如何确定Linux上是否已正确安装Mono?

默认情况下,.ssh文件是否自动安装在linux系统上?

如何在 Haskell 中判断一个程序是否安装在 Linux 上

如何检查Perl模块是否已安装在系统中

如何检查这些php模块(如mod_php5.c)是否已安装在我的服务器上?

当前安装在系统上的进程是否可能通过知道root用户的密码来升级其特权?

是否有等效的方式来记住已安装的卷(如DOS)上的目录

Linux上的zfs是否足够可靠,可以与gentoo一起安装在网络附加存储上?

已成功安装Python 3.1.2,但使用命令检查其是否已安装在我的PC上时,它无法识别该命令集

Jekyll的安装在OSX上是否需要GCC?

如何确定Java VM是否安装在Windows上?

如何确定Apache是否安装在系统上?

mysql-server 无法安装在 linux 上

VSIX Installer扩展不能安装在任何当前已安装的产品上

在Linux上显示已安装的USB设备

PHP模块未显示在站点上,但已安装在服务器上。

如何使用jsp检查应用程序是否已安装在移动设备中?

检查Google Maps应用是否已安装在react-native iOS中

Android - 检查应用程序是否已安装在模拟器中