让厨师看守来判断 docker 是否安装在 linux 上
making a chef guard to tell if docker is installed on 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 和厨师的新手,所以我不确定如何让它静音。
我要检查 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引擎,这里有一些。
- 检查docker命令是否存在
command -v docker
- 检查包管理器(假设您使用的是 ubuntu)
dpkg -l | grep -i docker
- 检查docker是否在路径
中
which docker
并且您可以找到许多其他方法来检查 docker 是否存在...
您的问题不在于 "How to tell, if docker is installed",而在于您如何使用 Chef。您正在尝试使用 Chef 资源编写一个普通的 bash 脚本。与 bash 脚本相比,这不会给您带来任何优势,但会使事情变得更加复杂。
查看您的代码,我发现您:
- 检查是否安装了docker
- 安装并配置它,如果没有安装。
大厨很聪明,不用做第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 内置资源(如包、目录、文件等),除了执行、ruby_block 和其他只是 运行 任意代码的资源,都是 幂等的。这意味着如果包已经安装,它不会尝试再次安装它,如果目录存在,它不会尝试创建它等等。所以你不必自己进行检查,Chef 会这样做。您只需要描述您机器的期望状态。
另请注意,您不需要更改模式或组的 execute
资源,您可以在 directory
或 [= 中设置模式和 owner/group 13=] 资源本身。
我试图在安装之前找到 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 和厨师的新手,所以我不确定如何让它静音。
我要检查 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引擎,这里有一些。
- 检查docker命令是否存在
command -v docker
- 检查包管理器(假设您使用的是 ubuntu)
dpkg -l | grep -i docker
- 检查docker是否在路径 中
which docker
并且您可以找到许多其他方法来检查 docker 是否存在...
您的问题不在于 "How to tell, if docker is installed",而在于您如何使用 Chef。您正在尝试使用 Chef 资源编写一个普通的 bash 脚本。与 bash 脚本相比,这不会给您带来任何优势,但会使事情变得更加复杂。
查看您的代码,我发现您:
- 检查是否安装了docker
- 安装并配置它,如果没有安装。
大厨很聪明,不用做第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 内置资源(如包、目录、文件等),除了执行、ruby_block 和其他只是 运行 任意代码的资源,都是 幂等的。这意味着如果包已经安装,它不会尝试再次安装它,如果目录存在,它不会尝试创建它等等。所以你不必自己进行检查,Chef 会这样做。您只需要描述您机器的期望状态。
另请注意,您不需要更改模式或组的 execute
资源,您可以在 directory
或 [= 中设置模式和 owner/group 13=] 资源本身。