Ansible Playbook

Playbook 介绍 playbook 剧本是由一个或多个”play”组成的列表 play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作 Playbook 文件是采用YAML语言编写的 Playbook 命令 格式 bash ansible-playbook <filename.yml> ... [options] 常用选项 bash --syntax-check #语法检查 -C --check #只检测可能会发生的改变,但不真正执行操作 --list-hosts #列出运行任务的主机 jasonchen@DESKTOP-NHT2EP5:~$ ansible-playbook copy.yaml --list-hosts --list-tags #列出tag jasonchen@DESKTOP-NHT2EP5:~$ ansible-playbook copy.yaml --list-tags --list-tasks #列出task jasonchen@DESKTOP-NHT2EP5:~$ ansible-playbook copy.yaml --list-tasks --limit 主机列表 #只针对主机列表中的特定主机执行 jasonchen@DESKTOP-NHT2EP5:~$ ansible-playbook copy.yaml --limit 100.0.0.10 # 设置 limit 的时候,此 IP 必须要存在于脚本定义的 hosts -v -vv -vvv # 显示详细过程,v 越多显示的详细信息越多 Playbook 核心组件 hosts 组件 Hosts:playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts 用于指定要执行指定任务的主机,须事先定义在主机清单中,然后直接在 yaml 格式的文本中通过 hosts 关键字调用即可 ...

October 18, 2020

Ansible变量

变量调用方式 bash 通过{{ variable_name }} 调用变量,且变量名前后建议加空格,有时用"{{ variable_name }}"才生效。因为使用 {{ }} 直接调用时,有时 variable 变量内存在特殊字符,所以使用 "{{ }}" 可以忽略特殊字符。 变量来源 ansible 的 setup facts 远程主机的所有变量都可直接调用 通过命令行指定变量,优先级最高 yaml ansible-playbook -e variables_name=var playbook.yaml 在playbook文件中定义 yaml vars: - var1: value1 - var2: value2 在独立的变量YAML文件中定义 yaml - hosts: all vars_files: - vars.yml 在 /etc/ansible/hosts 中定义 主机(普通)变量:主机组中主机单独定义,优先级高于公共变量 bash 100.0.0.150 port=80 domain=www.dingchen.local 组(公共)变量:针对主机组中所有主机定义统一变量 bash [mysql:vars] # 定义组名一般为 [主机组名:公共变量组名] port=80 # 定义变量 domain=www.dingchen.local [mysql] # 定义的主机组名 100.0.0.150 100.0.0.10 100.0.0.105 特殊公共变量 [all:vars] # 作用域在整个主机清单 在 role 中定义 范例 主机变量调用 创建一个变量定义的文件名,三个主机分别使用不同的变量内容 ...

October 17, 2020

Yaml

YAML 文件格式介绍 YAML:YAML Ain’t Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意 思其实是:”Yet Another Markup Language”(仍是一种标记语言) YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、 Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者,目前很多最新的软件比较流行采用此格式的文件存放 配置信息,如:ubuntu,anisble,docker,kubernetes等 YAML 官方网站:http://www.yaml.org YAML 语言特点 YAML的可读性好 YAML和脚本语言的交互性好 YAML使用实现语言的数据类型 YAML有一个一致的信息模型 YAML易于实现 YAML可以基于流来处理 YAML表达能力强,扩展性好 YAML 语法简介 在单一文件第一行,用连续三个连字号”-“ 开始,还有选择性的连续三个点号( … )用来表示文件的 结尾 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能 使用**#号注释代码** 缩进必须是统一的,不能空格和tab混用 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换 行来实现的 YAML文件内容是区别大小写的,key/value的值均需大小写敏感 多个key/value可同行写也可换行写,同行使用,分隔 key后面冒号要加一个空格 比如: key: value value可是个字符串,也可是另一个列表 YAML文件扩展名通常为yml或yaml 支持的数据类型 YAML 支持以下常用几种数据类型: 标量:单个的、不可再分的值 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary) 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list) scalar 标量 key对应value bash name: wang 使用缩进的方式 bash name: wang 标量是最基本的,不可再分的值,包括: 字符串 布尔值 整数 浮点数 Null 时间 日期 Dictionary 字典 字典由多个key与value构成,key和value之间用 :分隔, 并且 : 后面有一个空格,所有k/v可以放在一 行,或者每个 k/v 分别放在不同行 ...

October 17, 2020

Ansible模块

Command 模块 **功能:**远程执行主机命令,此为默认模块,可忽略 -m 选项 **注意:**此模块不会支持特殊字符,如果有需要使用特殊字符,例如 & | ; 等,需要使用 shell 模块来实现 命令参数 creates 如果目标文件已经存在则不会执行动作 chdir 切换执行动作的目录 removes 如果目标文件存在则会执行动作 范例 bash 1. 默认访问为家目录,而非被控制端所在目录 [root@DESKTOP-NHT2EP5 ~]#ansible 100.0.0.10 -m command -a "ls" 100.0.0.10 | CHANGED | rc=0 >> anaconda-ks.cfg mysql.sh 2. removes 与 creates 参数的区别 [root@centos7 ~]# touch 1.txt [root@DESKTOP-NHT2EP5 ~]#ansible 100.0.0.10 -m command -a "removes=/root/1.txt chdir=/root/ echo hei" 100.0.0.10 | CHANGED | rc=0 >> hei [root@DESKTOP-NHT2EP5 ~]#ansible 100.0.0.10 -m command -a "removes=/root/2.txt chdir=/root/ echo hei" 100.0.0.10 | SUCCESS | rc=0 >> skipped, since /root/2.txt does not exist [root@DESKTOP-NHT2EP5 ~]#ansible 100.0.0.10 -m command -a "creates=/root/1.txt chdir=/root/ echo hei" 100.0.0.10 | SUCCESS | rc=0 >> skipped, since /root/1.txt exists [root@DESKTOP-NHT2EP5 ~]#ansible 100.0.0.10 -m command -a "creates=/root/2.txt chdir=/root/ echo hei" 100.0.0.10 | CHANGED | rc=0 >> hei Shell 模块 **功能:**执行 shell 命令的模块。可以弥补 script 模块的缺陷(不能运行远程主机上的脚本) ...

October 17, 2020

Docker存储驱动

Docker 存储驱动介绍 每个 Docker 容器都有一个本地存储空间,用于保存层叠的镜像层(image layer)以及挂载的容器文件系统。 默认情况下,容器所有的读写操作都发生在其镜像层或挂载的文件系统中,所以存储是每个容器的性能和稳定性不可或缺的一个环节。 以往,本地存储是通过存储驱动(Storage Driver)进行管理的,有时候也被称为 Graph Driver 或者 GraphDriver。 虽然存储驱动在上层抽象设计中都采用了栈式镜像层存储和写时复制(Copy-on-write)的设计思想,但是 Docker 在 linux 底层支持几种不同的存储驱动的具体实现,每一种实现方式都采用不同方法实现了镜像层和写时复制。 虽然底层实现的差异不影响用户与 Docker 之间的交互,但是对 Docker 的性能和稳定性至关重要。 Docker 在 linux 上的存储驱动 AUFS Overlay2 Device Mapper Btrfs —- 新版的文件系统,功能强大,支持 raid,以及使用量限制等 ZFS Docker 在 windows 的存储驱动 filter 存储驱动配置 修改存储驱动 可以通过修改 /etc/docker/daemon.json 文件来修改存储驱动 [root@centos7 docker]# cat daemon.json {"storage-driver":"overlay2"}, 找不到 daemon.json 文件的解决方法 官方说法,新创建一个即可 To configure the Docker daemon using a JSON file, create a file at /etc/docker/daemon.json on Linux systems, or C:\ProgramData\docker\config\daemon.json on Windows. On MacOS go to the whale in the taskbar > Preferences > Daemon > Advanced. 如果修改了正在运行 docker 主机的存储引擎类型,则现有的镜像和容器在重启后将不可用,这时因为每种存储驱动在主机上存储镜像层的位置是不同的(通常在 /var/lib/docker/ /… 目录下) ...

October 1, 2020

Docker简介安装

Docker 公司 公司位于旧金山,由法裔美籍开发者和企业家 Solumon Hykes 创立。 docker 公司刚开始是是一个提供产品即服务的提供商。底层上使用了 docker 技术,后来因为业务不景气,所以就将 docker 开源开来,公司火了,但是 docker 之父已经不在原来的公司工作了。 Docker 运行时与编排引擎 多数技术人员在说 docker 时,实际上就是指的 docker 引擎。 Docker 是用于运行和编排基础设施工具。有 vmware 管理经验的读者可以将其类比为 ESXi ESXi 是运行虚拟机的核心管理程序,而 docker 引擎是运行容器的核心容器运行时。 其他的产品或者是第三方的产品都是基于 docker 引擎进行开发和集成的。 存储引擎可以从 docker 网站下载,也可以基于 github 上的源码进行构建。无论是开源还是商业版都会有 linux 和 windows 版本。 docker 引擎主要有两个版本,一个是企业版(EE),一个是社区版(CE) EE 企业版会提供 12 个月的支持,而社区版每个版本只会支持 4 个月的支持。 版本号介绍 从 2017 年第一季度开始,Docker 版本号遵循 YY.MM-xx 格式,类似于 Ubuntu 等项目。例如,2018 年 6 月第一次发布的社区版本为 18.06.0-ce。 Docker 开源项目 Moby docker 的开源项目已经改名为 Moby,也就是与 CE 已经分离,这是 Moby 的最新 logo。 ...

October 1, 2020

运维人员对Docker的学习目标

掌握 Docker 的镜像下载,运行新的容器、登录新容器、再容器内运行命令,以及销毁容器。 当安装 Docker 的时候,会涉及两个主要组件:Docker 客户端和 Docker daemon。 daemon 实现了 Docker 引擎的 API 使用 Linux 默认安装时,客户端与 daemon 之间的通信是通过本地 IPC/UNIX Socket 完成的(/var/run/docker.sock);在 Windows 上是通过名为 npipe:////./pipe/docker_engine 的管道(pipe)完成的。 docker version 命令的使用 可以使用 docker version 命令来检测客户端和服务端是否已经正常运行并且可以相互通信 [root@centos7 ~]# docker version Client: Docker Engine - Community ---客户端响应 Version: 19.03.13 API version: 1.40 Go version: go1.13.15 Git commit: 4484c46d9d Built: Wed Sep 16 17:03:45 2020 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community ----服务端响应 Engine: Version: 19.03.13 API version: 1.40 (minimum version 1.12) Go version: go1.13.15 Git commit: 4484c46d9d Built: Wed Sep 16 17:02:21 2020 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.3.7 GitCommit: 8fba4e9a7d01810a393d5d25a3621dc101981175 runc: Version: 1.0.0-rc10 GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd docker-init: Version: 0.18.0 GitCommit: fec3683 成功获取来自客户端和服务端的响应。 ...

October 1, 2020

Bind软件的使用

BIND 软件的组成 bash 安装包 bind # bind 的主程序包 bind-utils # bind 的工具包 BIND 主程序:/usr/sbin/named 服务脚本和 Unit 名称:/etc/rc.d/init.d/named,/usr/lib/systemd/system/named.service 主配置文件:/etc/named.conf, /etc/named.rfc1912.zones, /etc/rndc.key 管理工具:/usr/sbin/rndc:remote name domain controller,默认与bind安装在同一主机,且 只能通过127.0.0.1连接named进程,提供辅助性的管理功能;953/tcp 解析库文件:/var/named/ZONE_NAME.ZONE 注意: (1) 一台物理服务器可同时为多个区域提供解析 (2) 必须要有根区域文件;named.ca:该文件中定义的是全球 13 个根的地址 (3) 应该有两个(如果包括ipv6的,应该更多)实现 localhost 和本地回环地址的解析库 主配置文件 named.conf bash options { listen-on port 53 { localhost; }; # 定义了监听本地的地址和端口,localhost 关键字表示监听本服务器的所有 # { 172.16.1.16;119.110.120.1; }; 可以监听多个地址 注意:最好是不要指定单独的 IP 进行监听,因为这样指定容错性太差 listen-on-v6 port 53 { ::1; }; # IPv6 的监听 directory "/var/named"; # 区域解析文件的位置 dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; recursing-file "/var/named/data/named.recursing"; secroots-file "/var/named/data/named.secroots"; allow-query { localhost; }; # 允许解析或者同步的主机地址 # { 172.16.1.0/24;192.168.1.0/8; } 可以指定网段 # { any; } 该关键字是允许所有的主机进行解析 recursion yes; dnssec-enable yes; # 对域名进行签名,保障安全 dnssec-validation yes; # 保障安全,如果开启同步时可能会出错 bindkeys-file "/etc/named.root.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; # pid 文件的存放位置 session-keyfile "/run/named/session.key"; # 会话密钥存放位置 }; logging { # 启动日志存放位置 channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { # 定义根域 "." 的地址,通过 named.ca 来指定 type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; # 区域解析的数据库,指定包含文件 include "/etc/named.root.key"; 全局配置:options {}; ...

September 21, 2020

Dhcp

获取 IP 的方式 静态指定 动态获取 bootp : boot protocol MAC 与 IP 一一对应 这种方法会绑定 MAC 地址,所以在网络中会产生浪费 IP 的现象 dhcp :增强的 bootp,动态 对 IP 的租用会有租期,当主机一段时间不使用或者租期到期后 DHCP 就会回收 IP 地址,这种分配地址的方式就是动态分配 DHCP DCHP 的工作原理 DHCP 是 UDP 协议,是一个应用层协议,C/S 模式,DHCP server 使用 67/udp、DHCP client 68/udp 主要用途 用于内网网络和网络服务供应商自动分配 IP 地址给用户 用于内部网络管理员作为对所有电脑集中管理的手段 自动化安装系统 解决 IPv4 不足的问题 DHCP 的通信过程 Clinet(客户机)接受回应消息使用的是 67/udp,Server(服务器接收)Client 请求消息的是 68/udp 端口,分为 6 个步骤 Clinet 发现阶段:首先是 Clinet 默认没有 IP 地址会发送 Discover(Clinet 请求 IP)的 IP 为 0.0.0.0,255.255.255.255 的广播报文,网络上的所有主机都会收到 Discover 的报文,只有 server 会回应报文 Server 响应阶段:server 通过 68 端口收到 client 收到请求 IP 的报文后,会通过解析报文来分析自己的 dhcp.conf 文件,来查找有没有相应合适的 IP 地址,如果有的话 Server 会给 Client 发送 offer 报文,来告诉 Client 有何时的资源,可以提供 DHCP 服务 Client 请求使用阶段:Client 收到 offer 报文后,知道本网段有 Server 可以提供 DHCP 服务,所以 Client 就会发送一个 request 的请求报文,向 Server 请求子网掩码,IP 地址,网关,DNS 等信息,以便登录网络 Server 确定使用阶段:Server 收到 Client 发送的 request 报文后,确定要为 Client 提供 IP 地址等信息,所以就向 Client 回应一个 Option 的报文来告诉 CLient 使用的 IP,然后 Client 就可以使用该 IP 了 Server 会把该 IP 与 Client 的 MAC 地址绑定,并且取消之前为 Client 提供的 IP 地址服务 Client 重启网络服务:重启后会发送一个含有 Server 之前分配过的 IP 地址的 request IP请求报文,DHCP 收到后会先查看自己的服务器中有没有主机使用该 IP,如果没有使用就会给 Client 回应一个 ACK 报文表示 Client 可以继续使用此 IP 地址,如果正在使用就会给 Client 重新分配一个没有正在使用的 IP 地址 Client 的续约过程:每个 IP 地址都会有定义的租约,如果租约小于 50% 就需要更新租约,Client 会发送一个 renew 的报文来请求更新租约,如果 dhcp server 没有回应,那么在 1/8 的租约时 Client 会寻找其他的 dhcp server DHCP 的租期和限制 使用 DHCP 时必须要基于本地的 IP 网段来设置,且分发的 IP 中必须有自己的网段 先到先得的原则 长租期与短租期 长租期:IP 相对稳定,网络资源消耗较少,但是浪费 IP 资源 短租期:IP 相对比较不稳定,网络资源消耗较多(因为需要不停的发送请求续租)但是 IP 地址可以得到充分利用,可以实现较少 IP 为较多的 IP 分发地址,因为如果主机过多,肯定会有主机会停机或者是租期过期,不在工作的主机 DHCP 实现 DHCP 实现软件 bash dhcp dnsmasq 小型服务软件,可以提供 dhcp 和 dns 功能,应用在小型机 DHCP 相关文件组成 bash /usr/sbin/dhcpd dhcp 的执行程序 /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example dhcp 的备份文件 /var/lib/dhcpd/dhcpd.leases dhcp 分发 IP 的记录日志 /etc/dhcp/dhcpd.conf dhcp 的主配置文件 /usr/lib/systemd/system/dhcpd.service dhcp 的 service 启动管理文件 dhcp-client 客户端包 bash /usr/sbin/dhclient #客户端程序 /var/lib/dhclient #自动获取的IP信息 windows 工具 bash ipconfig /release 释放 IP 地址 ipconfig /renew 获取新的 IP 地址 DHCP 服务器配置 bash 1. dhcp 配置文件介绍 2. 实现 dhcp 分发 IP 地址 3. dhcp 特殊用法,自动安装 IP 分发 bash `1. dhcp 配置文件介绍` option domain-name "example.org"; # 定义在 /etc/hosts 文件中 serach 解析的名称,当找不到目标地址会自动填充 serach option domain-name-servers ns1.example.org, ns2.example.org; # 设置解析的 dns 地址 default-lease-time 600; # 租期时间 max-lease-time 7200; # 最大租期时间 subnet 10.5.5.0 netmask 255.255.255.224 { # 网段 range 10.5.5.26 10.5.5.30; # 定义分发地址池 option domain-name-servers ns1.internal.example.org; # 定义 dns 地址 option domain-name "internal.example.org"; # 定义域名 option routers 10.5.5.1; # 网关定义 option broadcast-address 10.5.5.31; # 广播地址定义 default-lease-time 600; # 租期时间 max-lease-time 7200; # 最大租期时间 next-server 100.0.0.100; # 定义下载 filename 字段定义文件的服务器 IP 地址 filename "pxelinux.0"; # 启动网卡来获取 IP 地址的文件 } host fantasia { # 主机名称 hardware ethernet 08:00:07:26:c0:a5; # 绑定主机的网卡 MAC 地址 fixed-address fantasia.fugue.com; # 绑定的 IP 地址 } bash `2. 实现 dhcp 分发 IP 地址` (1) 实现 dhcp 地址的自动分发 # 服务端配置 [root@centos7 dhcp]# cat dhcpd.conf option domain-name "dingchen.com"; option domain-name-servers 100.0.0.2; default-lease-time 99999; max-lease-time 7200; subnet 100.0.0.0 netmask 255.0.0.0 { range 100.0.0.100 100.0.0.200 ; option routers 100.0.0.2 ; } # 客户端获取 IP 地址 [root@DNS ~]# dhclient -d # 服务端查看分发日志 lease 100.0.0.102 { starts 4 2020/09/10 09:45:25; ends 4 2020/09/10 11:45:25; cltt 4 2020/09/10 09:45:25; binding state active; next binding state free; rewind binding state free; hardware ethernet 00:0c:29:e3:b7:94; uid "\001\000\014)\343\267\224"; client-hostname "DNS"; } (2) 实现绑定 MAC 的地址分发 [root@centos7 dhcp]# cat dhcpd.conf option domain-name "dingchen.com"; option domain-name-servers 100.0.0.2; default-lease-time 99999; max-lease-time 7200; # log-facility local7; subnet 100.0.0.0 netmask 255.0.0.0 { range 100.0.0.100 100.0.0.200 ; option routers 100.0.0.2 ; } host fantasia { hardware ethernet 00:0c:29:e3:b7:94; fixed-address 100.0.0.201; } bash `3. dhcp 特殊用法,pxe 自动安装 IP 分发` [root@centos7 dhcp]# cat dhcpd.conf option domain-name "dingchen.com"; option domain-name-servers 100.0.0.2; default-lease-time 99999; max-lease-time 7200; # log-facility local7; subnet 100.0.0.0 netmask 255.0.0.0 { range 100.0.0.100 100.0.0.200 ; option routers 100.0.0.2 ; next-server 100.0.0.10; filename "pxelinux.0"; } host fantasia { hardware ethernet 00:0c:29:e3:b7:94; fixed-address 100.0.0.201; }

September 21, 2020

DNS理论知识

DNS 作用 将主机名解析成 IP 地址,因为 IP 地址由一串数字组成,可以通俗的讲就是有些反人类不好记忆,所以使用 DNS 来将这一串数字解析为对应的域名,这样当用户访问时可以很方便的记住并且访问网页。但是计算机是不可能理解这种由拼音或者是英文组成的域名的,所以就可以利用 DNS 将名称解析成 IP 地址这样用户就可以通过域名来直接访问网络中的设备了。 DNS 介绍 域名系统,应用层协议,是互联网的一项服务,将域名和 IP 地址互相映射的一个分布式数据库,能够使人更方便地访问互联网,基于 C/S 架构。 DNS 查询类型(递归、迭代) 递归查询:只会向根目录发起请求,如果根不知道权威服务器的位置,会根据客户端访问的域名一级一级的寻找,直到找到该域名的权威服务器返回给客户端 迭代查询:客户端向根服务器发起请求,根返回给客户端自己的下一级(子域)的 DNS 服务器,客户端再次查询,直到一直请求找到权威服务器 DNS 缓存 局域网内每次通过 DNS 解析的域名都会在局域网的 DNS 服务器缓存下来解析记录,当用户再次访问时就不需要递归查询或者是迭代查询,直接通过本地的 DNS 缓存来查找目标主机的位置。但是缓存是有时间的。 DNS 的端口号 53/udp 同步和解析的作用 53/tcp 同步主从之间的文件作用 953/tcp rndc 这个管理软件是使用的 953 作为它的管理端口 FQDN 完整名称的组成 在互联网中,所有的 dns 解析都是通过顶级的根域来解析所有的解析请求。全世界共有 13 台 DNS 的根域。 不同等级域的作用 根域:最高等级的目录 一级域名(顶级域) 三类:组织域、国家域(.cn, .ca, .hk, .tw)、反向域 com, edu, mil, gov, net, org, int,arpa ...

September 21, 2020