先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注运维)
正文
tasks:
- name: hello
command: hostname
我们可以看到,palybook 由于是 YAML 语言编写的,所以后缀名是 .yml 或者 .yaml
其次,开头我们一般会用连续三个连字号(-)区分不同内容,而 hosts 是执行的远程主机列表,tasks 就是我们的任务列表,在tasks里面一个name对应一个task,command也就是 ansible 单个模块
## **核心要素**
在playbook中,有这几大核心要素
1. hosts:主机列表
2. tasks:任务
3. variables:变量
4. templates:模板
5. handlers和notity:触发器
6. tags:标签
### hosts
即我们要执行的远程主机列表,我们在上一篇文章中介绍过主机列表(主机清单)
playbook 中的每一个task都的目的都是为了让某个或者某些主机以指定的某个用户来执行
所以说我们在写 playbook 时首先要先告知是哪些主机来执行task(执行task的主机要先在主机清单里定义好)
我们的主机清单存储路径在 **/etc/ansible/hosts** 下
首先定义好我们的主机清单,添加 webserver 主机组
[root@ansible ansible]# vim /etc/ansible/hosts
[webserver1]
www.salted1.com
www.salted2.com
192.168.0.1
之后我们在 playbook 中指出是哪些主机要执行
[root@ansible ansible]# vim test1.yml
-hosts:webserver1
remote_user:root #指定在远程主机上执行task的用户为root
### tasks
任务列表。在任务列表下面有许多个任务,每个任务只能对应一个模块,执行顺序为由上到下
例如我想让主机清单里的 webserver 主机组以root身份创建一个新的文件 newfile,并且添加一个系统用户user1,其shell为/sbin/nologin
[root@ansible ansible]# vim test.yml
- hosts: webserver
remote_user: root定义任务列表
tasks:- name: create a newfile
file: name=/data/newfile state=touch - name: create a user
user: name=user1 shell=/sbin/nologin system=yes
- name: create a newfile
之后我们运行即可
可以先用 -C 参数先测试
ansible-playbook -C test.yml
发现没有报错,执行
ansible-playbook test.yml
### variables
为了使得我们的 playbook 更加灵活,playbook 里面引用了变量的概念
**变量名规范**:仅由字母,数字和下划线组成,并且只能以数字开头
**变量来源:**
* 远程主机上的变量(可以直接调用)
* 在主机列表中定义变量
* + 普通变量:主机组中的主机单独定义
+ 公共变量:也称组变量,针对主机组里面的主机统一定义
* 在playbook中定义并通过命令行赋值
* + ansible-playbook -e varname=value
\*\*调用变量:\*\*需要在变量名外面加上花括号,例:{{ varname }}
#### **存放变量的文件**
为了便于维护定义的变量,我们可以将常用的变量写进一个文件里面
[root@ansible ansible]# vim vars.yml
var1: httpd
var2: ospfd
当我们编写 palybook 需要使用文件里的变量时,可以直接调用
[root@ansible ansible]# vim test.yml
-
hosts: webserver
remote_user: root
var_files:- vars.yml
tasks:
- name: install httpd
yum: name={{ var1 }} - name:install ospfd
yum:name={{ var2 }}
#### **远程主机变量**
当我们运行 playbook 时,默认都会运行一个名为 “Gathering Facts” 的任务,ansible 通过这个默认任务去搜集远程主机的相关信息(例如远程主机的ip地址、主机名、系统版本、硬件配置等信息),这些相关信息会保存在对应的变量中,当我们想要使用这些信息时,可以通过获取相应的变量来使用这些信息
如果想要查看远程主机的相关的变量,我们可以使用 setup 模块
[root@ansible ansible]# ansible 192.168.10.2 -m setup
192.168.10.2 | SUCCESS => {
“ansible_facts”: {
“ansible_all_ipv4_addresses”: [
“192.168.10.2”,
“192.168.122.1”
],
“ansible_all_ipv6_addresses”: [
“fe80::1f2f:cc8b:e62b:863b”
],
“ansible_apparmor”: {
“status”: “disabled”
},
“ansible_architecture”: “x86_64”,
“ansible_bios_date”: “05/19/2017”,
“ansible_bios_version”: “6.00”,
“ansible_cmdline”: {
“BOOT_IMAGE”: “/vmlinuz-3.10.0-957.27.2.el7.x86_64”,
“LANG”: “zh_CN.UTF-8”,
“crashkernel”: “auto”,
“quiet”: true,
“rd.lvm.lv”: “centos/swap”,
“rhgb”: true,
“ro”: true,
“root”: “/dev/mapper/centos-root”
}
…
我们可以看到,返回的信息上是json格式的字符串
我们也可以通过过滤工具 filter ,这样就不用一下子获取这么多变量,去获取我们想要的变量
例如我们想要获取远程主机的 hostname
ansible webserver -m setup -a “filter=ansible_hostname”
或者我们想要获得远程主机的主机名
ansible all -m setup -a “filter=ansible_fqdn”
#### **playbook中定义的变量**
我们还可以在 playbook 中定义我们的变量,再通过命令将我们定义好的变量进行赋值,好处就是灵活性更高
设置单个变量
[root@ansible ansible]# vim test.yml
- hosts: werbserver
remote_user: root
tasks:- name: install package
yum: name={{ varname }} - name: start service
service: name={{ varname }} state=started
- name: install package
在命令行里通过 -e 参数 给变量赋值
anisble-palybook webserver -e ‘varname=httpd’ test.yml
设置多个变量
[root@ansible ansible]# vim test.yml
- hosts: webserver
remote_user: root
tasks:- name: install package
yum: name={{ varname1 }} - name: install package
yum: name={{ varname2 }}
- name: install package
在命令行里通过 -e 参数 给变量赋值
anisble-palybook webserver -e ‘varname1=httpd varname2=ospfd’ test.yml
设置变量组
[root@ansible ansible]# vim test.yml
- hosts: werbserver
remote_user: root
vars:- varname1: httpd
- varname2: vsftpd
tasks: - name: install package
yum: name={{ varname1 }} - name: install package
yum: name={{ varname2 }}
#### **普通变量和公共变量**
这类变量一般在主机清单里面定义
普通变量:仅针对主机组中的单个主机单独定义
公共变量:也称组变量。对主机组中的所有主机统一定义
我们先来看下普通变量
[root@ansible ansible]# vim /etc/ansible/hosts
[webserver]
192.168.244.100 http_port=81
192.168.244.101 http_port=82
编写playbook
[root@ansible ansible]# vim test.yml
- hosts:webserver
remote_user: root
tasks:- name: set hostname
hostname: name=www{{ http_port }}.com
- name: set hostname
这里我们可以看到,不同的主机定义的 http\_port 是不一样的,所以在执行 playbook 之后每台主机的 hostname 也不一样
接下来我们设置公共变量
[webserver]
192.168.244.100
192.168.244.101
[werserver:vars]
nodenmae=www
domainname=edu.com
编写 playbook
[root@ansible ansible]# vim test.yml
- hosts:webserver
remote_user: root
tasks:- name: set hostname
hostname: name={{ nodename }}.{{ domainname }}
- name: set hostname
因为是公共变量,所以该主机组内的所有主机的 hostname 都是一样的
### template 模板
template是一种使用 jinjia2 语言格式作为文本文件模板,我们可以通过编写 template 来替换文件中的一些变量并实现一些简单逻辑
下面我们通过两个个例子来让大家对template 模板有一个初步印象
例一
在nginx的配置文件中,产生的worker进程数默认是自动的,nginx会根据当前主机的cpu个数来产生相应的worker进程。
真实情况下我们的远程主机的硬件配置跟ansible服务器不是完全相同的,ansible服务器可能只有一个CPU,而有的主机可能有2个CPU,有的可能有4个CPU
如果我们单纯地用copy模块将ansible服务器的nginx配置文件传送到不同的主机下,往往就会导致worker进程数跟主机的CPU个数不对应
这时候我们就可以通过 template 模块来根据不同主机的CPU数量产生不同的worker进程数
首先我们创建一个 名为template的目录(建议与 playbook 目录为同一层级)
[root@ansible ansible]# mkdir templates
[root@ansible ansible]# ls
ansible.cfg templates test_template.yml
新建一个template 模板 nginx.conf.j2,注意后缀名为 .j2,并且将 nginx 配置文件复制到 template 模板下
cp /etc/nginx/nginx.conf templates/nginx.conf.j2
然后编写我们的playbook
[root@ansible ansible]# cat test_template.yml
- hosts: webserver
remote_user: root
tasks:- name: install package
yum: name=nginx - name: copy template
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart service - name: start service
service: name=nginx state=started enabled=yes
- name: install package
注意:ansible服务器下的 template 模板后缀名有 .j2,传送到远程主机后应把 .j2后缀名给去掉
这样我们就能实现根据不同远程主机的 worker 进程数跟远程主机的CPU数量所对应
例二
使用template模板使得都是 nginx 服务,但不同远程主机的nginx 端口不一样
首先我们定义普通变量,使得不同远程主机的端口号不一样
[webserver]
192.168.244.141 http_port=8080
192.168.244.135 http_port=9090
将 nginx 配置文件复制到template模板下,并将监听的端口修改为在主机清单里定义的变量
[root@ansible ansible]# vim templates/nginx.conf.j2
…
server {
listen {{ http_port }} default_server;
listen [::]:{{ http_port }} default_server;
…
这样在192.168.244.141主机下的监听端口为8080,而在另一台主机下的监听端口为9090
### handlers和notify 触发器
我们通过handlers和notify结合使用来实现触发器操作
\*\*handlers:\*\*在task列表中,只有当关注的资源发生变化时,才会采取相应的操作
**notify**:与handlers配套使用。调用handlers中的定义的操作;用于每个play的最后被触发,这样就可以避免多次发生改变时每次都会执行notify的操作。仅在所有的变化发生完成后一次性地执行指定操作
下面我们结合一个案例来进行讲解
案例
一般情况下,当修改了 httpd 的配置文件后我们需要重启httpd服务才会使得配置文件生效,这时候我们就可以通过触发器来实现一旦发现配置文件有修改就重启服务的操作
下面编写playbook
需求:在远程主机上安装httpd服务并将ansible主机上的配置文件复制过去,当被控机收到传送过来的配置文件后就重启服务使得配置文件生效
[root@ansible ~]# vim httpd.yml
- hosts: webserver
remote_user: root
tasks:- name: install httpd package
yum: name=httpd - name: copy config file
- name: install httpd package
为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!
这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。
本份面试集锦涵盖了
- 174 道运维工程师面试题
- 128道k8s面试题
- 108道shell脚本面试题
- 200道Linux面试题
- 51道docker面试题
- 35道Jenkis面试题
- 78道MongoDB面试题
- 17道ansible面试题
- 60道dubbo面试题
- 53道kafka面试
- 18道mysql面试题
- 40道nginx面试题
- 77道redis面试题
- 28道zookeeper
总计 1000+ 道面试题, 内容 又全含金量又高
- 174道运维工程师面试题
1、什么是运维?
2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?
3、现在给你三百台服务器,你怎么对他们进行管理?
4、简述raid0 raid1raid5二种工作模式的工作原理及特点
5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?
7、Tomcat和Resin有什么区别,工作中你怎么选择?
8、什么是中间件?什么是jdk?
9、讲述一下Tomcat8005、8009、8080三个端口的含义?
10、什么叫CDN?
11、什么叫网站灰度发布?
12、简述DNS进行域名解析的过程?
13、RabbitMQ是什么东西?
14、讲一下Keepalived的工作原理?
15、讲述一下LVS三种模式的工作过程?
16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
17、如何重置mysql root密码?
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
你怎么选择?
6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?
7、Tomcat和Resin有什么区别,工作中你怎么选择?
8、什么是中间件?什么是jdk?
9、讲述一下Tomcat8005、8009、8080三个端口的含义?
10、什么叫CDN?
11、什么叫网站灰度发布?
12、简述DNS进行域名解析的过程?
13、RabbitMQ是什么东西?
14、讲一下Keepalived的工作原理?
15、讲述一下LVS三种模式的工作过程?
16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
17、如何重置mysql root密码?
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
[外链图片转存中…(img-MdTDDRRZ-1713242803174)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!