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

[经验分享] 运维自动化好帮手:ansible软件入门篇

[复制链接]

尚未签到

发表于 2018-7-29 08:04:28 | 显示全部楼层 |阅读模式
  一:关于自动化我们要知道的
  1、自动化是什么?
  IT运维自动化是一组将静态的设备结构转化为根据IT服务需求动态弹性响应的策略,目的就是实现IT运维的质量,降低成本。可以说自动化运维一定是IT运维高层面的重要属性之一。
  2、为什么要使用自动化技术?
  当公司规模扩大,从初期的几台服务器发展到庞大的数据中心时,自然而然的单靠人工就无法满足在技术、业务、管理等方面的要求,那么标准化、自动化、架构优化、过程优化等降低IT服务成本的因素越来越被人们所重视。
  3、自动化的目的是什么?
  自动化作为其重要属性之一已经不仅仅只是代替人工操作,更重要的是深层探知和全局分析,关注的是在当前条件下如何实现性能与服务最优化,同时保障投资收益最大化。
  二:自动化工具——Ansible软件详解
  1、是什么
  基于python开发的,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
  2、Ansible软件特点
  ①部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
  ②默认使用SSH协议对设备进行管理;
  ③有大量常规运维操作模块,可实现日常绝大部分操作。
  ④配置简单、功能强大、扩展性强;
  ⑤支持API及自定义模块,可通过Python轻松扩展;
  ⑥通过Playbooks来定制强大的配置、状态管理;
  ⑦轻量级,无需在客户端安装agent,更新时,只需在操作机上 进行一次更新即可;
  ⑧提供一个功能强大、操作性强的Web管理界面和REST API接口 ——AWX平台。
  3、Ansible基本架构图 && 核心组件说明
DSC0000.jpg

Ansible:Ansible核心程序。  
HostInventory:记录由Ansible管理的主机信息,包括端口、密码 、ip等。
  
Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件 中,定义主机需要调用哪些模块来完成的功能。
  
CoreModules:核心模块,主要操作是通过调用核心模块来完成管 理任务。
  
CustomModules:自定义模块,完成核心模块无法完成的功能, 支持多种语言。
  
ConnectionPlugins:连接插件,Ansible和Host通信使用
  4、ansible任务执行模式:单个命令、批量命令
  ①ad-hoc模式:使用单个模块,支持批量执行单条命令。 ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。
  ②playbook模式:是Ansible主要管理方式,也是Ansible功能强大的关 键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc进行操作的配置文件。
  5、ansible执行流程 && 流程描述
DSC0001.jpg

1、加载自己的配置文件 默认/etc/ansible/ansible.cfg  
2、查找对应的主机配置文件,找到要执行的主机或者组
  
3、加载自己对应的模块文件,如command
  
4、通过ansible将模块或命令生成对应的临时py文件,并将该文件传 输至远程服务器的
  
5、对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件
  
6、给文件+x执行
  
7、执行并返回结果
  
8、删除临时py文件,sleep 0退出
  三:Ansible常用命令及用法
  ※常用命令
/usr/bin/ansible               # Ansibe AD-Hoc 临时命令执行工具,常用于临时命 令的执行  
/usr/bin/ansible-doc           # Ansible 模块功能查看工具
  
/usr/bin/ansible-galaxy        # 下载/上传优秀代码或Roles模块 的官网平台 ,基于网络的
  
/usr/bin/ansible-playbook      # Ansible 定制自动化的任务集编排工具
  
/usr/bin/ansible-pull          # Ansible远程执行命令的工具,拉取配置而非推 送配置(使用较少,海量机器时使用,对运维的架构能力要求较高)
  
/usr/bin/ansible-vault         # Ansible 文件加密工具
  
/usr/bin/ansible-console       # Ansible基于Linux Consoble界面可与用户交互的命令执行工具
  ※命令详解
  1、ansible-doc
  (1)命令格式
  ansible-doc [options] [module...]
  (2)options
  -h:--help  显示命令参考API文档
  -l:--list    列出可用模块
  -M module_path:--module-path=module_path    指定模块路径
  -s mode_name:--snippet    获取指定模块的使用帮助
  --version:显示版本信息
  2、ansible
  (1)命令格式
①ansible [-f forks] [-m module_name] [-a args]  
②ansible  <host-pattern> [options] Options
  (2)options
· -a MODULE_ARGS, --args=MODULE_ARGS :模块的参数,如果执行默认COMMAND的模块,即是命令参数 ,如:“date”,“pwd”等等 module arguments 模块  
参数
  
· -m MODULE_NAME, --module-name=MODULE_NAME:执行模块的名字,默认使用&quot;command&quot; 模块,所以如果是只执行单一命令可以不用
  
· -M MODULE_PATH, --module-path=MODULE_PATH:要执行的模块的路径(default:/usr/share/ansible)
  
· -f FORKS, --forks=FORKS: 并行任务数(default:5)
  
· -C, --check:测试模式。测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化
  
· -c connection,--connection=CONNECTION:连接类型使用(default:smart)
  
· -v, --verbose(-vvv,-vvvv):显示命令执行的详细信息/超详细信息 (常和-C配合使用,用于运行前测试环节)
  
· -i INVENTORY, --inventory-file=INVENTORY:指定主机清单存放路径,默认为/etc/ansible/hosts
  
· -S, --su :使用 su 命令
  
· -R SU_USER, --su-user=SU_USER 指定SU的用户(default:root)
  
· -s, --sudo:以sudo方式运行(不需要密码)
  
· -U SUDO_USER, --sudo-user=SUDO_USER :sudo到哪个用户(default:root)
  
· -T TIMEOUT, --timeout=TIMEOUT:指定SSH默认超时时间(default:10s)
  
· -u REMOTE_USER, --user=REMOTE_USER:默认连接到远程主机哪个用户(default:root)
  
· -k, --ask-pass:登陆密码,提示输入ssh密码而不是假设基于密钥的验证
  
· -K, --ask-sudo-pass:提示密码使用sudo,sudo表示提权操作
  
· -B SECONDS, --background=SECONDS:后台运行超时时间
  
· -h,--help:查看帮助
  
· -o, --one-line:压缩输出,摘要输出,尝试将所有内容都在一行上输出。
  
· -private-key=PRIVATE_KEY_FILE:私钥路径,使用这个文件来验证连接
  (3)常用模块
  ①ping 测试主机网络连通性
[root@server ~]# ansible all -m ping  
172.17.214.75 | SUCCESS => {
  
    &quot;changed&quot;: false,
  
    &quot;ping&quot;: &quot;pong&quot;
  
}
  
172.17.214.74 | SUCCESS => {
  
    &quot;changed&quot;: false,
  
    &quot;ping&quot;: &quot;pong&quot;
  
}
  ②command执行命令
[root@server ~]# ansible webserver -m command -a 'ifconfig'  在webserver主机组上执行命令ifconfig  注意:命令模式下,'' 的用法  :'命令名称+用空格分隔的列表参数', 给定的命令将在所有指定节点上执行,但不支持shell命令模式,如下列几种:
  $arg、&quot;<&quot;、&quot;>&quot;、&quot;|&quot;、&quot;;&quot;、&quot;&&quot;等shell命令,有其特定的命令:
  · chdir=dir_name:切换目录
  · executable:切换shell来执行命令(注意:命令要使用绝对路径表示)
  · free_form:要执行的linux命令,一般用-a选项代替
  · creates=file_name:文件存在,则命令不执行,只可用来做判断
  · removes=file_name:文件存在,则命令执行,也用来做判断
  使用示例如下:
①[root@server ~]# ansible all -m command -a 'creates=/app/hehe.w  ls'  
172.17.214.74 | SUCCESS | rc=0 >>
  
skipped, since /app/hehe.w exists
  
172.17.214.75 | SUCCESS | rc=0 >>
  
skipped, since /app/hehe.w exists
  
因为两主机都存在此文件,所以ls命令不执行
  

  
②[root@server ~]# ansible all -m command -a 'removes=/app/hehe.w ls'
  
172.17.214.74 | SUCCESS | rc=0 >>
  
172.17.214.75 | SUCCESS | rc=0 >>
  
两主机文件存在,则执行此ls命令
  ③shell 远程主机执行shell命令(支持管道、重定向等特殊符号)
[root@server ~]# ansible all -m shell -a 'cat /etc/passwd | grep &quot;root&quot;'  
172.17.214.74 | SUCCESS | rc=0 >>
  
root:x:0:0:root:/root:/bin/bash
  
172.17.214.75 | SUCCESS | rc=0 >>
  
root:x:0:0:root:/root:/bin/bash
  ④copy    复制文件到远程主机
copy模块常见用法:  

  
1、复制文件
  
-a &quot;src= dest= &quot;
  

  
2、生成指定内容的文件
  
-a &quot;content= dest= &quot;
  
copy模块常用选项:
  
①backup=<yes|no> :覆盖文件之前,备份原文件
  
②content:功能与重定向&quot;>&quot;相同,文件存在则覆盖文件内容(default),不能存在则创建指定内容文件
  
③dest:文件或目录,必须为绝对路径
  
④src:文件或目录,相对路径|绝对路径。
  
⑤directory_mode:递归设置目录权限,默认为系统默认权限
  
⑥force yes|no :设为yes时,若目标主机包含该文件,则强制覆盖;若为no,则只有目标主机不存在该文件时才复制。(default:yes)
  
⑦others:所有file模块里的选项都可以在这里面使用。
  ⑤file    设置文件属性
常见用法:  

  
1、创建目录
  
-a 'path= state=directory'
  

  
2、创建链接文件
  
-a 'path= src= state=link'
  

  
3、删除文件
  
-a 'path= state=absent'
  

  
4、常见选项:
  
①force yes|no:强制创建软链接。第一,源文件不存在,但稍后会创建;第二,目标软链接已存在,需要先取消之前的链接关系,创建新的软链接。
  
②group:定义文件/目录的属组 mode:定义文件/目录权限
  
③owner:定义文件/目录的属主 path:定义文件/目录路径(必选项)
  
④recurse:递归设置文件属性
  
⑤src:被链接的源文件路径,只应用于state=link
  
⑥dest:被链接的文件路径,只应用于state=link
  
⑦state:
  
    directory:若目录不存在,则创建目录
  
    file:文件不存在也不创建
  
    link:创建软连接
  
    hard:创建硬链接
  
    touch:若文件不存在,则会创建一个新文件, 若存在,则更新时间戳
  
    absent:删除文件、目录、链接文件
  ⑥fetch    从远程某主机获取文件到本地
dest:本机用来存放拉过来的文件或目录的目录  
src:远程文件。(只能为文件)
  ⑦cron    管理计划任务
常见action:  
    cron backup=<yes|no>:创建一个crontab备份
  
    cron_file=file_name:如果使用,使用这个cron.d,而不是单个用户
  
常见时间选项:
  
    day= #日应该运行的工作( 1-31, *, */2, )
  
    hour= # 小时 ( 0-23, *, */2, )
  
    minute= #分钟( 0-59, *, */2, )
  
    month= # 月( 1-12, *, /2, )
  
    weekday # 周 ( 0-6 for Sunday-Saturday)
  
常用选项:
  
    jod=&quot;&quot;    :指明执行的命令
  
    name=&quot;&quot;:任务描述
  
    reboot    任务在重启时运行。(不建议使用,建议使用special_time)
  
    special_time=&quot;&quot;:特殊的时间范围,参数有:reboot(重启时),annually(每年),monthly(每月),weekly (每周),daily(每天),hourly(每小时)
  
    state=&quot;&quot;:指定状态,常见状态有present(添加定时任务)、absent(删除定时任务)
  
    user=&quot;&quot;:以哪个用户身份去运行
  
eg:每五分钟同步各主机时间
  
[root@server ~]# ansible all -m cron -a 'name=&quot;sync date per second 5 min&quot; minute=&quot;*/5&quot; job=&quot;/usr/sbin/ntpdate 172.17.0.1 &> /dev/null&quot;'
  
[root@server ~]# ansible all -m shell -a 'crontab -l'    #查看计划任务添加情况
  ⑧yum    安装软件
name=                  #所安装的包的名称  
state=                 #present(安装), latest(安装最新的), absent(卸载软件)。
  
update_cache           #强制更新yum的缓存。
  
conf_file              #设定远程yum安装时所依赖的配置文件。如配置文件没有在默认的位置。
  
disable_gpg_check      #是否禁止GPG checking,只用于`present‘ or `latest’。
  
disablerepo            #临时禁止使用yum库。 只用于安装或更新时
  
enablerepo             #临时使用的yum库。只用于安装或更新时。
  ⑨service    服务管理
arguments     #命令行提供额外的参数  
enabled=<true|false>     #设置开机启动。
  
name=       #服务名称
  
runlevel    #开机启动的级别,一般不用指定。
  
sleep       #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。
  
state       #started启动服务, stopped停止服务, restarted重启服务, reloaded重载配置
  ⑩user    用户和账号管理
comment    # 用户的描述信息  
createhome # 是否创建家目录
  
force      # 在使用state=absent时, 行为与userdel –force一致.
  
group      # 指定基本组 groups # 指定附加组,如果指定为(groups=)表示删除所有组
  
home       # 指定用户家目录 move_home # 如果设置为home=时, 试图将用户主目录移动到指定的目录
  
name       # 指定用户名
  
non_unique # 该选项允许改变非唯一的用户ID值
  
password   # 指定用户密码
  
remove     # 在使用state=absent时, 行为是与userdel –remove一致
  
shell      # 指定默认shell
  
state      # 设置帐号状态,不指定为创建,指定值为absent表示删除
  
system     # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
  
uid        # 指定用户的uid
  
update_password   # 更新用户密码
  ⑪group 组管理,添加或删除组
gid       #设置组的GID号  
name=     #组名
  
state     #指定组状态,默认为创建(present),设置值为absent为删除
  
system    #设置值为yes,表示为创建系统组
  ⑫script 运行服务器端脚本
ansible all -m script -a '/root/test.sh'  ⑬setup 查看机器所有facts信息
  ※facts是什么?
  facts是一个内建变量。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件。
  ※setup模块主要功能
  setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。 setup模块下经常使用的一个参数是filter参数,具体使用示例如下(由于输出结果较多,这里只列命令不写结果):
setup常用命令格式:  
#ansible web -m setup     //查看主机所有变量
  
#ansible 10.212.52.252 -m setup -a 'filter=ansible_*_mb'      //查看主机内存信息
  
#ansible 10.212.52.252 -m setup -a 'filter=ansible_eth[0-2]'  //查看地接口为eth0-2的网卡信息
  
#ansible all -m setup --tree /tmp/facts         //将所有主机的信息输入到/tmp/facts目录下,每台主机的信息输入到主机名文件中,如下为命令执
  
行结果:
  
    [root@server ~]# ls /tmp/facts/
  
    172.17.214.74  172.17.214.75
  四:Ansible playbook
  1、playbook简介
  (1)playbook是ansible用于配置,部署,和管理被控节点的剧本
  (2)通过playbook的详细描述,执行其中一系列tasks来操控节点
  (3)演员:计算机
  剧本:playbook
  2、playbook使用场景
  (1)ad-doc适合执行单条命令,当命令较多时,需要playbook
  (2)playbook有自己的语法格式
  (3)可以将常用的命令集合编写为playbook
  3、playbook编写详解
  (1)语法格式
①开头:文件的第一行应该以 ”—” (三个连字符)开始,表明YMAL文件的开始。  
②注释:在同一行中,#之后的内容表示注释,类似于shell,python和ruby。
  
③列表元素:YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。
  
eg:- apple - banana - orange  等价于python列表    [&quot;apple&quot;,&quot;banana&quot;,&quot;orange&quot;]
  
④常用对象指定:play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以&quot;:&quot;分隔表示,&quot;:&quot;后面还要增加一个空格。
  (2)playbook组件详解
①Hosts:运行指定任务的目标主机  
    (a)主机清单默认为/etc/ansible/hosts,也可自己指定文件,通过-i file_name指定
  
        (b) ansible --list-hosts 显示哪些主机参与到task的执行中
  
②remote_user:远程主机上执行任务的用户
  
③sudo_user:切换远程主机上执行任务的用户
  
④tasks:    任务列表,配合各模块使用才有功能。
  
    module_name: modile arguments
  
注意:shell和command模块后可直接跟命令,而非key=value参数列表
  
⑤handlers 任务,在特定条件下被触发,接收到其他任务的通知时被触发
  
格式:
  
      tasks:
  
        - name: restart httpd service
  
          service: name=httpd states=stopped
  
          notify: httpd_manager
  
          handlers:
  
        - name: httpd_manager
  
          service: name=httpd states=started
  

  
⑥变量 Variables
  
方法1)facts:可直接调用
  
注意:可使用setup模块直接获取目标主机的facters;
  
方法2)用户自定义变量
  
    (a)命令行定义:ansible-playbook   *.yml  -e  var1=value1
  
        eg:①定义变量名
  
                    tasks:
  
        - name: stop httpd service
  
          service: name={{ service_name }} states=stopped  ##定义变量service_name
  
                ②命令行引用变量
  
                    ansible-playbook web.yml -e service_name=httpd       ##关闭httpd服务
  
    (b).yml文件中定义:
  
        vars:
  
        - var1: value1
  
        - var2: value2
  
注意:vars位置为hosts之下,tasks之外,与tasks等级相同
  
方法3)通过roles传递变量
  
方法4)Host Inventory         主机清单文件自中定义
  
    (a) 向不同主机传递不同的变量:
  
            ip/hostname var1=value1 var2=value2
  
    (b)向组中的主机传递相同变量
  
            [group_name:vars]    //原样输入即可
  
            var1=value1          //指定变量及变量值
  

  
⑦tags:为单个执行命令打标签
  
1)修改yml文件
  
tasks:
  
        - name: restart httpd service
  
          service: name=httpd states=stopped
  
          tags: restart-httpd
  
2)命令行引用tags,运行单独task
  
absible-playbook  web.yml  -t  restart-httpd     ”-t“ 引用tag,运行指定命令
  4、playbook运行方法
(1)试运行  
ansible-playbook --check/-C      #测试运行yml文件,不执行真正操作,用来查看是否有错误
  
ansible-playbook --list-hosts    #列出执行task所用主机
  
ansible-playbook
  
(2)直接运行
  
ansible-playbook  *.yml
  5、playbook字典
语法示例:  
- name: add some users
  
   user: name={{ item.name }} group={{ item.group }} state=present
  
   with_items:
  
   - { name:'user11',group:'group11' }
  
   - { name:'user22',group:'group22' }
  6、playbook条件测试
(1)条件测试:when  
用法:在task中使用,jinja2的语法格式
  
eg:
  
        tasks:
  
            - name: install conf file to centos7
  
              template: src=files/nginx.conf.c7.j2
  
              when: ansible_distribution_major_version == &quot;7&quot;
  
            - name: install conf file to centos6
  
               template: src=files/nginx.conf.c6.j2
  
               when: ansible_distribution_major_version == &quot;6&quot;
  
               (2)循环:迭代,需要重复执行的任务
  
用法:①对迭代项的引用,固定变量名为    &quot;item&quot;
  
           ②而后,要在task中使用with_items给定要迭代的元素列表
  
eg:
  
    - hosts: web
  
    remote_user: root
  
    tasks:
  
      - name: uninstall web packages
  
        yum: name={{ item }} state=absent
  
        with_item:
  
        - httpd
  
        - php
  
        - php-mysql
  
        - php-fpm
  7、roles 角色定制
(1)功能  
roles 用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等。roles就是通过分别将变量(vars)、文
  
件(file)、任务(tasks)、模块 (modules)及处理器(handlers)放置于单独的目录中,并可以便捷 地include它们的一种机制。角色一般用于基于主机构建
  
服务的场 景中,但也可以是用于构建守护进程等场景中。要使用 roles只需要在playbook中使用include指令即可。
  

  
(2)角色集合
  
①mysql/
  
②httpd/
  
③nginx/
  
④files/:  存储由copy或script等模块调用的文件;
  
⑤tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml 进行“包含”调用;
  
⑥handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由 main.yml进行“包含”调用;
  
⑦vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由 main.yml进行“包含”调用;
  
⑧templates/:存储由template模块调用的模板文本;
  
⑨meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的 文件需要由main.yml进行“包含”调用;
  
⑩default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;
  

  
(3)角色定制操作步骤
  
①在role目录下生成对应的目录结构
  
mkdir -pv ./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default}
  
②定义/tasks/main.yml的配置文件
  
- name: cp
  
   copy: src=nginx-1.10.2-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.10.2- 1.el7.ngx.x86_64.rpm
  
- name: install
  
   yum: name=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm state=latest
  
- name: conf template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  
  tags: nginxconf
  
  notify: new conf to reload
  
  name: start service
  
  service: name=nginx state=started enabled=true
  
③修改变量文件
  
  vars/main.yml     添加变量nginx_port: “8888”
  
④定义handlers文件
  
    handlers/main.yml
  
    - name: new conf to reload
  
       service: name=nginx state=restarted
  
⑤定义/etc/ansible/nginx.yml的playbook文件
  
    - hosts: nginx
  
      remote_user: root
  
      roles:
  
        - nginx
  
⑥可以通过roles传递变量
  
- hosts: nginx
  
  remote_user: root
  
  roles:
  
    - { role: nginx, nginxport: 12345 }
  
⑦也可以配置多个角色
  
roles:
  
# - { role: nginx, nginxport: 12345 }
  
     - { role: memcached

运维网声明 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-542783-1-1.html 上篇帖子: ansible: Linux批量管理神器 下篇帖子: ansible实战应用之——自动化系统上线
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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