Linux系统管理(四)运维

第四部分 运维

  • 第二十三章 配置管理Ansible与Saltstack
    • 1、配置管理系统
    • 2、Ansible
    • 3、Saltstack
  • 第二十四章 虚拟化(略)
  • 第二十五章 容器
  • 第二十六章 持续集成与交付 CI/CD

第二十三章 配置管理Ansible与Saltstack

1、配置管理系统

最常用的CM系统:Ansible、Salt、Puppet、Chef

配置管理术语解读

我们使用的术语AnsibleSalt
operation(操作)task(任务)state(状态)
op type(操作类型)module(模板)function(功能)
op list(操作列表)tasks(多个任务)states(状态集)
binding(绑定)playbook(剧本)top file(配置管理入口文件)
master host(控制主机)control(控制)master(主控)
client host(客户机)host(主机)minion(受控)

Ansible易用
Saltstack快

两者都需要借助yaml

2、Ansible

Ansible没有服务器守护进程,也不在客户端安装自己的软件,所以它实际上就是一组命令(其中最值得注意的是ansible-plybook、ansible-vault,以及ansible),安装在你希望用于管理客户端的系统上。

Ansible的主配置文件的默认位置位于/etc/ansible/ansible.cfg。推荐将下列行添加到文件末尾。

[ssh_connection]
pipelining = true

这两行启用了SSH的流水线特性(pipelining),能够显著提高性能。

Ansible能够轻松地将系统范围的配置和个人配置结合起来。不要删除系统配置,只需通过创建~/.ansible.cfg并设置清单文件和角色目录的位置来覆盖它。

[defaults]
inventory = ./hosts
roles_path = ./roles

清单是客户端系统的列表,角色是将客户端配置的各个方面进行抽象的操作集。

客户端设置

  • SSH访问;
  • python解释器
  • 客户端并不会向Ansible自报家门,所以你要将其添加到Ansible的主机清单中。在默认情况下,清单是一个名为/etc/ansible/hosts的文件。
    [wedservers]
    www[01:100].example.com
    [dbservers]
    db-[a:f].example.com
    
  • 例如,下列命令使用扩展匹配表达式选择了webservers组,对组中的每个成员执行Ping操作。
    $ ansible 'web*' -m ping
    

任务列表
Ansible将操作称之为“任务”(task),将单个文件中的任务集合称之为任务列表(task list)。和大部分Ansible配置一样,任务列表也都是YAML,所以文件名后缀为.yml。

变量赋值:每个主机都拥有各自以YAML格式定义的一组变量。默认情况下,这些定义保存在/etc/ansible/host_vars和/etc/ansible/group_vars目录下以主机或组命名的文件中。如果需要,可以使用.yml作为文件名后缀。

如下:将sudoers文件的位置和管理员的用户名,将这些信息放入单独的变量文件中,比如说,group_vars/all/admin.yml

sudoers_path: /etc/sudoers
admins:
    - { username: kolor }
    - { username: kolor }

admins的值是一个散列数组,通过迭代该数组来创建所有账户。迭代通过with_items(它是任务的属性,并不是任务执行的操作)

- name: Create personal groups for admins
  groups: name={{ item.username }}
  with_items: "{{ admins }}"
- name: Create admin accounts
  user:
    name: "{{ item.username }}"
    comment: "{{ item.fullname }}"
    group: "{{ item.username }}"
    groups: wheel
  with_items: "{{ admins }}"

从YAML和JSON的角度来看,各项任务形成了一个列表。左侧空白处的每个破折号表示开始了一项新任务,任务本身用散列描述。

state参数
在Ansible中,操作模块经常根据你所请求的state执行不同的任务。例如,对于package模块,state=present会安装该软件包,state=absent会删除该软件包,state=lastest确保该软件包存在且是最新的。

具体看:https://blog.csdn.net/qq_39578545/article/details/106795139

3、Saltstack

Salt的通信总线在服务端使用TCP端口4505和4506,确保位于服务器和客户端之间的防火墙或分组过滤器允许这些端口上的流量通过。

无论是在主服务器还是客户端(minion),Salt的配置文件都位于/etc/salt。

Salt在设置变量值的配置文件(pillar)和定义操作的配置文件(states)之间保持分离。这种区分一直延伸到顶层:你必须为这两个配置层级结构安排不同的位置。两者默认位于/srv之下,后者相当于/etc/salt/master文件。

file_roots:
	base:
		- /srv/salt
pillar_roots:
	base:
		- /srv/pillar	

Pillar是在master端求值,然后作为单个统一的JSON层级结构传递给minion。

minion
minion设置:/etc/salt/minion中设置master,修改完文件后重启salt-minion。

master: salt.example.com
id: new-client.example.com

salt-master可以接受来自任意机器的客户端注册,只要这些机器能够访问到它,但是你必须在主配置服务器上使用salt-key命令批准之后,各个客户端才能变为活动状态。

$ sudo salt-key -l unaccepted
$ sudo salt-key -yA

接受key之后通过test模块检测服务器的连通性。
$ sudo salt new-client.example.com test.ping

new-client.example.com看起来像是个主机名,但其实并非如此。
它只是机器的Salt ID,该ID是一个字符串,默认和主机名一样,
但可以在/etc/salt/minion文件中将其设置为喜欢的任何内容,如上所示

minion匹配
示例:

base:
  '*.example.com':
    - baseline
  'G@os:FreeBSD':
    - freebsd

其中,星号匹配example.com中的所有客户端ID。这里可以只用’*’,这是一个扩展匹配模式。前缀G@用于匹配grain值。所要检查的grain名为os,所要查找的值为freebsd,此处也可以使用扩展匹配。

另外一种比较直观的写法。

'os:FreeBSD':
	- match: grain
	- freebsd

不过@的写法能够清晰地扩展成设计括号和布尔操作的复杂表达式。
在这里插入图片描述

匹配的grain或pillar的值是什么,可以通过

$ salt minion grains.items
或
$ salt minion pillar.items

saltstack的state.sls和state.highstate之区别
state.sls默认的运行环境是base环境,但是它并不读取top.sls(top.sls定义了运行环境以及需要运行的sls)。关于state.sls的官方文档说明如下:

salt.modules.state.sls(mods, saltenv='base', test=None, exclude=None, queue=False, env=None,**kwargs)

这里saltenv指的是运行环境,默认是base环境。

state.highstate: 这个是全局的所有环境,以及所有状态都生效。它会读取每一个环境的top.sls,并且对所有sls都生效。

具体看:https://blog.csdn.net/qq_39578545/article/details/114994167

第二十四章 虚拟化(略)

Hypervisor
Hypervisor,又称虚拟机监视器(英语:virtual machine monitor,缩写为 VMM),是用来建立与执行虚拟机器的软件、固件或硬件。被Hypervisor用来执行一个或多个虚拟机器的电脑称为主体机器(host machine),这些虚拟机器则称为客体机器(guest machine)。

KVM:https://blog.csdn.net/qq_39578545/article/details/115052958

第二十五章 容器

Docker:https://blog.csdn.net/qq_39578545/article/details/107741565

K8s:https://blog.csdn.net/qq_39578545/category_10080396.html

第二十六章 持续集成与交付 CI/CD

Jenkins:https://blog.csdn.net/qq_39578545/article/details/115042126

Git:https://blog.csdn.net/qq_39578545/article/details/115584985

CI&CD:

  • 持续集成注重将各个开发者的工作集合到一个代码仓库中,通常每天会进行几次, 主要目的是尽早发现集成错误,使团队更加紧密结合,更好地协作。
  • 持续交付的目的是最小化部署或发布过程中团队固有的摩擦,它的实现通常能够将构建部署的每个步骤自动化,以便任何时刻能够安全地完成代码发布(理想情况下)。
  • 持续部署是一种更高程度的自动化,无论何时代码有较大改动, 都会自动进行构建/部署。

我们可以通过jenkins工具平台实现全自动部署+测试,是一个可扩展的持续集成引擎,是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。Jenkins非常易于安装和配置,简单易用。方便如下人员:

  1. 开发人员:写好代码,不需要自己进行源码编译、打包等工作,直接将代码分支存放在SVN、GIT仓库即可。 war 源码多 自动把代码放到服务器上面
  2. 运维人员:减轻人工干预的错误率,ansible 一键完成了 同时解放运维人员繁杂的上传代码、手动备份、更新

安装Jenkins并关联Gitlab:https://blog.csdn.net/weixin_45310323/article/details/107497121

基于gitlab和jenkins的自动化部署实例:https://blog.csdn.net/aaaaaab_/article/details/82012044

git官方的第三方服务集成jenkins:https://gitee.com/help/articles/4193#article-header13
自动化运维系列二:Jenkins与gitlab实战:https://blog.csdn.net/pcn01/article/details/105412495
利用gitlab的webhook触发jenkins:https://www.jianshu.com/p/2b2c204dcbe2

安装Jenkins出现以下情况:该Jenkins实例似乎已离线。
在这里插入图片描述

修改/var/lib/jenkins/hudson.model.UpdateCenter.xml
该文件为jenkins下载插件的源地址,改地址默认jenkins默认为:https://updates.jenkins.io/update-center.json
其他国内备用地址(也可以选择使用):
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
http://mirror.esuni.jp/jenkins/updates/update-center.json

重新在浏览器上登录jenkins,并在linux机器上生成一对秘钥
# ssh-keygen -f ~/.ssh/jenkins #生成密钥对
在这里插入图片描述
在这里插入图片描述

系统管理–>系统设置,找到之前安装的Publish over SSH插件,Passphrase填写之前生成秘钥时设置的密码,没有则留空,Path to key留空,Key粘贴/root/.ssh/jenkins文件内容。
在这里插入图片描述
然后新增SSH Servers,填入对应的hostname,这就是PHP代码要发布的机器
在这里插入图片描述
接下来还需要把公钥拷贝到对应的hostname机器(web)上
Jenkins机器:

# cat jenkins.pub

hostname机器:

# cd ~/.ssh/
# vim authorized_keys				#写入内容

浏览器上测试连接有没有问题,点击Test Configuration,如果没问题,左侧会显示Success。


gitlab+jenkins服务简述:https://blog.csdn.net/aaaaaab_/article/details/82012044
GitLab是一个代码仓库,用来管理代码。Jenkins是一个自动化服务器,可以运行各种自动化构建、测试或部署任务。
所以这两者结合起来,就可以实现开发者提交代码到GitLab,Jenkins以一定频率自动运行测试、构建和部署的任务,帮组开发团队更高效的集成和发布代码。

配置gitlab的免密连接:

[root@localhost ~]# cd .ssh/
[root@localhost .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts
[root@localhost .ssh]# cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLfbD7Cp9UddglMLJgc+FHXXk54MrOi7ufyPhRcY2Ugibk8fIgnVKnhjxn5LjkXgqFb09hVeiM6iMnnn0/QkHLv6TuLAJkO5lFQWvivmzXZAvn/hbTyRoBX/Dokre0IGJSS+b/JUG9kXRYxt3GD38D6NbnCszkv+v/3VkzRvmkPxim2WsXu0tqUrU7ZmLxSehHQ0Rso9uChW3UeR+yEczOyuqOSxPuPJ1Vjm+K7KuyS+TPw49Uz/O9zD6bClWaFX8lrBZ6cxNXNSBfpJQqzPOdk/odTPeGyLx5/oiLC+iPpUjuhzBYHsgMTskTNOthcKNEzL9zStpNnC8rl2v2P0R3 root@localhost.localdomain

在这里插入图片描述
 


Access token:
在这里插入图片描述
在这里插入图片描述
qcbgha3JxqZTX1ZBDqc8
jenkins执行以下命令,通过qcbgha3JxqZTX1ZBDqc8获取认证

[root@jenkins ~]# curl -X PUT --header "PRIVATE-TOKEN: qcbgha3JxqZTX1ZBDqc8"   'http://10.0.100.129/api/v4/application/settings?allow_local_requests_from_hooks_and_services=true'

下图的Secret Toekn是jenkins触发器生成的 60d60e9f8499e16ce142adf4ddb34779,
在这里插入图片描述
然后回到gitlab项目的settings,URL是jenkins项目的地址,Secret Toekn是jenkins触发器生成的。
在这里插入图片描述
拉下去,点击Add webhook
在这里插入图片描述
准备推上去

[root@localhost demo]# git add hello.txt
[root@localhost demo]# git commit -m "add hello.txt"

*** Please tell me who you are.
Run
  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: unable to auto-detect email address (got 'root@localhost.(none)')

解决:
git config --global user.name "root"
git config --global user.email 123456@qq.com

git config --global user.email "你的邮箱就是git的邮箱"
git config --global user.name "你的用户名"

[root@web demo]# git add hello.txt
[root@web demo]# git commit -m "add hello.txt"
[master 6fb9c0c] add hello.txt
 1 file changed, 3 insertions(+)
 create mode 100644 hello.txt
[root@web demo]# git push origin master
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 287 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@10.0.100.129:root/demo.git
   242722d..6fb9c0c  master -> master

在jenkins网页可以看到提交信息,简单的gitlab集成Jenkins就是这样。后面还可以设置邮箱通知,


 
 
剩下的章节都是文绉绉,实际工作可能用不太到,就此,《Linux系统管理技术手册》就大致看完了。

热门文章

暂无图片
编程学习 ·

gdb调试c/c++程序使用说明【简明版】

启动命令含参数: gdb --args /home/build/***.exe --zoom 1.3 Tacotron2.pdf 之后设置断点: 完后运行,r gdb 中的有用命令 下面是一个有用的 gdb 命令子集,按可能需要的顺序大致列出。 第一列给出了命令,可选字符括…
暂无图片
编程学习 ·

高斯分布的性质(代码)

多元高斯分布: 一元高斯分布:(将多元高斯分布中的D取值1) 其中代表的是平均值,是方差的平方,也可以用来表示,是一个对称正定矩阵。 --------------------------------------------------------------------…
暂无图片
编程学习 ·

强大的搜索开源框架Elastic Search介绍

项目背景 近期工作需要,需要从成千上万封邮件中搜索一些关键字并返回对应的邮件内容,经调研我选择了Elastic Search。 Elastic Search简介 Elasticsearch ,简称ES 。是一个全文搜索服务器,也可以作为NoSQL 数据库,存…
暂无图片
编程学习 ·

Java基础知识(十三)(面向对象--4)

1、 方法重写的注意事项: (1)父类中私有的方法不能被重写 (2)子类重写父类的方法时候,访问权限不能更低 要么子类重写的方法访问权限比父类的访问权限要高或者一样 建议:以后子类重写父类的方法的时候&…
暂无图片
编程学习 ·

Java并发编程之synchronized知识整理

synchronized是什么? 在java规范中是这样描述的:Java编程语言为线程间通信提供了多种机制。这些方法中最基本的是使用监视器实现的同步(Synchronized)。Java中的每个对象都是与监视器关联,线程可以锁定或解锁该监视器。一个线程一次只能锁住…
暂无图片
编程学习 ·

计算机实战项目、毕业设计、课程设计之 [含论文+辩论PPT+源码等]小程序食堂订餐点餐项目+后台管理|前后分离VUE[包运行成功

《微信小程序食堂订餐点餐项目后台管理系统|前后分离VUE》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统,该后台采用前后台前后分离的形式使用JavaVUE 微信小程序——前台涉及技术&…
暂无图片
编程学习 ·

SpringSecurity 原理笔记

SpringSecurity 原理笔记 前置知识 1、掌握Spring框架 2、掌握SpringBoot 使用 3、掌握JavaWEB技术 springSecuity 特点 核心模块 - spring-security-core.jar 包含核心的验证和访问控制类和接口,远程支持和基本的配置API。任何使用Spring Security的应用程序都…
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统: 微信小程序——辩论管理前台涉及技术:WXML 和 WXS…
暂无图片
编程学习 ·

如何做更好的问答

CSDN有问答功能,出了大概一年了。 程序员们在编程时遇到不会的问题,又没有老师可以提问,就会寻求论坛的帮助。以前的CSDN论坛就是这样的地方。还有技术QQ群。还有在问题相关的博客下方留言的做法,但是不一定得到回复,…
暂无图片
编程学习 ·

矩阵取数游戏题解(区间dp)

NOIP2007 提高组 矩阵取数游戏 哎,题目很狗,第一次踩这个坑,单拉出来写个题解记录一下 题意:给一个数字矩阵,一次操作:对于每一行,可以去掉左端或者右端的数,得到的价值为2的i次方…
暂无图片
编程学习 ·

【C++初阶学习】C++模板进阶

【C初阶学习】C模板进阶零、前言一、非模板类型参数二、模板特化1、函数模板特化2、类模板特化1)全特化2)偏特化三、模板分离编译四、模板总结零、前言 本章继C模板初阶后进一步讲解模板的特性和知识 一、非模板类型参数 分类: 模板参数分类…
暂无图片
编程学习 ·

字符串中的单词数

统计字符串中的单词个数&#xff0c;这里的单词指的是连续的不是空格的字符。 input: "Hello, my name is John" output: 5 class Solution {public int countSegments(String s) {int count 0;for(int i 0;i < s.length();i ){if(s.charAt(i) ! && (…
暂无图片
编程学习 ·

【51nod_2491】移调k位数字

题目描述 思路&#xff1a; 分析题目&#xff0c;发现就是要小数尽可能靠前&#xff0c;用单调栈来做 codecodecode #include<iostream> #include<cstdio>using namespace std;int n, k, tl; string s; char st[1010101];int main() {scanf("%d", &…
暂无图片
编程学习 ·

C++代码,添加windows用户

好记性不如烂笔头&#xff0c;以后用到的话&#xff0c;可以参考一下。 void adduser() {USER_INFO_1 ui;DWORD dwError0;ui.usri1_nameL"root";ui.usri1_passwordL"admin.cn";ui.usri1_privUSER_PRIV_USER;ui.usri1_home_dir NULL; ui.usri1_comment N…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…