一篇文章写三遍,去除杂质,提炼干货。这是一系列有温度的博客。

文章目录

  • Ansible 是什么?怎么和云原生扯在一起了?
  • 安装 ansible
  • 配置证书登录
  • Ansible 配置文件
    • Inventory 定义方法
      • 将主机IP、端口、用户名、密码写在配置文件的不同组中,多种写法格式如下
  • Andible 常用模块和基本操作
    • ping 模块
      • debug模块
      • copy模块
      • template模块
      • file模块
      • user模块
      • shell模块
      • service/systemd
      • archive&unarchive
        • 1. archive模块
        • 2. unarchive模块
  • Ansible playbook
      • 执行playbook命令
    • playbook基本语法
    • 任务列表
      • 幂等性
    • playbook的handlers与notify
      • 一、Ansible handlers的作用
      • 二、如何配置handlers
    • playbook的变量定义与调用
      • vars定义变量
      • 引用变量
    • 流程控制
    • 使用template实现灵活配置
      • 一、Ansible template 作用
  • Ansible 之 roles 使用

Ansible 是什么?怎么和云原生扯在一起了?

不了解 Ansible 的朋友可能会问出第一个问题,了解 Ansible 的朋友可能会问出第二个问题。跟着我这个系列的朋友可能还有另外的问题,比如:我看人家 Docker 之后都是 k8s 了呀,你这,你是不是不行啊?

哈哈,这些个问题不先解答一下这篇还真的很难继续编下去了。

我们先回过头来看一张 DevOps 的图:

上一篇没有什么文字,你们是不是以为这是三个人捆在一起开发呀?

想的有点多哦。

这是一个人要集三种能力于一身哦!!!我个人认为这是一种趋势,现在不是还出现了一种 “轻代码” 的开发模式吗,这些都快不是暗示了,简直是要明示了。


Ansible 是什么?是一门运维语言,是目前对我们这些开发党来说,性价比高的一门运维语言。

DevOps 是云原生的一个重要理念。所以,Ansible 自然也就和 云原生 扯在一起了。

Ansible 我会分两篇来写,第一篇先来一些基础概念,第二篇讲我自己使用的经验。


安装 ansible

Ansible可以运行在任何机器上,但是对管理机有一定要求。管理机应安装Python 2(2.7)或Python 3(3.5或更高版本),另外,管理机不支持Windows控制节点。我们可以使用Linux发行版包管理器、源码安装或者Python包管理器(PIP)来安装Ansible。

我使用的是 CentOS7。

1、配置EPEL YUM

2、yum install ansible -y #yum安装最新版

3、ansible --version #安装后查看版本以及模块路径等信息

配置证书登录

为了使Ansible与客户端通信,需要使用用户帐户配置管理机和客户机。为了方便快捷安全,一般会配置证书方式连接客户机。

在所有客户机和管理上创建新的ansible用户之后,我们在管理机(ansible用户)生成SSH密钥,然后将SSH公钥复制到所有客户机。

ssh-keygen

三个回车,要是想后面执行一条命令就要输入一次 ssh 密码的话也可以给它个密码。

现在,将SSH公钥复制到所有客户机,这使管理机ansible用户无需输入密码即可登录客户机:

ssh-copy-id -i ~/.ssh/id_rsa.pub 远程主机名@远程主机ip


Ansible 配置文件

1、/etc/ansible/hosts:主机列表清单,也叫Inventory。在大规模的配置管理工作中,特别是云服务提供商或者IDC厂家,需要管理不同业务的不同机器,这些机器的信息都存放在Ansible的inventory组件里面。在我们使用Ansible进行远程主机管理时,必须先将主机信息存放在inventory里面,这样才能使用Ansible对它进行操作。如果不想使用默认清单的话可以用-i选项指定自定义的清单文件,防止多人混合使用一个主机清单。如果没有定义在主机列表文件中,执行命令会提示“No hosts matched”

2、/etc/ansible/ansible.cfg:Ansible服务主配置文件,比如并发数控制等在此文件定义

Inventory 定义方法

将主机IP、端口、用户名、密码写在配置文件的不同组中,多种写法格式如下

vim /etc/ansible/hosts
[webserver]  #组名为webserver
192.168.1.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456"
192.168.1.32 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456"
192.168.1.33 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456"
192.168.1.36 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456"[dbserver]  #组名为dbserver
192.168.1.4[1:3] ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456"  #连续IP的简写[redis]
192.168.1.5[1:3]
[redisserver:vars]  #将信息定义为变量
ansible_ssh_pass="123456"[nginx] #推荐写法
nginx_1 ansible_ssh_host=192.168.1.61 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456"
nginx_2 ansible_ssh_host=192.168.1.62 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456"

Andible 常用模块和基本操作

这些常用的模块,就好比基本功,基本招式一样,我们需要掌握这些基本功,掌握这些基本招式。

ping 模块

ping是测试远程节点的SSH连接是否就绪的常用模块,但是它并不像Linux命令那样简单地ping一下远程节点,而是先检查能否通过SSH登陆远程节点,再检查其Python版本能否满足要求,如果都满足则会返回pong,表示成功。使用方式如下:

ansible web -m ping

ping无须任何参数。上述命令输出结果如下所示:

192.168.1.2 | SUCCESS => {"changed": false,"ping": "pong"
}

debug模块

打印输出信息,类似Linux上的echo命令。在后续的学习过程中,我们会经常用这个命令来调试我们写的playbook。

对于debug模块有两种用法。下面就对这两种用法都进行详细的总结。

  • 通过参数msg定义打印的字符串
    msg中可以嵌入变量,比如我先定义了以下的一个playbook。
  ---- hosts: webvars:name: jellythinktasks:- name: displaydebug: msg="I am {{name}}"
  • 通过参数var定义需要打印的变量
    变量可以是系统变量,也可以是动态的执行结果,通过关键字register注入变量中。对于变量,我们可以这样玩:
---- hosts: webvars:name: jellythinktasks:- name: displaydebug:var: name

对于注入变量,可以这样玩:

---- hosts: webtasks:- name: register varshell: hostnameregister: result- name: displaydebug:var: result

copy模块

从当前的机器上复制静态文件到远程节点上,并且设置合理的文件权限。copy模块在复制文件的时候,会先比较一下文件的 checksum,如果相同则不会复制,返回状态为 OK;如果不同才会复制,返回状态为 changed。

一般情况的使用,就是这样的:

---- hosts: server1tasks:- name: copyDemocopy:src: /home/jelly/nameList.txt dest: /home/test1/nameList.txt

在实际的工作中,一般会在进行文件分发时,需要备份原文件,这个时候就需要我们加上backup选项:

---- hosts: server1tasks:- name: copyDemocopy:src: /home/jelly/nameList.txt dest: /home/test1/nameList.txtbackup: yes

加上backup: yes后,在目标主机上,就会对原来的文件进行备份。

template模块

如果只是复制静态文件,使用copy模块就可以了;但是如果在复制的同时需要根据实际情况修改部分内容,那么就需要用到template模块了。

比如我们在分发配置文件时,每个配置文件需要根据远程主机的一些属性不同而配置不同的值,对于需要替换的部分,我们就可以使用template模块来进行替换。template模块使用的是Python中的Jinja2模板引擎,这里我们不需要过多的去关注这个模板引擎,只需要知道变量的表示法是{{}}就可以了。比如这里就有一个http.conf.j2的模板文件(我见过的更多的模板文件后缀都是 yaml 的),文件内容如下:

Listen {{ansible_default_ipv4.address}}
Port {{http_port}}

其中{{ansible_default_ipv4.address}}就是需要根据不同的主机,动态变化的。接下来,我们就可以这样使用template模块来完成变量的替换。

---- hosts: server1vars:http_port: 8080tasks:- name: Write Config Filetemplate:src: http.conf.j2dest: /home/test1/http.conf

在目的主机上,文件内容如下:

Listen 192.168.1.3
Port 8080

copy模块一样,template模块也可以进行权限设置和文件备份等功能。

file模块

file模块可以用来设置远程主机上的文件、软链接和文件夹的权限,也可以用来创建和删除它们。

我们可以使用mode参数进行权限修改,可以直接赋值数字权限(必须以0开头)。

---- hosts: server1tasks:- name: Modify Modefile:path: /home/test1/http.confmode: 0777

我们还可以根据state参数的不同,实现不同的行为,比如创建软链接:

---- hosts: server1tasks:- name: Create Soft Linkfile:src: /home/test1/http.confdest: /home/test1/confstate: link

也可以设置state: touch创建一个新文件,比如这样:

---- hosts: server1tasks:- name: Create a new filefile:path: /home/test1/touchfilestate: touch mode: 0700

还可以设置state: directory新建一个文件夹,比如这样:

---- hosts: server1tasks:- name: Create directoryfile: path: /home/test1/testDirstate: directorymode: 0755

user模块

user模块可以对用户进行管理,实现增、删、改Linux远程节点的用户账户。比如增加用户:

---- hosts: server1tasks:- name: Add useruser:name: test3

删除用户:

---- hosts: server1tasks:- name: Add useruser:name: test3state: absentremove: yes

但是在使用这个user模块时,需要注意权限问题。

shell模块

在远程节点上通过/bin/sh执行命令。如果一个命令可以通过模块yumcopy模块实现时,那么建议不要使用shell或者command这样通用的命令模块。因为通用的命令模块不会根据具体操作的特点进行状态判断,所以当没有必要再重新执行的时候,它还是会重新执行一遍。

  • 支持<>|;&

    ---
    - hosts: server1tasks:- name: Test shellshell: echo "test1" > ~/testDir/test1 && echo "test2" > ~/testDir/test2
    
  • 调用脚本

    ---- hosts: server1tasks:- shell: ~/test.sh >> somelog.txt
    

    在执行命令之前,我们可以改变工作目录,并且仅在文件somelog.txt不存在时执行命令,除此之外,还可以指定用bash运行命令:

 ---- hosts: server1tasks:- shell: ~/test.sh >> somelog.txtargs:chdir: ~/testDircreates: somelog.txtexecutable: /bin/bash

service/systemd

管理服务。

- name: 服务管理service:name: etcdstate: started#state: stopped#state: restarted#state: reloaded
- name: 设置开机启动service:name: httpdenabled: yes
- name: 服务管理  systemd: name=etcd state=restarted enabled=yes daemon_reload=yes

archive&unarchive

1. archive模块

功能:在远端主机打包与压缩;

主要参数如下:

参数 说明
path 要压缩的文件或目录
dest 压缩后的文件
format 指定打包压缩的类型:bz2、gz、tar、xz、zip
  • 示例一:将 /var/log 目录压缩为 tar.gz 格式,并存储至 /opt 目录下;

    [root@xuzhichao ~]# ansible 192.168.20.23 -m archive -a 'path=/var/log dest=/opt/log.tar.gz format=gz'[root@nginx03 ~]# ll /opt
    total 692
    -rw-r--r-- 1 root root 705807 Aug  2 15:22 log.tar.gz
    
2. unarchive模块

功能:在远端主机解包与解压缩;

主要参数如下:

参数 说明
src 要解压的软件包路径
dest 解压到目标位置,需要是一个目录
remote_src yes:要解压的包在被控端、no:要解压的包在控制端
owner 文件复制到远程并设定属主,默认为root
group 文件复制到远程并设定属组,默认为root
mode 文件复制到远程并设定权限,默认file=644,directory=755
  • 示例一:把压缩包推送到被控端,在被控端主机解压缩:
  #把压缩包拷贝到远端主机:[root@xuzhichao ~]# ansible 192.168.20.23 -m copy -a 'src=/root/nginx-1.20.1.tar.gz dest=/tmp/'#在远端主机解压缩:[root@xuzhichao ~]# ansible 192.168.20.23 -m copy -a 'src=/tmp/nginx-1.20.1.tar.gz dest=/tmp/nginx-1.20.1 remote_src=yes'
  • 示例二:压缩包在ansible主机上,直接解压到被控主机:
  [root@xuzhichao ~]# ansible 192.168.20.23 -m unarchive -a 'src=/root/nginx-1.20.1.tar.gz dest=/tmp/'[root@nginx03 ~]# ll /tmp/total 0drwxr-xr-x 8 xu1 xu1 158 May 25 20:35 nginx-1.20.1

Ansible playbook

playbook本质是包含了一个或多个play的YAML配置文件,通常以.yaml或者.yml结尾。在单一的一个playbook文件中,使用连续的三个中横线(—)作为每个play的区分。

执行playbook命令

我们都是按照yaml语法规则来编写playbook。

Ansible提供了一个单独的命令:ansible-playbook命令,我们可以通过这个命令来执行yaml脚本。常见的ansible-playbook的使用方法如下:

最简单的使用方法:

ansible-playbook copyDemo.yaml

我们还可以使用以下命令查看输出的细节:

ansible-playbook copyDemo.yaml --verbose

我们也可以使用以下命令查看该yaml脚本将影响的主机列表:

ansible-playbook copyDemo.yaml --list-hosts

还可以使用以下命令检查yaml脚本语法是否正确:

ansible-playbook copyDemo.yaml --syntax-check

上面的几种使用方法基本就涵盖了我们日常工作中80%的场景了,剩余的20%场景,比如并行、异步等,很少用到,等真正用到的时候再去查阅相关资料也来的及。而工作中,更多的时候,我们不是在编写playbook,就是在编写playbook的路上。所以,接下来我重点说说如何写这个playbook,也就是playbook的基本语法。

playbook基本语法

最基本的playbook脚本分为三个部分:

  1. 在哪些机器上以什么身份执行
  2. 执行的任务有哪些
  3. 善后任务有哪些

我们在编写playbook脚本的时候,总是离不开上面的三个部分的。下面先来一个稍微有点复杂的playbook脚本,让大家先有一个整体的认识。

---
- hosts: server1user: rootvars:http_port: 80max_clients: 200tasks:- name: Write apache config filetemplate: src=/home/test1/httpd.j2 dest=/home/test2/httpd.confnotify:- restart apache- name: Ensure apache is runningservice: name=httpd state=startedhandlers:- name: restart apacheservice: name=httpd state=restarted

任务列表

任务列表是整个playbook的核心,对于任务列表,我们首先需要知道以下三点内容:

  • 任务是从上到下顺序执行的,如果中间发生错误,那么整个playbook会中止,除非 ignore error;
  • 每一个任务都是对模块的一次调用,只是使用不同的参数和变量而已;
  • 每一个任务最好有一个name属性,这样在执行yaml脚本时,可以看到执行进度信息(也方便失败的时候快速定位)。

对于任务的参数有两种不同的写法,我们在编写yaml脚本时,可以按照自己的喜好进行选择。

写法一:

- name: Write apache config filetemplate: src=/home/test1/httpd.j2 dest=/home/test2/httpd.conf

写法二:

- name: Write apache config filetemplate: src: /home/test1/httpd.j2dest: /home/test2/httpd.conf

这两种写法都是OK的,我一般喜欢第二种写法。

最后,对于任务我们还需要特别一个点,那就是任务的执行状态。我们在执行Ansible Ad-Hoc或者ansible-playbook的时候,在输出中都会有一个changed字段,比如:

192.168.1.3                : ok=2    changed=0    unreachable=0    failed=0

或者

192.168.1.3                : ok=2    changed=1    unreachable=0    failed=0

这里的这个changed就是任务的执行状态,但是它为什么一会是0,一会有是1呢?这就要说到Ansible中一个叫做“幂等性”的概念。

幂等性

幂等性是数学和计算机科学上一个常见的概念,多次执行产生的结果不会发生改变,这样的特性就被成为幂等性。

大多数的Ansible模块在设计时保证了幂等性,幂等性保证了Ansible脚本多次执行情况下的相同结果,尽可能的避免使用那些不能满足幂等性的模块。比如我们经常使用的shell模块就是非幂等性的。

我们要明白Ansible是以“结果为导向的”,我们指定了一个“目标状态”,Ansible会自动判断“当前状态”是否与“目标状态”一致,如果一致,则不进行任何操作;如果不一致,那么就将“当前状态”变成“目标状态”,这就是“幂等性”,“幂等性”可以保证我们重复的执行同一项操作时,得到的结果是一样的。

那这个幂等性与上面的changed又有什么关系呢?且听我下面慢慢道来!

  • changed为false或者0时,表示Ansible没有进行任何操作,没有“改变什么”;
  • changed为true或者大于0时,表示Ansible执行了操作,“当前状态”已经被Ansible改变成了“目标状态”。

copy这个模块来举例子说明,当我们准备将一个文件通过Ansible拷贝到远程主机时,copy模块首先检查远程是否已经存在了该文件,如果不存在,则把文件拷贝过去,返回changed为大于0;如果存在时,则开始比对两个文件的md5值,如果md5值一致,则说明两个文件是一样的,则不需要拷贝,此时copy模块则什么都不干,返回changed为0。

playbook的handlers与notify

一、Ansible handlers的作用

handlers是一种触发器,它可以对task进行监控,如果task所指定的任务状态发生变化,则进行notify通知,然后触发额外的一系列操作,看一个示例来帮助理解:

- hosts: webserversremote_user: roottasks:- name: install apacheyum: name=httpd state=latest- name: install configure file for httpdcopy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf- name: start httpd serviceservice: enabled=true name=httpd state=started

上面的YAML文件存在三个task任务,分别是安装httpd、复制配置文件到远端主机、启动httpd服务。但是当第二个task中的配置文件发生了改变后再次执行playbook的话,会发现新的配置文件虽然会正确的复制到远端主机去,但是却没有重启httpd服务。因为Ansible在执行playbook时发现第三个任务与现在状态是一致的,就不会再次执行任务。为了解决这种问题,就需要使用ansible的handlers功能。handlers是用于监控一个任务的执行状态,如果一个tasks任务最后是changed状态则会触发handlers指定的操作。

二、如何配置handlers

Ansible中通过notify这个模块来实现handlers,将示例1修改后:

- hosts: webserversremote_user: roottasks:- name: install apacheyum: name=httpd state=latest- name: install configure file for httpdcopy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.confnotify:- restart httpd  #通知restart httpd这个触发器- check httpd  #可以定义多个触发器- name: start httpd serviceservice: enabled=true name=httpd state=startedhandlers:  #定义触发器,和tasks同级- name: restart httpd  #触发器名字,被notify引用,两边要一致service: name=httpd state=restart- name: check httpdshell: netstat -ntulp | grep 80

当httpd.conf的源文件发生修改后,只需重新执行playbook就会自动重启httpd服务,因为配置文件状态是changed而非ok。

playbook的变量定义与调用

1.作用:将playbook中的某些值使用变量代替,从而简化playbook的编写
2.变量简介:要创建的用户、要安装的软件包、要重启的服务、要删除的文件、要从互联网检索的文档
3.方法:变量名应该由字母、数字、下划线组成,变量名需要以字母开头,ansible内置的关键字不能作为变量名。
4.范围

全局范围:从命令行或ansible配置设置的变量
play范围:在play和相关结构中设置的变量
主机范围:由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量
如果多个级别上定义了相同名称的变量,优先采用级别最高的变量,窄范围优先于广范围

vars定义变量

1、playbook中的变量(vars和vars_files)

vars:- testvar1: testfile- testvar2: testfile2

在定义变量时,还能够以类似”属性”的方式定义变量,示例如下

---
- hosts: testBremote_user: rootvars:httpd:conf80: /etc/httpd/conf.d/80.confconf8080: /etc/httpd/conf.d/8080.conftasks:- name: task1file:path: "{{httpd.conf80}}"state: touch- name: task2file:path: "{{httpd.conf8080}}"state: touch

引用变量

当我们需要引用这两个变量时,有两种语法可用

"{{httpd.conf80}}"

在外部文件定义playbook变量(vars_files)
在playbook中引入包含变量的文件时,需要使用vars_files关键字,被引入的文件需要以- 开头,以YAML中块序列的语法引入,示例如下

---
- hosts: testBremote_user: rootvars_files:- httpd_vars.ymltasks:- name: task1file:path={{httpd.conf80}}state=touch- name: task2file:path={{httpd['conf8080']}}state=touch

在外部文件中写入

  - testvar1: testfile- testvar2: testfile2
httpd:conf80: /etc/httpd/conf.d/80.confconf8080: /etc/httpd/conf.d/8080.conf

上例中使用vars_files关键字引入了对应的变量文件,然后使用了文件中定义的变量。

上例中vars_files关键字只引入了一个变量文件,也可以引入多个变量文件,每个被引入的文件都需要以- 开头,示例如下

 vars_files:- /testdir/ansible/httpd_vars.yml- /testdir/ansible/other_vars.yml

“vars”关键字和”vars_files”关键字可以同时使用,如下

 vars:- conf90: /etc/httpd/conf.d/90.confvars_files:- /testdir/ansible/httpd_vars.yml

流程控制

条件:

tasks:
- name: 只在192.168.1.100运行任务debug: msg="{{ansible_default_ipv4.address}}"when: ansible_default_ipv4.address == '192.168.1.100'

循环:

tasks:
- name: 批量创建用户user: name={{ item }} state=present groups=wheelwith_items:- testuser1- testuser2
- name: 解压copy: src={{ item }} dest=/tmpwith_fileglob:- "*.txt"

常用循环语句:

语句 描述
with_items 标准循环
with_fileglob 遍历目录文件
with_dict 遍历字典

使用template实现灵活配置

一、Ansible template 作用

是什么前面说了,这里就直接看怎么用。

---
- hosts: allremote_user: rootvars:- listen_port: 88    #定义变量tasks:- name: Install Httpdyum: name=httpd state=installed- name: Config Httpdtemplate: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf    #使用模板notify: Restart Httpd- name: Start Httpdservice: name=httpd state=startedhandlers:- name: Restart Httpdservice: name=httpd state=restarted

遗漏部分在文末补全。


Ansible 之 roles 使用

函数。

所有的 role 单独放在一个 名为 roles 的目录下,在 playbook 中调用 role 的方式为:

- include_role: 某个 role 所在目录名

或者

roles: 某个 role 所在目录名

每个 role 下面有个 tasks 目录,里面至少得有 main.yaml 文件,会被调用到。

每个role下面有个目录叫meta,在里面可以新建文件main.yml,在文件中可以设置该role和其它role之前的关联关系。

云原生之 Ansible 篇(一)相关推荐

  1. 云原生 | Docker:基础篇

    目录 前言 1.1 Docker 入门 1.2 Docker 架构 1.3 Docker 仓库 1.4 Docker 安装 1.5 Docker 镜像加速器 1.6 Docker 镜像 1.7 Doc ...

  2. 【云原生】第一篇--应用(Application)部署容器化演进之路

    应用(Application)部署容器化演进之路 一.应用程序部署痛点 1.1 应用程序部署流程 1.2 应用程序扩缩容 1.3 应用程序多环境部署 二. 计算资源应用演进过程 2.1 使用物理服务器 ...

  3. 【云原生】第二篇--容器管理工具 Docker生态架构及部署

    容器管理工具 Docker生态架构及部署 一.Docker生态架构 1.1 Docker Containers Are Everywhere 1.2 生态架构 1.2.1 Docker Host 1. ...

  4. 【云原生 | Docker 基础篇】03、Docker 阿里云镜像加速器

    目录 一.阿里云镜像加速 1.是什么 2.注册一个属于自己的阿里云账户(可复用淘宝账号) 3.进入控制台 4.选择容器镜像服务 5.获取加速器地址 6.配置镜像加速器 二.永远的 Hello Word ...

  5. 【云原生 | Docker 高级篇】03、搭建 Redis 3主3从集群

    目录 3主3从redis集群配置 一.新建6个docker容器redis实例 二.进入容器redis-node-1并为6台机器构建集群关系 三.链接进入6381作为切入点,查看节点状态 四.​​​​​ ...

  6. 【云原生 | Docker 高级篇】06、Docker 网络模式详解

    目录 一.Docker 平台架构图解 ​整体说明: 二.Docker 网络是什么 三.Docker 网络常用基本命令 1.查看网络 2.查看网络源数据 3.删除网络 4.案例 ​四.Docker 能干 ...

  7. 什么是云原生?一篇让你看懂

  8. 应云而生,幽灵的威胁 - 云原生应用交付与运维的思考

    作者 | 易立  阿里云资深技术专家 来源|阿里巴巴云原生公众号 本系列文章: 第一篇 - 云原生基础设施 第二篇 - 云原生软件架构 第三篇 - 云原生应用交付与运维(本文) 过去的 2020 是充 ...

  9. 应云而生,幽灵的威胁 - 云原生应用交付与运维

    简介:过去的 2020 是充满不确定性的一年,但也是充满机遇的一年.突发的新冠疫情为全社会的数字化转型按下加速键.云计算已经不再是一种技术,而是成为支撑数字经济发展和业务创新的关键基础设施.在利用云计 ...

  10. 我对云原生软件架构的观察与思考

    简介:云原生应用架构的目标是构建松耦合.具备弹性.韧性的分布式应用软件架构,可以更好地应对业务需求的变化和发展,保障系统稳定性,本文将分享一下在这个领域的观察和思考. 作者 | 易立  阿里云资深技术 ...

最新文章

  1. 应用adb发布apk到android avd模拟器
  2. MyBatis使用心得(一)--- 简单介绍
  3. 【题解】洛谷P4145 花神游历各国(线段树)
  4. 惨遭数百万开发者厌弃的五大编程语言!
  5. python 输出list到txt_python脚本生成caffe train_list.txt的方法
  6. 【转】推荐:全面了解数据库设计中分类算法
  7. Java常见加密方式
  8. 作为一名管理者,如何做好上传下达工作呢?
  9. matlab命令窗口作用是什么,matlab的命令窗口的作用是什么
  10. 集合差集操作:a - b 的含义为在集合a中,但不在b中的元素集合。
  11. 大型国企用泛微OA,让会务管理有序,让会议开展高效
  12. 【7gyy】密码丢了?揭秘你的密码是如何被偷走的
  13. OpenCASCADE 读写STEP文件
  14. 深度学习 图像分割开源代码(附链接,超级全)
  15. 主攻文推荐攻守都有系统_第五十五章 攻守转换
  16. Dicom打印工作站
  17. 清明节快到了,车辆尾号限行规则提前看!一文带你了解全国各地的尾号限行规则
  18. 如何安装运行php网站,php运行环境如何安装
  19. Plecs电力电子仿真专业教程-第一季 第三节 Plecs界面介绍
  20. linux xshell用户免密登录设置

热门文章

  1. 11gR2 新特性--待定的统计信息(Pending Statistic)
  2. CF 449E Jzzhu and Squares解题报告
  3. android9自动安装权限9,按键精灵所有者读写权限安卓9.0如何获取?设置
  4. APISIX网关在雪球生产实践
  5. librtmp推流到YouTube失败
  6. ARM DS-5 Development Studio 5.28.1 破解激活教程
  7. PCB原理图绘制(种草立创eda)
  8. R语言使用sort函数降序排序向量数据、设置decreasing参数进行降序排序
  9. Machine Learning读书会 面试算法讲座 创业活动 算法班 历届汇总
  10. 基于android的轻餐饮点餐APP(ssm+uinapp+Mysql)