Linux运维自动化学习笔记
1、详细叙述ansible的工作原理
ansible工作原理图1 ansible工作原理图2以上是两张ansible工作原理图,两张图基本都是在架构图的基本上进行的拓展。从上面的图上可以了解到:
1、管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接---这部分对应基本架构图中的连接模块;
2、可以按应用类型等方式进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作---单个模块,单条[命令],我们可以称之为ad-hoc;
3、管理节点可以通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系统通过组合多条ad-hoc操作的配置文件 。
2、使用ansible在多台机器上添加用户
ansible 用户创建
当然,在 ansible 里可以用很多方法创建用户,例如:
ansible test -m shell -a 'useradd apple'
说明: 这个相当在远程主机中用 shell 命令创建用户,一般不推荐
其实,ansilbe 提供了一个 user 模块,用于创建和管理用户。
ansible 官方的user 模块的说明文档。
例如,创建一个有登录shell 的用户,用户名是 apple:
ansible test -m user -a 'name=apple shell=/bin/bash home=/home/apple state=present'
说明:
name 指定创建的用户名
shell 指定用户登录时获得的shell
home 为用户创建 HOME 目录
state 指定是创建还是删除用户,当 state=absent 时,为删除用户
如果需要在多台远程主机中创建用户
如果需要在多台远程主机中创建用户,只需将所有主机添加到一个主机组,再执行一遍上面的命令就可以了
ansible apps -m user -a 'name=apple shell=/bin/bash home=/home/apple/ state=present'
将所有要操作的远程主机添加到主机组 apps 中。
3、用ansible-playbook编译安装nginx服务
一、Ansible-server安装
安装方式:
1、从Ansible项目的GitHub源码库提取出来安装,运行Ansible不需root 权限,也不依赖于其他软件,没有后台进程运行,不需要数据库支撑。
2、使用yum安装,需要有合适的yum源,对于RHEL、CentOS的官方yum源中没有 Ansible安装包,这就需要先安装支持第三方的yum仓库组件,最常用的有EPEL、 Remi、RPMForge等。可国内速度较快的高质量yum源网易 163(http://mirrors.163.com)、阿里源(https://opsx.alibaba.com/mirror)
注:这里实验使用的是默认的centos7自带的源,并使用yum直接安装
二、使用yum安装ansible
1、安装ansible yum –y install ansible
2、检查ansible版本: ansible –version
三、设置节点授权的ssh密钥
1、在Ansible服务端生成密钥 ssh-keygen
2、使用ssh-copy-id命令来复制Ansible公钥到节点web1和web2
1)复制Ansible公钥到节点web1 ssh-copy-id -i root@192.168.152.159
2)复制Ansible公钥到节点web2 ssh-copy-id -i root@192.168.152.160
四、配置Ansible定义文件
1、编辑ansible配置文件 vi /etc/ansible/hosts
注:将需要ansible自动化的节点IP添加到这里
2、测试在ansible服务端运行命令(在互相能ping通的情况下)
ansible -m ping 'web-servers'
五、执行shell命令
1)查看ansible节点运行时间(uptime)
ansible -m command -a "uptime" 'web-servers'
2)查看节点内核版本(uname -r)
ansible -m command -a "uname -r" 'web-servers'
注:以上操作部署已完成ansible服务搭建
六、批量部署nginx服务器
两种Ansible批量部署nginx服务器方式
方式一:yum安装nginx,使用的是epel-release源
方式二:使用nginx.tar压缩包解压安装nginx
1、在/root/目录下创建Ansible YAML文件 vi nginx.yaml
注释:
第1行表示该文件是YAML文件,非必须
第2行定义该playbook针对的目标主机,all表示针对所有主机
第3行定义该playbook所有的tasks集合,比如下面我们定义的3个task
第4行定义一个task的名称,非必须,建议根据task实际任务命名
第5行定义一个状态的action,比如这里使用yum模块实现Nginx软件包的安装
第6行到第9行使用template模板去管理/etc/nginx/nginx.conf文件,owner group定义该文件的属主以及属组,使用validate参数指文件生成后使用nginx -t -c %s命令去做Nginx文件语法验证,notify是触发handler状态,如果同步后,文件 的MD5值有变化会触发ReStart Nginx Service这个handler
第10行到第12行是定义一个handler状态让Nginx服务重启,handler的名称是 ReStart Nginx Service
注:书写yaml文件时,注意左对齐,同级别应在同一列下,并且不能使用Tab键,可以使用空格(随便空格几个都行,但是同一级别必须对齐)
2、检测YAML文件
ansible-playbook nginx.yaml --syntax-check nginx.yaml
3、查看YAML文件任务列表
ansible-playbook nginx.yaml --list-task
4、查看针对哪些主机做操作
ansible-playbook nginx.yaml --list-hosts
5、给两个节点安装epel-release源
ansible web-servers -m shell -a 'yum -y install epel-release' -i /etc/ansible/hosts
6、给两个节点安装nginx
ansible web-servers -m shell -a 'yum -y install nginx' -i /etc/ansible/hosts
7、编辑本地nginx.conf.j2文件
(因为本地没有安装nginx所以没有这个文件需要从节点拷贝到当前/root/下再修改,并以这个修改过的模板来下发给节点)
注:根据实际情况要求修改(我这里使用的默认)
8、确认信息是否正确
ansible-playbook -i /etc/ansible/hosts nginx.yaml -f 2
9、这样我们就完成了 3台机器的Nginx安装部署,下面需要对主机的Nginx服务进行核查,并且确认生成后nginx.conf中的worker_processes参数的值是否正确,执行命令:
ansible -i /etc/ansible/hosts all -m shell -a 'netstat -utpln |grep 80' -f 2
10、验证:浏览器访问两个节点IP
Web1:http://192.168.152.159
Web2:http://192.168.152.160
注:nginx自动化部署完成!
4、描述域名劫持的解决方法
更换dns服务器遇到dns被劫持,让dns服务提供者解决这个问题,是比较矛盾的;因为,劫持者,最有可能的就是他们;另外一种最直接的解决办法就是换用其他dns。
更换dns服务器的方法非常简单,在“设置”-“网络连接”中找到宽带上网的连接,打开网络连接属性,选择Interner 协议(TCP/IP)的属性页里,不要选择自动获取DNS,而要选择“使用下面的DNS服务器地址”,如下图所示,完成后重新连接上网,就可以摆脱服务商对我们的DNS劫持。
5、描述DNS的递归查询
(1)递归查询
递归查询是一种DNS 服务器的查询模式,在该模式下DNS 服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。
如果DNS 服务器本地没有存储查询DNS 信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。
客户机和服务器之间的查询是递归查询
是递归查询告诉客户机IP
(2)迭代查询
DNS 服务器另外一种查询方式为迭代查询,DNS 服务器会向客户机提供其他能够解析查询请求的DNS 服务器地址,当客户机发送查询请求时,DNS 服务器并不直接回复查询结果,而是告诉客户机另一台DNS 服务器地址,客户机再向这台DNS 服务器提交请求,依次循环直到返回查询的结果为止。
服务器之间的查询是迭代查询
6、DNS工作原理详细解析
DNS 的介绍
DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。DNS就是这样的一位“翻译官”,它的基本工作原理可用下图来表示。
DNS介绍DNS 的过程
关于DNS的获取流程:DNS是应用层协议,事实上他是为其他应用层协议工作的,包括不限于HTTP和SMTP以及FTP,用于将用户提供的主机名解析为ip地址。
具体过程如下:
①用户主机上运行着DNS的客户端,就是我们的PC机或者手机客户端运行着DNS客户端了
②浏览器将接收到的url中抽取出域名字段,就是访问的主机名,比如
http://www.baidu.com/, 并将这个主机名传送给DNS应用的客户端
③DNS客户机端向DNS服务器端发送一份查询报文,报文中包含着要访问的主机名字段(中间包括一些列缓存查询以及分布式DNS集群的工作)
④该DNS客户机最终会收到一份回答报文,其中包含有该主机名对应的IP地址
⑤一旦该浏览器收到来自DNS的IP地址,就可以向该IP地址定位的HTTP服务器发起TCP连接
7、DNS区域转发与全局转发区别与实现方法
如果客户端向DNS服务器发起的解析请求内容不在本服务器上,那么可以设置DNS转发,将解析请求转发到其他DNS服务器。DNS转发分两种情况,一种是只要本地没有解析内容的都转发到指定的DNS服务器上这种转发叫(全局转发),另一种是进行匹配转发,只要解析请求符合定义的某个域,就把该请求转发到指定的DNS服务器上这种转发叫(区域转发):
要实现上面的过程,要在两台DNS上做相应的配置:
-
在主DNS上要定义转发规则,
-
开启请求者做递归,否则转发请求不予进行
recursion yes;
-
第二台DNS上要有相应的域解析库内容
-
注意:关闭dnssec功能:
dnssec-enable no; dnssec-validation no;
配置主DNS转发规则
(1) 全局转发: 对非本机所负责解析区域的请求,全转发给指定的服务器,在/etc/named.conf中options定义
forward first|only;
forwarders { ip;};
(2) 特定区域转发:仅转发对特定的区域的请求,比全局转发优先级高,在 /etc/named.rfc1912.zones中定义区域信息
zone "ZONE_NAME" IN {
type forward;
forward first | only;
forwarders { ip;};
};
下面分别实现这两种转发方式,先看第一种转发:全局转发
全局转发
配主DNS配置文件/etc/named.conf
forward only;
forwarders { 192.168.214.134; };
dnssec-enable no;
dnssec-validation no;
注意:recursion yes; 主DNS必须要开启递归查询,否则解析请求转发不出去
接收转发DNS端配置:
定义区域文件信息:vim /etc/named.rfc1912.zones
zone "abc123.com" IN {
type master;
file "abc123.com.zone";
};
编写区域解析库文件:vim /var/named/abc123.com.zone
$TTL 1D
@ IN SOA ns1.abc123.com. amin.abc123.com (
2018051507
1H
5M
7D
1D)
IN NS ns1.abc123.com.
ns1 IN A 192.168.214.134
www IN A 192.168.214.133
@ IN A 192.168.214.133
重载DNS并测试:
rndc reload
dig测试:
[root@localhost ~]# dig www.abc123.com @192.168.214.128
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.5 <<>> www.abc123.com @192.168.214.128
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11968
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;www.abc123.com. IN A
;; ANSWER SECTION:
www.abc123.com. 86268 IN A 192.168.214.133
;; AUTHORITY SECTION:
abc123.com. 86268 IN NS ns1.abc123.com.
;; ADDITIONAL SECTION:
ns1.abc123.com. 86268 IN A 192.168.214.134
;; Query time: 1 msec
;; SERVER: 192.168.214.128#53(192.168.214.128)
;; WHEN: Sun May 20 02:01:31 2018
;; MSG SIZE rcvd: 82
访问测试
[root@localhost ~]# curl http://www.abc123.com/index.html
<html>
<body>
www.abc123.com
IP: 192.168.214.133
</body>
</html>
[root@localhost ~]# cat /etc/resolv.conf
nameserver 192.168.214.128
区域转发
设置区域转发要在主DNS的named.rfc.1912.zones文件中定义区域信息:
zone "abc123.com" IN {
type forward;
forward only;
forwarders { 192.168.214.134; };
};
设置后情况一下DNS缓存再重载服务:
rndc flush
rndc reload
测试访问
[root@localhost ~]# curl http://www.abc123.com/index.html
<html>
<body>
www.abc123.com
IP: 192.168.214.133
</body>
</html>
8、实现智能DNS
智能DNS解析根据客户机IP地址归属地区域进行区别响应,这里根据ip地址网段实现按ip地址区域解析的过程:
在DNS的主配置文件中定义ACL规则,注意,ACL规则必须定义在named.conf的最前面;
acl是根据从上到下顺序查找匹配的,acl中ip存在包含关系,应该小范围地址段先定义,大网段在后面,如果大网段在上面会使下面有包含关系的小网段不生效
acl beijing {
192.168.214.0/24;
};
acl jiangsu {
172.20.110.0/24;
};
acl other {
any;
};
定义解析库文件
为每个IP地址范围定义单独的解析库文件
[root@dns-1 named]# cp gudaoyufu.com.zone gudaoyufu.com.zone.beijing
[root@dns-1 named]# cp gudaoyufu.com.zone gudaoyufu.com.zone.jiangsu
记得修改解析库文件的属组为named
将acl与各区域解析库文件关联起来:使用view
注意:一旦采用view,必须把所以的区域信息放在view语句块中,所以named.conf中的这段内容移动到named.rfc1912.zones中
zone "." IN {
type hint;
file "named.ca";
};
创建view
先创建单独区域文件,在view中要指定
[root@dns-1 named]# cp -p /etc/named.rfc1912.zones /etc/named.rfc1912.zones.beijing
[root@dns-1 named]# cp -p /etc/named.rfc1912.zones /etc/named.rfc1912.zones.jiangsu
在named.rfc1912.zones.beijing单独的文件中定义如下:
zone "yufu.com" IN {
type master;
file "gudaoyufu.com.zone.beijing";
};
在named.rfc1912.zones.jiangsu单独的文件中定义如下:
zone "yufu.com" IN {
type master;
file "gudaoyufu.com.zone.jiangsu";
};
在named.conf中定义view
view beijngview {
match-clients {beijing;};
include "/etc/named.rfc1912.zones.beijing";
};
view jiangsuview {
match-clients {jiangsu;};
include "/etc/named.rfc1912.zones.jiangsu";
};
view otherview {
match-clients {other;};
include "/etc/named.rfc1912.zones";
};
这里的other就使用默认的区域文件,上面的view信息也可以直接将etc/named.rfc1912.zones.jiangsu中的内容直接写在view块中