出现的问题

  1. 主机的xshell连接不上虚拟机,情况是主机ping不通虚拟机,但是虚拟机能ping通外网。经过查看资料。这种情况下是VMWARE8网卡出现问题。因为VMWARE8网卡是负责虚拟机和主机的通信。于是就在物理主机中将VMWARE8网卡禁用再启动就顺利连接上了。

    FTP文件服务

    匿名用户登陆:
    匿名用户登陆就是允许任何人登陆到服务器上传文件 ```shell

    FTP是基于C/S架构的所以需要服务端和客户端

    服务端配置

    systemctl stop firewalld //关闭防火墙,不推荐可以通过iptables设置过滤规则 setenforce 0

yum install vsftpd -y vim /etc/vsftpd/vsftpd.conf anonymous_enable=YES anon_upload_enable=YES anon_umask=022 anon_mkdir_write_enable=YES anon_other_write_enable=YES

添加关于匿名登陆的配置

systemctl start vsftpd

默认的目录是在/var/ftp下

客户端

yum install ftp ftp 192.168.36.128 #连接登陆

上传文件 put /文件路径/文件名 //文件权限由配置文件中的umask决定 下载文件 get 文件名 //可以通过lcd来决定下载的位置 lcd /var/….

  1. 1. 问题: 客户端登陆出现:500 OOPS: vsftpd: refusing to run with writable root inside chroot()
  2. 因为vsftpd2.3.5版本后就不支持修改ftp目录的权限应该变为755后再登陆问题就解决了。
  3. 2. 问题:无法通过get下载文件。
  4. 因为文件权限的问题
  5. 3. ipv6端口打开了,但是ipv4端口没打开
  6. 通过设置配置文件中的listen=YES配置打开。
  7. <a name="acEmi"></a>
  8. ##
  9. <a name="baCwv"></a>
  10. ## NFS文件服务
  11. NFS文件系统是基于RPC协议的网络文件系统,是基于C/S架构的。能够实现对目录的共享。
  12. ```shell
  13. #server端
  14. yum install nfs-utils -y
  15. mkdir /webdata
  16. cat /etc/exports
  17. /webdata 192.168.36.0/24(rw)
  18. systemctl start nfs-server
  19. #client
  20. yum install nfs-utils -y
  21. showmount -e 192.168.36.128
  22. mount -t nfs 192.168.36.128:/webdata /var/www/html/

https://www.jianshu.com/p/7d6853140e13 //RPC远程调度协议

LVM逻辑卷管理

逻辑卷管理器是Linux系统用于对硬盘分区进行管理的一种机制,其创建初衷是为了解决硬盘设备在创建分区后不易修改分区大小的缺陷。LVM技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并,这样一来,用户不必关心物理硬盘设备的底层架构和布局,就可以实现对硬盘发你去的动态调整。

#将新添加的两块硬盘设备支持LVM技术
pvcreate /dev/sdb
pvcreate /dev/sdc
#将两块硬盘加入到卷组中
vgcreate storage /dev/sdb /dev/sdc
vgdisplay
#切割出一个约为150M的逻辑卷设备
lvcreate -n my-lv -l 37 storage
lvdisplay
#将逻辑卷格式化
mkfs.ext4 /dev/storage/my-lv
#挂载
mkdir /webdata
mount /dev/storage/my-lv /webdata
df -h //查看挂载情况
-------------
#扩容逻辑卷
umount /webdata
lvextend -L 290M /dev/storage/my-lv
#检查硬盘完整性
e2fsck -f /dev/storage/my-lv
#重置硬盘
resize2fs /dev/storage/my-lv
#重新挂载
mount /dev/storage/my-lv
df-h 
--------------
#缩小逻辑卷
umount /webdata
e2fsck -f /dev/storage/my-lv
resize2fs /dev/storage/my-lv 120M
lvreduce -L 120M /dev/storage/my-lv
mount /dev/storage/my-lv /webdata
df -h
---------------
#逻辑卷快照
#拍摄快照
lvcreate -L 120M -s -n SNAP /dev/storage/my-lv 
#卸载
umount /webdata
#恢复快照
lvconvert --merge /dev/storage/SNAP
#挂载
mount /dev/storage/my-lv /webdata

#删除逻辑卷
umount /webdata
lvremove /dev/storage/my-lv
vgremove storage
pvremove /dev/sdb /dev/sdc

Nginx7层和4层负载均衡

  1. Nginx的首页文件在哪儿?

/usr/share/nginx/html/index.html

七层负载均衡

  1. 配置文件

image.png
实验结果:
image.png

四层负载均衡

  1. 布置四层负载均衡的时候报错。

image.png
原因:现在版本的Nginx 没有安装ngx_stream_core_modules模块。需要自己手动添加。
image.png
手动添加模块:
http://nginx.org/download/ //nginx源码下载

  1. 下载nginx的源码包。 ```shell wget http://nginx.org/download/nginx-1.21.1.tar.gz -P /usr/local/src/ #将源码包下载到文件夹中 tar -xzvf -x 从归档中解出文件 -z 通过gzip过滤文档 -v 详细地列出处理的文件 -f 强制执行

    安装编译环境

    yum install gcc pcre-devel openssl-devel zlib-devel -y

    创建用户

    useradd -r -s /sbin/nologin nginx

    编译配置

    ./configure —prefix=/apps/nginx \ —user=nginx \ —group=nginx \ —with-pcre \ —with-http_ssl_module \ —with-http_v2_module \ —with-http_realip_module \ —with-http_addition_module \ —with-http_sub_module \ —with-http_dav_module \ —with-http_flv_module \ —with-http_mp4_module \ —with-http_gunzip_module \ —with-http_gzip_static_module \ —with-http_random_index_module \ —with-http_secure_link_module \ —with-http_stub_status_module \ —with-http_auth_request_module \ —with-http_image_filter_module \ —with-http_slice_module \ —with-mail \ —with-threads \ —with-file-aio \ —with-stream \ —with-mail_ssl_module \ —with-stream_ssl_module

    编译

    make -j 2 && make install

    更改目录的属主

    chown -R nginx:nginx /apps/nginx

    建立软连接

    ln -s /apps/nginx/sbin/nginx /usr/bin/ ln -s /apps/nginx/sbin/nginx /usr/sbin/

    检查

    nginx -v

    配置Nginx服务命令和服务并开机启动

    cat /usr/lib/systemd/system/nginx.service [Unit] Description=The nginx HTTP and reverse proxy server Documentation=http://nginx.org/en/docs/ After=network.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/apps/nginx/run/nginx.pid ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID [Install] WantedBy=multi-user.target

    创建/apps/nginx/run/这个目录

    在配置文件中指定启动的pid文件。

    vim /apps/nginx/conf/nginx.conf pid /apps/nginx/run/nginx.pid //pid文件就是存放进程的pid号 systemctl daemon—reload systemctl start nginx

问题启动失败

一直启动失败是因为pid文件报错。

```shell
四层负载均衡的实验
#需要模块 http_stream_core_module需要自己加载
#在主配置文件中
cat /apps/nginx/conf/nginx.conf
stream {
    upstream sshsers{
        server 192.168.36.129:22;
        server 192.168.36.130:22;
        least_conn;
}
    server{
    listen 22222;
    proxy_pass sshsers;
}
}
//用ssh连接就可以了

LVS/NAT实验

  1. 需要添加一块网卡来作为VIP ```shell vim /etc/sysconfig/network-scripts/ifcfg-ens37 //作为VIP TYPE=”Ethernet” PROXY_METHOD=”none” BROWSER_ONLY=”no” BOOTPROTO=”static” DEFROUTE=”yes” IPV4_FAILURE_FATAL=”no” IPV6INIT=”yes” IPV6_AUTOCONF=”yes” IPV6_DEFROUTE=”yes” IPV6_FAILURE_FATAL=”no” IPV6_ADDR_GEN_MODE=”stable-privacy” NAME=”ens37” UUID=”b3f5c29d-4900-493d-98ca-099dc1d54853” //通过uuidgen生成 DEVICE=”ens37” ONBOOT=”yes” IPADDR=172.100.10.10 // VIP地址 NETMASK=255.255.255.0 DNS1=114.114.114.114 GATEWAY=172.100.10.2
```shell
#DS配置
yum ipvsadm //安装ipvsadm工具
echo 1 > /proc/sys/net/ipv4/ip_forward //手动开启路由转发功能
iptables -t nat -F //清空规则表
iptables -t nat -A postrouting -s 192.168.36.0/24 -o ens37 -j
MASQUERADE //
#设置wrr策略和添加RS主机
ipvsadm -A -t 172.100.10.10:80 -s wrr //配置负载均衡策略wrr
ipvsadm -a -t 172.100.10.10:80 -r 192.168.36.129 -m -w 1
ipvsadm -a -t 172.100.10.10:80 -r 192.168.36.130 -m -w 1
#查看设定号的规则
ipvsadm -ln
#RS配置
安装web软件并开启
网关必须指向DS
cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="1afa5ab4-07fb-4a17-b199-ed34479f1a07"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.36.130
NETMASK=255.255.255.0
DNS1=114.114.114.114
GATEWAY=192.168.36.128

LVS/DR实验

#部署DR
#先配置vip
yum install net-tools -y
ifconfig add ens33:0 192.168.36.100 broadcast 192.168.36.255 netmask 255.255.255.0 up
//在ens33网卡的另一个接口上配置vip地址
route add -host 192.168.36.100 dev ens33:0 //配置默认路由
yum install ipvsadm -y
ipvsadm -A -t 192.168.36.100:80 -s wr //配置lvs的真实服务器组
ipvsadm -a -t 192.168.36.100:80 -r 192.168.36.129:80 -g 
ipvsadm -a -t 192.168.36.100:80 -r 192.168.36.130:80 -g
ipvsadm -ln
#RS部署
yum install net-tools -y
ifconfig lo:0 192.168.36.100 broadcast 192.168.36.255 netmask 255.255.255.255 up
route add -host 192.168.36.100 lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

问题:

  1. 配置完成后,访问后没有响应

    原因:防火墙没关
    

Keepalived+nginx实验

https://www.keepalived.org/pdf/sery-lvs-cluster.pdf //可以看一看

#部署MASTER
[root@ds src] cat /etc/keepalived/keepalived.conf //将原有的配置文件替换掉
! configuration file for keepalived
global_defs {
  router_id node1   
}
vrrp_script chk_http_port {  //通过关键字vrrp_script定义脚本。 为0不执行 为1执行
  script "/usr/local/src/check_nginx_pid.sh"
  interval 1
  weight -2
}
vrrp_instance VI_1 {  //定义vrrp组
  state MASTER
  interface ens33
  virtual_router_id 10  //vrrp组id 同一个组的id要相同
  priority 100   //0-254
  advert_int 1   
  authentication { //组内的路由器进行认证
  auth_type PASS
  auth_pass 1111
  }
  track_script {   //通过关键字track_script调用脚本 
  chk_http_port
  }
  virtual_ipaddress {
  192.168.36.100
  }  
}
#脚本
#!/bin/bash
nginx_process_number=`ps -C nginx --no-header | wc -l `
if [ $nginx_process_number -eq 0 ];then
  #nginx
  nginx_process_number=`ps -C nginx --no-header | wc -l `
  if [ $nginx_process_number -eq 0 ];then
      exit 1
  else
      exit 0
  fi
else 
  exit 0
fi
#backup节点
#与主节点类似有几个地方不一样
 state backup
 priority 99
 #脚本也是一样的。

问题:

  1. 在加入了检测nginx脚本的情况下。将nginx关闭后,vip不能漂移到另外一台机器上

原因:排查出了shell脚本有问题

  1. 在解决了shell脚本的问题后,出现了VIP消失的情况

原因:通过查看日志发现配置文件的花括号出现了一点问题,重新改正后问题被解决。

  1. 为什么MASTER的nginxdown机后重启地址会飘过来?因为是抢占模式吗

原因:默认是抢占模式,并且优先值会恢复。

Keepalive+HAproxy+mysql双主

#部署mysql
yum install mariadb-server -y 

cat /etc/my.cnf.d/server.conf
  [mysqld]
  server-id = 1
  auto_increment_offset = 1
  log-bin = mysql-bin
  auto-increment-increment = 1
  skip-name-resolve
  binlog-ignore = mysql
  binlog-ignore = information_schema

  systemctl start mariadb
  mysql -uroot -e "gant replication slave on *.* to 'repuser@192.168.36.131'
  identified by'000000'
  #在数据库中的操作
  show master status;
  change master to master_host='192.168.36.131',master_port=3306,master_user='repuser'
  master_password='000000',master_log_file='mysql-bin.000003',mastet_log_pos=245;
  start slave;
#HAproxuy部署
问题:haproxy实现负载均衡的代理IP是如何确定的。
部署完成后如何验证是否代理成功。
mv /etc/haproxy/haproxy.cfg{,.bak}
cat /etc/haproxy/haproxy.cfg
global
  log 127.0.0.1 local2
  chroot /var/lib/haproxy
  pidfile /var/run/haproxy.pid
  maxconn 4000
  user haproxy
  group haproxy
  daemon
  stats socket /var/lib/haproxy/stats
listen mysql_proxy
  bind 0.0.0.0:3306
  mode tcp
  balance rr
  server mysql1 192.168.36.130:3306 check
  server mysql2 192.168.36.131:3306 check
systemctl start haproxy
#keepalived配置
[root@ds haproxy]# cat /etc/keepalived/keepalived.conf
! configuration file for keepalived
global_defs {
  router_id node1
}
vrrp_script chk_proxy_port {
  script "/usr/local/src/check_proxy_pid.sh"
  interval 1
  weight -2
}
vrrp_instance VI_1 {
  state MASTER
  interface ens33
  virtual_router_id 10
  priority 100
  advert_int 1
  authentication {
  auth_type PASS
  auth_pass 1111
  }
  track_script { 
  chk_proxy_port
  }
  virtual_ipaddress {
  192.168.36.100
  }  
}
问题:BACKUP节点在启用时报错, 
WARNING - default user 'keepalived_script' for script execution does not exist - please create.
解决办法:脚本执行的时候出现了问题。首先是赋予权限,第二个是写完脚本后就先执行

总结:

keepalived+haproxy+mysql双主的实验。就是mysql实现双主,haproxy实现负载均衡,keepalived实现高可用。大概的想法是这样的。mysql实现双主,haproxy的负载均衡能够提供对外的一个接口给用户访问这两台数据库,也就是提升了数据库的并发能力,但是haproxy一旦不可用后,就会导致数据库不可用。因此就多布置了一台负载均衡节点来提高可用性,那么如何提高可用性呢。就需要keepalived来实现高可用。具体的实现原理是这样的。keepalived具有心跳检测和失败切换功能,这里我们需要用到的就是失败切换功能,那么失败切换功能又是如何实现的呢,就是根据vrrp协议里面的内容,具体是这样的,在两台haproxy节点上布置keepalived。然后在keepalived配置文件中,根据参数virtual_router_id 来确认它们属于同一个vrrp组,当一个keepalived服务不可用,或者是优先级降低后,VIP就会飘到另一台keepalived服务上。这样就由另一台haproxy负载均衡器来提供服务。那么我们就可以利用优先级降低这个方法来等同于haproxy服务的正常与否,如果服务不正常则优先级降低,高优先级的路由器就会变成MASTER。我们可以通过关键字vrrp_script 引入一个脚本 当正常是时候退出码为0 优先级不变,当不正常的时候退出状态码为1优先级 weight -2 。这样就能将服务与优先级进行关联。这样就能实现高可用。
有几个需要注意的点:
优先级降低后,当服务再次启动的时候,vip飘回原来的主机,优先级会变成设定值。不是累计的值
https://www.cnblogs.com/soymilk2019/p/11136639.html

Keepalived+LVS实验

#RS配置
在环回接口上配置vip
ip addr add 192.168.36.99/32 broadcast 192.168.36.99 dev lo:0

使用Ansible搭建Halo博客系统

Halo博客系统是基于JAVA开发的开源的博客系统。

#从 oracle官网通过wget下载JRE解压报错。原因是缺少license。下载下来的是HTML文件
解决办法:注册了一个甲骨文的用户,下载到windows,通过lrzsz工具上传到linux中。
#解压完成后,配置环境变量运行报错。之后去bin目录下执行java二进制文件还是报错。
-bash: ./java: /lib/ld-linux.so.2: bad ELF interpreter: 没有那个文件或目录
解决办法:yum install glibc.i686 -y

#配置环境变量
cat /etc/profile
export JAVA_HOME=/root/app
export JRE_HOME=/root/app/jre1.8.0_333
export CLASSPATH=$JRE_HOME/lib/rt.jar:$JRE_HOME/lib/ext
export PATH=$PATH:$JRE_HOME/bin
source /etc/profile
#检查是否成功
java -version
总结:
JRE是JAVA程序运行时的环境,linux默认不是自带的。需要我们自己配置安装。
大概的步骤是:
通过wget下载工具包。
然后解压
然后配置环境变量
最后检查是否安装成功。
#方法二:
yum install java-11-openjdk -y
#用ansible系统部署一个框架,首先要有一个步骤,和流程。首先肯定要编写三个角色。分别是Halo,nginx,JAVA,其中nginx用来做反向代理服务器,JAVA用来实现环境部署。Halo用来实现具体的网站功能。具体还需要将Halo进程托管给systemd通过systectl工具来监管。

#第一步编写剧本
[root@ds roles]# cat yum_halo.yaml 
- name: create halo blog system
  hosts: node1
  remote_user: root
  strategy: free
  pre_tasks:
    - name: yum epel
      yum:
        name: epel-release
        state: present
  roles: 
  - nginx

#编写nginx角色
[root@ds roles]# cat ./nginx/tasks/main.yml 
---
# tasks file for nginx
- name: install nginx 
  yum:
    name: nginx
    state: present
- name: copy halo to nginx config file
  template:
    src: "halo.conf"
    dest: "/etc/nginx/conf.d/halo.conf"
- name: make sure nginx service is runing
  service:
    name: nginx
    state: started
- name: make sure port is open
  wait_for:
    port:{{ nginx_port }}
#相关的模板
[root@ds nginx]# cat ./templates/halo.conf
upstream halo {
  server 127.0.0.1:8090;
}
server {
  listen 80;
  listen [::]:80;
  server_name {{halo_domain}};
  client_max_body_size 1024m;
location / {
  proxy_pass http://halo;
  proxy_set_header HOST $host;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
#依赖关系
cat ./meta/main.yml
dependencies:
  # List your role dependencies here, one per line. Be sure to remove the '[]' above,
  # if you add dependencies to this list.
  - role: java
  - role: halo
#编写JAVA角色
[root@ds roles]# cat ./java/tasks/main.yml 
---
# tasks file for java
- name: yum java envirment
  yum:
    name: java-11-openjdk
    state: present
#编写Halo角色
[root@ds halo]# cat tasks/main.yml 
---
# tasks file for halo
- name: get halo
  get_url:
    url: https://dl.halo.run/release/halo-1.4.11.jar 
    dest: "{{ halopath }}"
- name: add halo service file
  template:
    src: halo.service
    dest: /etc/systemd/system/halo.service
- name: touch work directory
  file:
    path: /root/.halo
    state: directory
- name: copy halo config file
  template:
    src: application.yaml
    dest: /root/.halo/application.yaml
- name: start halo
  systemd:
    daemon_reload: yes
    name: halo
    state: started
    enabled: yes
- name: wait to start halo
  wait_for: 
    port: "{{ halo_port }}"

 #相关模板
 [root@ds templates]# cat ./halo.service 
[Unit]
Description=Halo Service
Documentation=https://docs.halo.run
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/java -server -Xms256m -Xmx256m -jar /root/halo.jar
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=always
StandOutput=syslog

StandError=inherit

[Install]
WantedBy=multi-user.target

[root@ds templates]# cat ./application.yaml 
server:
  port: 8090

  # Response data gzip.
  compression:
    enabled: false
spring:
  datasource:

    # H2 database configuration.
    driver-class-name: org.h2.Driver
    url: jdbc:h2:file:~/.halo/db/halo
    username: admin
    password: 123456

    # MySQL database configuration.
#    driver-class-name: com.mysql.cj.jdbc.Driver
#    url: jdbc:mysql://127.0.0.1:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
#    username: root
#    password: 123456

  # H2 database console configuration.
  h2:
    console:
      settings:
        web-allow-others: false
      path: /h2-console
      enabled: false

halo:

  # Your admin client path is https://your-domain/{admin-path}
  admin-path: admin

  # memory or level
  cache: memory

#上面用到的变量
[root@ds halo]# cat ./vars/main.yml 
---
# vars file for halo
memory: 512m
halo_port: 8090
halopath: /root/halo.jar
halo_domain: 192.168.36.128
nginx_port: 80

#service文件下载
wget https://dl.halo.run/config/halo.service -O halo/templates/halo.service
#application文件下载
wget https://dl.halo.run/config/applicationtemplate.yaml -O halo/templates/application.yaml

使用Ansible搭建LAMP架构

环境准备:
一台管理节点
一台nginx作为负载均衡器
两台apache作为web服务器
一台作为mariadb数据库
一台作为网站存储(nfs)

  1. 工作流程(主机清单文件、ssh通信、免密登录、生成py脚本、sleep0退出)
  2. 更换远程主机的yum仓库(更换为国内的源速度更快)
  3. 安装httpd、mariadb、nginx
  4. 使用模板给httpd准备配置文件,使用ansible-galaxy安装负载均衡角色
  5. 使用parted模块创建分区,使用lvg模块创建卷组,使用lvol模块创建逻辑卷,逻辑卷作为nfs存储
    使用
  6. 使用shell模块为数据库添加指定库、用户等操作

思考:

  1. 如何设计整个流程呢?

答:一步一步来,多做,多熟练

  1. shell模块如何能够为数据库添加指定库,用户?

答:

步骤:

#配置免密登陆
ssh-keygen -P "" -t rsa
ssh-copy-id -i id.key.pub root@192.168.36.129
#配置主机清单文件

[root@ds ~]# cat ansible/playbook/host.yaml 
- name: config hosts file
  hosts: all_ip
  remote_user: root
  tasks:
  - name: copy host.j2 to group servers
    template:
      src: /root/ansible/template/host.j2
      dest: /etc/hosts
#模板文件

[root@ds ~]# cat /root/ansible/template/host.j2
127.0.0.1 localhost localhost.localdomain localhost4
localhost4.localdomain4
::1 localhost localhost.localdomain localhost6
localhost6.localdomain6
{% for host in groups.all_ip %}
{{ hostvars[host].ansible_ens33.ipv4.address }} {{ hostvars[host].ansible_hostname }}
{% endfor %}

#问题
生成host解析文件的时候,在host.j2文件中的for host in group.all_ip中报错。说没有这个group变量
原因:groups是anshible内置的变量。代表的是主机清单文件中的组和主机。
#思考:如何删除yum.repo.d目录下的所有文件呢?
#思路:通过file模块可以删除单个文件,删除一个目录下的多个文件就应该用with_items来循环删除所有文件。
问题:ERROR! 'shell' is not a valid attribute for a Play
解决思路:shell模块一直报错
问题:ERROR! 'register' is not a valid attribute for a Play
原因:我检查的是角色文件。所以一直报错。应该检查的是剧本而不是角色文件。角色是定义出来在剧本中使用的。
#角色
[root@ds roles]# cat /etc/ansible/roles/yum_repo/tasks/main.yml 
---
# tasks file for yum_repo
- name: find files in yum.repos.d
  shell:
    chdir: /etc/yum.repos.d/
    cmd: ls
  register: files_list

- name: delet
  file:
    path: "/etc/yum.repos.d/{{ item }}"
    state: absent
  with_items: "{{ files_list.stdout_lines}}"

- name: copy aliyun yum.repo to all nodes
  copy:
    src: yum.repo
    dest: /etc/yum.repos.d/
#剧本
[root@ds roles]# cat /etc/ansible/roles/yum.repos.yaml 
- name: yum repos
  hosts: all_ip
  remote_user: root
  roles:
  - yum_repo
#使用角色安装nginx
[root@ds roles]# cat nginx-1/tasks/main.yml
---
# tasks file for nginx-1
- name: install epel
  yum:
    name: epel-release
    state: present
- name: install nginx
  yum:
    name: nginx
    state: present

#使用nginx做负载均衡
[root@ds roles]# cat ./nginx_lb/tasks/main.yml 
---
# tasks file for nginx_lb
- name: copy conf to nginx_lb
  copy:
   src: /etc/ansible/roles/nginx_lb/templates/lb.conf.j2
   dest: /etc/nginx/conf.d/lb.conf
- name: restart nginx
  service:
    name: nginx
    state: restarted
   #模板文件
   [root@ds roles]# cat ./nginx_lb/templates/lb.conf.j2 
   upstream webserver {
     server slave2;
     server slave3;
     }
   server{
     listen 8080;
     location / {
       proxy_pass http://webserver;
    }
    }

#安装httpd,php-fpm,php-mysql
[root@ds roles]# cat httpd-1/tasks/main.yml
---
# tasks file for httpd-1
- name: yum install apache
  yum:
    name: httpd,php-fpm,php-mysql,mod_php
    state: present
- name: start httpd
  service:
    name: httpd
    state: restarted
- name: start php-fpm
  service:
    name: php-fpm
    state: restarted

#安装mysql
[root@ds roles]# cat ./mariadb-1/tasks/main.yml 
---
# tasks file for mariadb-1
- name: yum mariadb
  yum:
    name: mariadb-server
    state: present
- name: start mariadb
  service:
    name: mariadb
    state: restarted

#创建逻辑卷并挂载到共享目录下
[root@ds roles]# cat mount_lv/tasks/main.yml
---
# tasks file for mount_lv
- name: create disk
  parted:
    device: /dev/sdb
    number: 1
    flags: [lvm]
    state: present
    part_start: 1MiB
    part_end: 2GiB
- name: create vg
  lvg:
    vg: vg-nfs
    pvs: /dev/sdb1
- name: create lvm 1G
  lvol:
    vg: vg-nfs
    lv: nginx-nfs
    size: 1G
- name: format lv-nfs
  filesystem:
    fstype: ext4
    dev: /dev/vg-nfs/nginx-nfs

- name: Mkfir for nfs
  file:
    path: /nfs
    state: directory

- name: mount lvm
  mount:
   path: /nfs
   src: /dev/vg-nfs/nginx-nfs
   fstype: ext4
   state: mounted
   opts: noatime

- name: yum pkg for nfs
  yum:
    name: nfs-utils, rpcbind
    state: present

- name: config file
  shell: chmod -Rf 777 /nfs | echo "/nfs 192.168.36.0/24(rw,sync,no_root_squash)" > /etc/exports
- name: start service
  service:
    name: "{{ item }}"
    state: restarted
  loop:
    - rpcbind
    - nfs-server

#webserver挂载目录
[root@ds roles]# cat ./node_mount/tasks/main.yml
---
# tasks file for node_mount
- name: yum nfs pkg
  yum:
    name: nfs-utils, rpcbind
    state: present
- name: mount nfs share directory in local
  mount:
    src: 192.168.36.133:/nfs
    path: /var/www/html
    fstype: nfs
    state: mounted

#将全部角色加入到一个剧本中

[root@ds roles]# cat /root/ansible/playbook/all.yaml
- name: updata hosts file
  hosts: all_ip
  remote_user: root
  tasks:
  - name: copy hosts.j2 to group servers
    template:
      src: /root/ansible/template/host.j2
      dest: /etc/hosts

- name: updata ali yumrepos
  hosts: all_ip
  remote_user: root
  tasks:
   - include_tasks: /etc/ansible/roles/yum_repo/tasks/main.yml

- name: install nginx
  hosts: nginx
  remote_user: root
  tasks:
   - include_tasks: /etc/ansible/roles/nginx-1/tasks/main.yml

- name: install httpd
  hosts: apache
  remote_user: root
  tasks:
   - include_tasks: /etc/ansible/roles/httpd-1/tasks/main.yml

- name: install mysql
  hosts: mariadb
  remote_user: root
  tasks:
   - include_tasks: /etc/ansible/roles/mariadb-1/tasks/main.yml

- name: config nginx lb server
  hosts: nginx
  remote_user: root
  tasks:
   - include_tasks: /etc/ansible/roles/nginx_lb/tasks/main.yml

- name: create lvm for nfs
  hosts: nfs
  remote_user: root
  tasks:
   - include_tasks: /etc/ansible/roles/mount_lv/tasks/main.yml

- name: node mount nfs
  hosts: apache
  remote_user: root
  tasks:
   - include_tasks: /etc/ansible/roles/node_mount/tasks/main.yml

总结:

搭建整个系统,首先进行规划,哪一台主机用来干什么,并且对每个步骤都有一个流程化的思考,那一步需要做什么,在这个过程中,尽可能的将角色的任务写得具体。降低角色之间的耦合关系。这样能提高角色的使用率。
整个搭建过程,首先是给每个主机生成解析文件。里面用到了循环结构。然后更换yum源里面用到了find模块。用于找出yum.repos.d目录下的所有文件并用register注册一个变量来替代找到的文件。并使用file模块使用{{item.path}},将文件删除后,将aliyun的repo文件拷贝到目标机。在创建nginx负载均衡的时候,使用到的配置文件保存在file模块下。在创建逻辑卷并进行挂载的时候,用到了parted模块对硬盘进行分区。使用到了lvg模块生成卷组,使用了lvol模块生成逻辑卷。并通过filesystem模块进行格式化以后。通过mount模块将逻辑卷挂载到/nfs目录下。在搭建NFS文件服务时需要下载nfs-utils和rpcbind工具。并将挂载信息通过shell模块写入到/etc/exports文件中。具体的语法是 /nfs 192.168.36.0/24(rw,sync,no_root_sqush)。在写入完成后,通过service模块将两个进程启动。一个一个启动太慢了就需要用一个循环将两个变量放在一起,并通过{{item}}来指定。这样就成功部署了server端。在客户端(http服务器)也需要下载nfs-utils和rpcbind工具。启动之后通过mount模块指定src为:192.168.36.133:/nfs type为nfs。state为mounted。就成功挂载。