设为首页 收藏本站
查看: 530|回复: 0

[经验分享] puppet基础篇(练习篇)

[复制链接]

尚未签到

发表于 2018-8-1 13:27:00 | 显示全部楼层 |阅读模式
核心类型:  
                group: 组
  user:用户
  packge:程序包
  service:服务
  file:文件
  exec:执行自定义命令,要求幂等
  cron:周期性任务计划
  notify:通知###资源定义
  通过资源类型的属性赋值来实现资源定义,这也称为资源类型实例化。定义资源实例化的文件即清单:manifest
  ###属性:attribute
  资源属性中三个个特殊属性(几乎所有的资源中都有)
  namevar,可简写为name,描述资源的名字
  ensure,描述资源的目标状态
  provider,资源的管理接口
  语法;
  type {'title':
  attribute1 => value1,
  atrribute2=> value2,
  ……
  }
  
        #创建清单的目录
  [root@node1 puppet]# mkdir manifests
  [root@node1 puppet]# cd manifests/
  

  ###资源类型
  1.group
  group{'nginx':
  ensure  =>  present,
  name    =>  'nginx',
  system  =>  true,
  }
  #干跑模式
  [root@node1 manifests]# puppet apply --verbose --noop first.pp
  Notice: Compiled catalog for node1.localdomain in environment production in 0.15 seconds
  Info: Applying configuration version '1500559833'
  Notice: /Stage[main]/Main/Group[nginx]/ensure: current_value absent, should be present (noop)
  Notice: Class[Main]: Would have triggered 'refresh' from 1 eventsNotice: Stage[main]: Would have triggered 'refresh' from 1 events
  Notice: Finished catalog run in 0.04 seconds
  #执行
  [root@node1 manifests]# puppet apply --verbose --debug  first.pp
  Info: Applying configuration version '1500560157'
  Debug: Executing '/usr/sbin/groupadd -r nginx'
  Notice: /Stage[main]/Main/Group[nginx]/ensure: createdNotice: Finished catalog run in 0.08 seconds
  #查看
  [root@node1 manifests]# tail -1 /etc/group
  nginx:x:995:2.user
  2.user
  #查看user资源的各种用法
  puppet describe user
  

  #列出的资源管理接口,可自定义
  Providers
  ---------
  aix, directoryservice, hpuxuseradd, ldap, pw, user_role_add, useradd,
  windows_adsi
  #示例
  [root@node1 manifests]# vi user.pp
  user{'nginx':
  uid     =>  444,
  gid     =>  'nginx',
  system  =>  true,    ensure  =>  present,
  }
  

  puppet apply -v --noop user.pp
  Notice: Compiled catalog for node1.localdomain in environment production in 0.20 seconds
  Info: Applying configuration version '1500561782'
  Notice: /Stage[main]/Main/User[nginx]/ensure: current_value absent, should be present (noop)
  Notice: Class[Main]: Would have triggered 'refresh' from 1 events
  Notice: Stage[main]: Would have triggered 'refresh' from 1 events
  Notice: Finished catalog run in 0.04 seconds
  

  [root@node1 manifests]# puppet apply -v  user.pp
  Notice: Compiled catalog for node1.localdomain in environment production in 0.21 seconds
  Info: Applying configuration version '1500561816'
  Notice: /Stage[main]/Main/User[nginx]/ensure: createdNotice: Finished catalog run in 0.07 seconds
  

  [root@node1 manifests]# tail -1 /etc/passwd
  nginx:x:444:995::/home/nginx:/bin/bash
  

  关系源参数
  before require notify subscribe四个元参数来定义资源间的相关性
  资源定义有依赖关系,优先级
  

  资源可以被定义,也可以被引用,资源的引用通过"Type['title']" 注意:首字母必须大写
  #示例
  vi redis.pp
  user{'redis':
  gid     =>  'redis',    ensure  =>  present,
  require =>  Group['redis'],
  }
  

  group{'redis':
  ensure  =>  present,    #before =>User['redis'],
  }
  

  

  puppet apply -v -d --noop redis.pp
  Info: Applying configuration version '1500562662'
  Notice: /Stage[main]/Main/Group[redis]/ensure: current_value absent, should be present (noop)
  Debug: /Stage[main]/Main/Group[redis]: The container Class[Main] will propagate my refresh event
  Notice: /Stage[main]/Main/User[redis]/ensure: current_value absent, should be present (noop)
  Debug: /Stage[main]/Main/User[redis]: The container Class[Main] will propagate my refresh eventNotice: Class[Main]: Would have triggered 'refresh' from 2 events
  Debug: Class[Main]: The container Stage[main] will propagate my refresh eventNotice: Stage[main]: Would have triggered 'refresh' from 1 events
  

  [root@node1 manifests]# puppet apply -v -d  redis.pp
  

  [root@node1 manifests]# grep -i "redis" /etc/passwd
  redis:x:1001:1001::/home/redis:/bin/bash3.package
  

  3.package
  [root@node1 manifests]# puppet describe package
  

  package
  =======Manage packages.
  

  Parameters
  ----------
  - **ensure**    What state the package should be in.
  `present` (also called `installed`), `absent`,
  `purged`, `held`, `latest`.
  

  - **install_options**Requires features install_options.
  

  - **instance**    A read-only parameter set by the package.
  

  - **name**    The package name.
  

  - **source**    Where to find the package file.
  #示例1
  
        vi package.pp
  
        package{'redis':
  
        ensure      =>  latest,
  
    }
  

  [root@node1 manifests]# puppet apply -v -d --noop package.pp
  Notice: /Stage[main]/Main/Package[redis]/ensure: current_value absent, should be latest (noop)
  Debug: /Stage[main]/Main/Package[redis]: The container Class[Main] will propagate my refresh event
  Notice: Class[Main]: Would have triggered 'refresh' from 1 events
  Debug: Class[Main]: The container Stage[main] will propagate my refresh event
  Notice: Stage[main]: Would have triggered 'refresh' from 1 events
  #执行
  [root@node1 manifests]# puppet apply -v  package.pp
  Notice: Compiled catalog for node1.localdomain in environment production in 0.53 seconds
  Info: Applying configuration version '1500564098'
  Notice: /Stage[main]/Main/Package[redis]/ensure: created
  Notice: Finished catalog run in 2.93 seconds
  

  [root@node1 manifests]# rpm -q redis
  redis-3.2.3-1.el7.x86_64
  #示例2
  [root@node1 manifests]# vi jdk.pp
  

  package{'jdk':
  ensure      =>  present,
  source      =>  '/root/jdk-7u79-linux-x64.rpm',
  provider    =>  rpm,
  }
  4.service
  [root@node1 manifests]# puppet describe service
  

  service
  =======Manage running services.Parameters
  ----------
  

  - **binary**    The path to the daemon.
  

  - **enable**    Whether a service should be enabled to start at boot.
  

  - **ensure**    Whether a service should be running.
  Valid values are `stopped` (also called `false`), `running` (also called
  `true`).
  

  - **flags**    Specify a string of flags to pass to the startup script.
  Requires features flaggable.
  

  - **hasrestart**    Specify that an init script has a `restart` command.
  the init script's `stop` and `start` commands will be used.
  Valid values are `true`, `false`.
  #对应这个脚本有没有restart操作
  作用:如果命令有restart,就用restart,没有就stop,再start
  

  - **hasstatus**
  

  - **path**
  The search path for finding init scripts.
  #脚本搜索的路径:
  centos6:/etc/init
  centos7:/usr/lib/systemd/system/
  - **start**
  Specify a *start* command manually.
  #手动定义start不用脚本的
  

  - **restart**
  Specify a *restart* command manually.
  

  #通常定义reload操作
  

  - **pattern**
  The pattern to search for in the process table.
  

  Providers
  ---------
  base, bsd, daemontools, debian, freebsd, gentoo, init, launchd, openbsd,
  openrc, openwrt, redhat, runit, service, smf, src, systemd, upstart,
  windows
  

  #示例
  [root@node1 manifests]# puppet apply -v -d --noop service.pp
  

  Notice: /Stage[main]/Main/Service[redis]/ensure: current_value stopped, should be running (noop)
  Debug: /Stage[main]/Main/Service[redis]: The container Class[Main] will propagate my refresh event
  Info: /Stage[main]/Main/Service[redis]: Unscheduling refresh on Service[redis]
  Notice: Class[Main]: Would have triggered 'refresh' from 1 events
  Debug: Class[Main]: The container Stage[main] will propagate my refresh event
  Notice: Stage[main]: Would have triggered 'refresh' from 1 events
  

  [root@node1 manifests]# puppet apply -v -d service.pp
  

  Info: Applying configuration version '1500565381'
  Debug: Executing '/usr/bin/systemctl is-active redis'
  Debug: Executing '/usr/bin/systemctl is-enabled redis'
  Debug: Executing '/usr/bin/systemctl start redis'
  Debug: Executing '/usr/bin/systemctl is-enabled redis'
  Debug: Executing '/usr/bin/systemctl enable redis'
  Notice: /Stage[main]/Main/Service[redis]/ensure: ensure changed 'stopped' to 'running'
  

  [root@node1 manifests]# ss -tlnp | grep redis
  LISTEN     0      128    127.0.0.1:6379                     *:*                   users:(("redis-server",pid=6817,fd=4))
  

  #示例2
  [root@node1 manifests]# vi service.pp
  

  package{'redis':
  ensure      =>  present,
  }
  

  service{'redis':
  ensure      =>  running,
  enable      =>  true,
  require     =>  Package['redis'],
  }
  

  5.file
  [root@node1 manifests]# puppet describe file
  

  file
  ====
  Manages files, including their content, ownership, and permissions.
  

  Parameters
  ----------
  

  - **backup**
  

  - **checksum**
  The checksum type to use when determining whether to replace a file's
  contents.    The default checksum type is md5. Valid values are `md5`, `md5lite`, `sha256`, `sha256lite`, `mtime`,
  `ctime`, `none`.
  

  - **content**    The desired contents of a file, as a string.This attribute is mutually
  exclusive with `source` and `target`.
  

  - **ensure**    Whether the file should exist, and if so what kind of file it should be.
  Possible values are `present`, `absent`, `file`, `directory`, and
  `link`. # Equivalent resources:
  file { "/etc/inetd.conf":
  ensure => "/etc/inet/inetd.conf",
  }
  file { "/etc/inetd.conf":
  ensure => link,
  target => "/etc/inet/inetd.conf",
  }
  - **force**    Perform the file operation even if it will destroy one or more
  directories.
  - **group**    Which group should own the file.
  

  - **links**    How to handle links during file actions.
  During file copying,
  `follow` will copy the target file instead of the link, `manage`
  will copy the link itself, and `ignore` will just pass it by.
  - **mode**    The desired permissions mode for the file,
  - **mtime**
  - **owner**    The user to whom the file should belong.
  - **path** (*namevar*)    The path to the file to manage.
  -**recurse**    Whether to recursively manage the _contents_ of a directory.
  - **replace**
  - **source**    A source file, which will be copied into place on the local system.
  - **source_permissions**     Whether (and how) Puppet should copy owner, group, and mode permissions
  from
  the `source` to `file` resources when the permissions are not explicitly
  specified.
  Valid values are `use`, `use_when_creating`, and `ignore`:
  - **target**    The target for creating a link.
  

  - **validate_cmd**    A command for validating the file's syntax before replacing it.
  

  Example:
  file { '/etc/apache2/apache2.conf':
  content      => 'example',
  validate_cmd => '/usr/sbin/apache2 -t -f %',
  }
  Providers
  ---------
  posix, windows
  

  #示例1
  [root@node1 manifests]# cp /etc/redis.conf ./
  [root@node1 manifests]# vi redis.conf
  bind 0.0.0.0
  masterauth 123456
  

  [root@node1 manifests]# ll /etc/redis.conf
  -rw-r--r--. 1 redis root 46730 Aug  5  2016 /etc/redis.conf
  

  [root@node1 manifests]# vi file1.pp
  

  [root@node1 manifests]# vi file1.pp
  

  file{'/etc/redis.conf':
  ensure      =>  file,
  source      =>  '/etc/puppet/manifests/redis.conf',
  owner       =>  'redis',
  group       =>  'root',
  mode        =>  '0644',
  }
  

  [root@node1 manifests]# puppet apply -v -d --noop file1.pp
  

  [root@node1 manifests]# puppet apply -v -d --noop file1.pp
  Info: Applying configuration version '1500567458'
  Debug: Evicting cache entry for environment 'production'
  Debug: Caching environment 'production' (ttl = 0 sec)
  Info: Computing checksum on file /etc/redis.conf
  Debug: Evicting cache entry for environment 'production'
  Debug: Caching environment 'production' (ttl = 0 sec)
  Info: /Stage[main]/Main/File[/etc/redis.conf]: Filebucketed /etc/redis.conf to puppet with sum 910058e228c4ad556ffc0f473cef9323
  

  [root@node1 manifests]# cat /etc/redis.conf | egrep -i "bind 0.0.0.0|masterauth 123456"
  bind 0.0.0.0
  masterauth 123456
  

  通知元参数
  两个参数:通知和订阅,见名知意,很好理解。
  notify,subscribe
  

  A notify B:B依赖于B,且A发生改变会通知B
  {notify => Type['B'],}
  B subscribe A :B依赖与A,B订阅A资源产生的事件
  {subscribe => Type['B'],}
  

  其中有特殊情况:链式依赖
  #示例2
  [root@node1 manifests]# vi service.pp
  

  #install redis package
  package{'redis':
  ensure      =>  present,
  }#push source file to des file.
  file{'/etc/redis.conf':
  ensure      =>  file,
  source      =>  '/etc/puppet/manifests/redis.conf'
  require     =>  Package['redis'],
  }#running redis server
  service{'redis':
  ensure      =>  running,
  enable      =>  true,
  require     =>  Package['redis'],
  subscribe   =>  File['/etc/redis.conf'],
  }
  

  [root@node1 manifests]# puppet apply -v -d --noop service.pp
  [root@node1 manifests]# puppet apply -v -d service.pp
  

  #示例3:修正版 A -> B 表示A before B;B ~> C 表示B notify C;
  [root@node1 manifests]# vi service.pp
  

  #install redis package
  package{'redis':
  ensure      =>  present,
  } ->#push source file to des file.
  file{'/etc/redis.conf':
  ensure      =>  file,
  source      =>  '/etc/puppet/manifests/redis.conf',
  owner       =>  'redis',
  group       =>  'root',
  mode        =>  '0644',
  } ~>#running redis server
  service{'redis':
  ensure      =>  running,
  enable      =>  true,
  }
  #或者还可以这样表示:Package['redis'] -> File['/etc/redis.conf'] ~> Service['redis']
  

  #示例4:content用法
  [root@node1 manifests]# vi test.pp
  

  file{'/tmp/test.txt':
  ensure  =>  file,
  content =>  'Hello World!',
  }
  

  [root@node1 manifests]# puppet apply -v test.pp
  

  #note:content also can be created by template.
  [root@node1 manifests]# puppet apply -v test.pp
  Notice: Compiled catalog for node1.localdomain in environment production in 0.16 seconds
  Info: Applying configuration version '1500569471'
  Notice: /Stage[main]/Main/File[/tmp/test.txt]/ensure: defined content as '{md5}ed076287532e86365e841e92bfc50d8c'
  Notice: Finished catalog run in 0.05 seconds
  

  [root@node1 manifests]# cat /tmp/test.txt
  Hello World!
  

  #示例6:link用法
  [root@node1 manifests]# puppet apply  -v link.pp
  Notice: Compiled catalog for node1.localdomain in environment production in 0.15 seconds
  Info: Applying configuration version '1500569692'
  Notice: /Stage[main]/Main/File[/tmp/test.link]/ensure: created
  Notice: Finished catalog run in 0.04 seconds
  

  [root@node1 manifests]# ll /tmp/test.link
  lrwxrwxrwx. 1 root root 13 Jul 21 00:54 /tmp/test.link -> /tmp/test.txt
  #示例5:递归创建目录
  [root@node1 manifests]# vi mkdir.pp
  

  file{'/tmp/pam.d':
  ensure      =>  directory,
  source      =>  '/etc/pam.d',
  recurse    =>  true,
  }#note: if source is  not exist,which would create empty directory.
  

  [root@node1 manifests]# puppet apply -v mkdir.pp
  

  [root@node1 manifests]# ll /tmp/pam.d/
  total 104
  -rw-r--r--. 1 root root 192 Jul 21 00:59 chfn
  ...
  #(ps:DevOPs三个层次:bootstraping,configuration,command and control)
  

  6.exec
  [root@node1 manifests]# puppet describe exec
  

  exec
  ====Executes external commands.Any command in an `exec` resource **must** be able to run multiple times
  without causing harm --- that is, it must be *idempotent*.
  #任何能够在exec资源执行的命令必须能够重复执行,并且不产生危害,这就意味着,命令必须拥有幂等性。
  

  Parameters
  ----------
  

  - **command** (*namevar*)    The actual command to execute.
  

  - **creates**    A file to look for before running the command.
  #文件路径,当此路径的文件不存在,cmd就会执行
  exec { "tar -xf /Volumes/nfs02/important.tar":
  cwd     => "/var/tmp",
  creates => "/var/tmp/myfile",
  path    => ["/usr/bin", "/usr/sbin"]
  }
  - **cwd**    The directory from which to run the command.
  

  - **environment**    Any additional environment variables you want to set for a
  command.
  

  - **group**    The group to run the command as.
  

  - **logoutput**    Whether to log command output in addition to logging the
  exit code.
  

  - **onlyif**    If this parameter is set, then this `exec` will only run if
  the command has an exit code of 0.
  #只有这个命令运行成功才运行cmd。
  For example:
  exec { "logrotate":
  path   => "/usr/bin:/usr/sbin:/bin",
  onlyif => "test `du /var/log/messages | cut -f1` -gt 100000"
  }
  

  - **path**    The search path used for command execution.
  

  - **refresh**    How to refresh this command.
  #重新执行当前cmd的替代命令
  

  - **refreshonly**    The command should only be run as a
  refresh mechanism for when a dependent object is changed.
  #仅接收到订阅的资源的通知才运行cmd
  Valid values are `true`, `false`.
  

  - **returns**    The expected exit code(s).
  

  - **timeout**    The maximum time the command should take.
  

  - **tries**
  

  - **try_sleep**    The time to sleep in seconds between 'tries'.
  

  - **umask**    Sets the umask to be used while executing this command
  

  - **unless**    If this parameter is set, then this `exec` will run unless
  the command has an exit code of 0.
  #如果这个命令运行失败就运行cmd
  

  - **user**    The user to run the command as.Providers
  ---------
  posix, shell, windows
  

  #示例1:创建目录
  

  

  

  [root@node1 manifests]# vi exec1.pp
  

  exec{'mkdir':
  command     =>  'mkdir /tmp/testdir',
  path        =>  '/bin:/sbin:/usr/bin:/usr/sbin',
  creates     =>  '/tmp/testdir',  #directory not exist ,exec cmd.
  }
  

  

  [root@node1 manifests]# puppet apply -v exec1.pp
  Notice: Compiled catalog for node1.localdomain in environment production in 0.07 seconds
  Info: Applying configuration version '1500582762'
  Notice: /Stage[main]/Main/Exec[mkdir]/returns: executed successfully
  Notice: Finished catalog run in 0.04 seconds
  

  [root@node1 manifests]# ls /tmp/testdir/ -d
  /tmp/testdir/
  #示例2:创建用户
  [root@node1 manifests]# vi exec2.pp
  

  exec{'adduser':
  command     =>  'useradd -r mogilefs',
  path        =>  '/bin:/sbin:/usr/bin:/usr/sbin',
  unless      =>  'id mogilefs',      #unless id cmd success,exec comd.
  }
  

  [root@node1 manifests]# puppet apply -v exec2.pp
  Notice: Compiled catalog for node1.localdomain in environment production in 0.07 seconds
  Info: Applying configuration version '1500583160'
  Notice: /Stage[main]/Main/Exec[adduser]/returns: executed successfully
  Notice: Finished catalog run in 0.10 seconds
  

  [root@node1 manifests]# grep -i "mogilefs" /etc/passwd
  mogilefs:x:442:442::/home/mogilefs:/bin/bash
  

  [root@node1 manifests]# id mogilefs
  uid=442(mogilefs) gid=442(mogilefs) groups=442(mogilefs)
  #示例3
  package{'httpd':
  ensure      =>  latest,
  } ~>
  

  exec{'adduser':
  command     =>  'useradd -r httpd',
  path        =>  '/bin:/sbin:/usr/bin:/usr/sbin',
  unless      =>  'id httpd',     #unless id cmd success,exec comd.
  refreshonly =>  true,
  }
  

  [root@node1 manifests]# grep -i "httpd" /etc/passwd
  apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
  httpd:x:442:442::/home/httpd:/bin/bash
  

  7.cron
  

  [root@node1 manifests]# puppet describe cron
  

  cron
  ====Installs and manages cron jobs.
  #cron资源必要要有一个周期性的属性
  

  cron { logrotate:
  command => "/usr/sbin/logrotate",
  user    => root,
  hour    => ['2-4'],
  minute  => '*/10'
  }Parameters
  ----------
  

  - **command**    The command to execute in the cron job.
  - **ensure**    The basic property that the resource should be in.Valid values are `present`, `absent`.
  - **environment**    Any environment settings associated with this cron job.
  

  - **hour**
  - **minute**
  - **month**
  - **monthday**
  - **name**    The symbolic name of the cron job
  - **special**    A special value such as 'reboot' or 'annually'.
  - **target**    The name of the crontab file in which the cron job should be stored.
  #添加哪个用户的任务
  - **user**
  - **weekday**
  #示例1
  [root@node1 manifests]# vi cron1.pp
  

  cron{'synctime':
  command     =>  '/usr/sbin/ntpdate 172.16.0.1 &> /dev/null',
  name        =>  'synctime from ntp server',
  minute      =>  '*/30',
  }
  

  [root@node1 manifests]# puppet apply -v cron1.pp
  [root@node1 manifests]# crontab -l | grep '172.'
  */30 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null
  

  8.notify
  [root@node1 manifests]# puppet describe notify
  

  notify
  ======Sends an arbitrary message to the agent run-time log.
  Parameters
  ----------
  

  - **message**    The message to be sent to the log.
  

  - **name**    An arbitrary tag for your own reference; the name of the message.
  

  - **withpath**    Whether to show the full object path. Defaults to false. Valid values are `true`, `false`.
  

  #示例
  [root@node1 manifests]# puppet apply -v notify1.pp
  Notice: Compiled catalog for node1.localdomain in environment production in 0.03 seconds
  Info: Applying configuration version '1500584971'
  Notice: hi,you are welcome!
  Notice: /Stage[main]/Main/Notify[sayhi]/message: defined 'message' as 'hi,you are welcome!'
  Notice: Finished catalog run in 0.03 seconds

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-544850-1-1.html 上篇帖子: 52.puppet自动化运维工具 下篇帖子: 通过puppet批量自动安装软件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表