[步骤] Ansible 所管理的服务器的添加和分组

注意:

在添加被 Ansible 管理的服务器前要先安装 Ansible

正文:

步骤一:规划拓扑

1.1 服务器列表

管理服务器 IP 地址:192.168.100.100
被管理的服务器 1 IP 地址:192.168.100.101
被管理的服务器 2 IP 地址:192.168.100.102
被管理的服务器 3 IP 地址:192.168.100.103
被管理的服务器 4 IP 地址:192.168.100.104
被管理的服务器 3 IP 地址:192.168.100.105
被管理的服务器 4 IP 地址:192.168.100.106
被管理的服务器 4 IP 地址:192.168.100.107

1.2 服务器列表简介

1) 管理人员只用 ssh 到管理服务器就可以通过 Ansible 管理其他所有的被管理服务器
2) 将 192.168.100.101 至 192.168.100.110 视作 web1 至 web10 ,它们属于 web 组
3) 将 192.168.100.111 至 192.168.100.115 视作 db1 至 db5 ,它们属于 db 组
4) 将 192.168.100.107 视作新添加的要被管理的服务器 ,它不属于任何组

步骤二:实现管理服务器登录被管理的服务器

2.1 在管理服务器上添加被管理服务器 IP 地址和服务器名的对应关系

# vim /etc/hosts

添加以下内容:

......
192.168.100.100 ansible
192.168.100.101 web1
192.168.100.102 web2
192.168.100.103 web3
192.168.100.104 db1
192.168.100.105 db2
192.168.100.106 db3

2.2 实现管理服务器登录被管理的服务器

2.2.1 让管理服务器无密钥登录要被管理的服务器
2.2.1.1 在管理服务器上生成 SSH 公钥和私钥
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:GGqyQU4+u+eNTaWN4SILhm3QN08ZR3jPWC+quRlsP6c root@test1
The key's randomart image is:
+---[RSA 2048]----+
|       ..        |
|      ... .      |
|  o   o..= .     |
| *   . *. + .    |
|. B = = S. .     |
|.o O * *.        |
|o.* . Xo.        |
|.o +.Bo+. .      |
|  ooo =.E+       |
+----[SHA256]-----+
2.2.1.2 将管理服务器生成的 SSH 公钥复制到要被管理的服务器里
# for i in {100..107} ; do ssh-copy-id 192.168.100.$i ; done

2.3 让管理服务器通过密钥登录要被管理的服务器

2.3.1 指定管理服务器的 Ansible 远程用户
# vim /etc/ansible/ansible.cfg

将以下内容:

......
# remote_user = root
......

修改为:

......
remote_user = root
......
2.3.2 在管理服务器上 Ansible 的服务器列表里给指定的服务器添加登录密码
# vim /etc/ansible/hosts

创建以下内容:

[all:vars]
ansible_password=redhat

步骤三:在管理服务器的 Ansible 上添加服务器列表,并将其分组(从列表优先级的角度来思考)

3.1 Ansible 服务器列表分组的不同优先级(从列表优先级的角度来思考)

1) 最高优先级,设置 Ansible 服务器配置文件的全局变量,并在此变量指定的位置的 Ansible 配置文件和服务器列表文件
3) 第二高优先级,在执行 ansible 命令时,当前目录下的 Ansible 配置文件和服务器列表文件
4) 第三高优先级,在使用 ansible 命令用户家目录下的 Ansible 配置文件和服务器列表文件
5) 第四高优先级,在 /etc/ansible 下的 Ansible 配置文件和服务器列表文件

(注意:Ansible 会严格按照优先级,当有更高优先级的服务器列表时,绝对不会执行低等级的服务器列表)

3.2 通过设置 Ansible 服务器配置文件的全局变量的方法来添加服务器列表

3.2.1 在管理服务器上修改系统环境变量文件
# vim /etc/profile

添加以下内容:

......
export ANSIBLE_CONFIG=/opt/ansible.cfg

(补充:这里以 /opt 目录为例)

3.2.2 在管理服务器上让系统环境变量生效
# source /etc/profile
3.2.3 在管理服务器上在环境变量指定的位置创建 Ansible 的配置文件
# cp /etc/ansible/ansible.cfg /opt/
3.2.4 在管理服务器上指定 Ansible 的服务器列表文件
# vim /opt/ansible.cfg

将以下内容:

......
#inventory      = /etc/ansible/hosts
......

修改为:

......
inventory      = hosts
......

3.3 在管理服务器上添加 Ansible 的服务器列表,并将其分组

# vim /opt/hosts

创建以下内容:

192.168.100.107

[web]
web[1:3]

[db]
db1
db2
db3

(补充:这里以文本列表为例)

3.4 通过在当前目录下创建 Ansible 配置文件和服务器列表文件的方法来添加服务器列表

3.4.1 在管理服务器上进入到 1 个任意此用户有权限的目录
# cd /opt

(补充:这里以 /opt 目录为例)

3.4.2 在管理服务器上的当前位置创建 Ansible 的配置文件
# cp /etc/ansible/ansible.cfg /opt/
3.4.3 在管理服务器上指定 Ansible 的服务器列表文件
# vim /opt/ansible.cfg

将以下内容:

......
#inventory      = /etc/ansible/hosts
......

修改为:

......
inventory      = hosts
......
3.4.4 在管理服务器上添加 Ansible 的服务器列表,并将其分组
# vim /opt/hosts

创建以下内容:

192.168.100.107

[web]
web[1:3]

[db]
db1
db2
db3

(补充:这里以文本列表为例)

3.5 通过在家目录下创建 Ansible 配置文件和服务器列表文件的方法来添加服务器列表

3.5.1 在管理服务器上进入到家目录
# cd
3.5.2 在管理服务器上的家目录位置创建 Ansible 的配置文件
# cp /etc/ansible/ansible.cfg ~/
3.5.3 在管理服务器上指定 Ansible 的服务器列表文件
# vim ~/ansible.cfg

将以下内容:

......
#inventory      = /etc/ansible/hosts
......

修改为:

......
[defaults]
inventory      = hosts
......
3.5.4 在管理服务器上添加 Ansible 的服务器列表,并将其分组
# vim ~/hosts

创建以下内容:

192.168.100.107

[web]
web[1:3]

[db]
db1
db2
db3

(补充:这里以文本列表为例)

3.6 通过修改 Ansible 默认配置文件和默认服务器列表文件的方法来添加服务器列表

3.6.1 在管理服务器上指定 Ansible 服务器列表文件
# vim /etc/ansible/ansible.cfg

将以下内容:

......
#inventory      = /etc/ansible/hosts
......

修改为:

......
inventory      = /etc/ansible/hosts
......
3.6.2 在管理服务器上添加 Ansible 的服务器列表,并将其分组
# vim /etc/ansible/hosts

创建以下内容:

192.168.100.107

[web]
web[1:3]

[db]
db1
db2
db3

(补充:这里以文本列表为例)

步骤四:在管理服务器的 Ansible 上添加服务器列表,并将其分组(从列表种类的角度来思考)

4.1 让管理服务器的 Ansible 使用文本格式的服务器列表文件

4.1.1 分组的方式
4.1.1.1 单个服务器
# vim /etc/ansible/hosts

创建以下内容:

192.168.100.107
4.1.1.2 服务器组
# vim /etc/ansible/hosts

创建以下内容:

192.168.100.107

[web]
web1
web2
web3
4.1.1.3 服务器复合组
# vim /etc/ansible/hosts

创建以下内容:

192.168.100.107

[web]
web1
web2
web3

[db]
db1
db2
db3

[webdb:children]
web
db

(补充:在这里的 webdb 组会同时包含 web 和 db 里的服务器)

4.1.2 列表的描述方式介绍
4.1.2.1 连续的数字
192.168.[0:10].[0:255]

(补充:这里以从 192.168.0.0 到 192.168.10.255 为例)

4.1.2.2 连续的字母
web[a:c]

(补充:这里以从 weba 到 webc 为例)

4.2 让管理服务器的 Ansible 使用 json 格式的服务器列表文件

4.2.1 在管理服务器上进入任意一个此用户有权限的目录
# cd ~

(补充:这里以进入家目录为例)

4.2.2 在管理服务器上的家目录位置创建 Ansible 的配置文件
# cp /etc/ansible/ansible.cfg ~/
4.2.3 在管理服务器上指定 Ansible 的服务器列表文件
# vim ansible.cfg

将以下内容:

......
#inventory      = /etc/ansible/hosts
......

修改为:

......
inventory      = ./hosts.py
......
4.2.4 在管理服务器上使用 Python3 编程语言生成 json 格式的服务器列表
4.2.4.1 在管理服务器上编写生成 json 格式的 Python 程序
# vim hosts.py

创建以下内容:

#!/usr/libexec/platform-python
import json
hostlist = {}
hostlist["web"] = ["192.168.100.101", "192.168.100.103"]

hostlist["db"] = {
        "hosts" :["192.168.100.104", "192.168.100.106"],
        "vars" :{"ansible_ssh_user":"root", "ansible_ssh_pass":"1"}
        }

hostlist["192.168.100.7"] = {
        "ansible_ssh_user":"root", "ansible_ssh_pass":"pwd"
        }

print(json.dumps(hostlist))
4.2.4.2 给刚刚编写的 Python 程序相应的全权
# chmod 755 hosts.py


补充:
使用 Python3 出现报错的处理方法:
1) 显示 yum 的配置文件位置

# whereis yum
yum: /usr/bin/yum /etc/yum /etc/yum.conf /usr/share/man/man8/yum.8.gz

2) 确认 yum 所使用的 Python

# head -1 /usr/bin/yum 
#!/usr/libexec/platform-python

3) 将 hosts.py 第一行的 Python 位置修改成和 yum 所使用的一样

# vim hosts.py

将第一行修改为:

#!/usr/libexec/platform-python
......

步骤五:在管理服务器的 Ansible 上添加服务器列表,并将其分组(多个同优先级相同的列表,从管理的角度来思考)

5.1 在管理服务器上进入任意 1 个此用户有权限的目录

# cd ~

(补充:这里以进入家目录为例)

5.2 在管理服务器上的家目录位置创建 Ansible 的配置文件

# cp /etc/ansible/ansible.cfg ~/

5.3 在管理服务器上指定 Ansible 的服务器列表文件目录

将以下内容:

......
#inventory      = /etc/ansible/hosts
......

修改为:

......
inventory      = ~/hosts/
......
5.2.4 创建 Ansible 的服务器列表文件目录
5.2.4.1 创建第 1 个 Ansible 的服务器列表文件目录
# vim ~/hosts/hostsa

创建以下内容:

[web]
web1
web2
web3
5.2.4.2 创建第 1 个 Ansible 的服务器列表文件目录
# vim ~/hosts/hostsb

创建以下内容:

[db]
db1
db2
db3
5.2.4.3 创建第 3 个 Ansible 的服务器列表文件目录
# vim ~/hosts/others

创建以下内容:

192.168.100.7

步骤六:测试管理服务器 Ansible 的服务器列表

6.1 显示默认服务器列表里的服务器列表

# ansible all -i /etc/ansible/hosts --list-host
  hosts (20):
    web1
    web2
    web3
    db1
    db2
    db3
    192.168.100.107

6.2 显示 web 组的服务器

# ansible web --list-host
  hosts (10):
    web1
    web2
    web3

6.3 显示 db 组的服务器

# ansible db --list-host
  hosts (5):
    db1
    db2
    db3

6.4 显示不属于任何组的服务器

# ansible ungrouped --list-host
  hosts (1):
  192.168.100.7

6.5 显示所有服务器

# ansible all --list-host
  hosts (20):
    web1
    web2
    web3
    db1
    db2
    db3
    192.168.100.107

或者:

# ansible-inventory --graph

[步骤] Ansible 的安装

步骤一:服务器系统要求

1) 服务器的系统需要是 CentOS Linux 8 版本
2) 需要 python3(3.5 或以上) 或 python2(2.7或以上)
3) 服务器系统配置好可用的软件源

步骤二:安装 Ansible

# yum install epel-release
# yum install ansible

[实验] LNMP 平台的搭建 (CentOS Linux 8 版)

步骤一:LNMP 简介

LNMP 是一个实现网站服务的方法,它由 4 样东西组成:
1) Linux 系统
2) Nginx 网页服务
3) MariaDB 数据库
4) PHP 网页程序

步骤二:系统环境要求

1) 服务器的系统需要是 CentOS Linux 8 版本
2) 服务器要关闭防火墙
3) 服务器要关闭 SELinux
4) 服务器系统要配置好可用的软件源

步骤三:搭建 LNMP

3.1 Nginx 网页服务

3.1.1 安装 Nginx 网页服务
# yum -y install nginx
3.1.2 配置 Nginx 网页服务的配置文件
3.1.2.1 删除原有的 Nginx 服务的配置文件
# rm /etc/nginx/nginx.conf
3.1.2.2 创建新的 Nginx 网页服务的配置文件
# cp /etc/nginx/nginx.conf.default /etc/nginx.conf
3.1.2.3 配置 Nginx 网页服务的配置文件
# vi /etc/nginx/nginx.conf

将其中的:

......
        location / {
            root   html;
            index  index.html index.htm;
        }
......
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
......

修改为:

......
        location / {
            root   html;
            index  index.php index.html index.htm;
        }
......
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
        #   fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi.conf;
        }
......

(补充:这里以让 Nginx 将对于 PHP 的请求传递到本机的 9000 端口为例)

3.1.3 启动 nginx 网页服务
# systemctl start nginx

3.2 MariaDB 数据库

3.2.1 安装 MariaDB 数据库
# yum -y install mariadb mariadb-server
3.2.2 启动 MariaDB 数据库
# systemctl start mariadb

3.3 PHP 环境和连接服务

3.3.1 安装 PHP 环境和连接服务
# yum -y install php php-fpm php-mysqlnd php-gd php-mbstring php-opcache php-json php-xml
3.3.2 创建提供 PHP 连接服务的用户
# useradd php-fpm -s /sbin/nologin
3.3.3 配置 PHP 连接服务的配置文件
# vi /etc/php-fpm.conf

添加以下内容:

......
[www]
user = php-fpm
group = php-fpm
listen = 127.0.0.1:9000

(补充:这里以让 php-fpm 监听本地 9000 端口为例)

3.3.4 启动 PHP 连接服务
# systemctl start php-fpm

步骤四:后续工作

1) 给 MariaDB 数据库设置用于存储网页数据的用户和密码
2) 将 PHP 网页程序放到 Nginx 的网页目录下
3) 给 PHP 网页程序设置用于连接 MariaDB 数据库的用户和密码

步骤五:测试 LNMP 平台

使用浏览器访问服务器 IP 地址就可以看到对应 PHP 网页了

[实验] VNC 远程桌面服务的搭建

纪念:站主于 2020 年 1 月完成了此开源实验,并将过程中的所有命令经过整理和注释以后,形成以下教程

软件准备:

在 RealVNC 官网上下载使用 VNC 服务所需软件 VNC View:

https://www.realvnc.com/en/

正文:

步骤一:规划拓扑

1.1 服务器列表

服务端 192.168.100.10
客户端 192.168.100.11

1.2 服务器列表简介

1) 服务器提供 VNC 服务让其他设备可以远程自己的桌面
2) 客户端通过 VNC 服务远程服务器的桌面

步骤二:系统环境要求

1) 所有服务器的系统都需要是 CentOS 7 版本
2) 所有服务器都要关闭防火墙
3) 所有服务器都要关闭 SELinux
4) 所有服务器系统都要配置好可用的软件源
5) 需要按照拓扑图给对应的服务器配置好 IP 地址和主机名
6) 所有服务器都要可以相互 ping 通自己和对方的 IP 地址和主机名

步骤三:服务端安装 VNC 服务

3.1 服务端 VNC 环境准备

3.1.1 在服务端上安装桌面

(只在服务端上执行以下步骤)

# yum -y groupinstall "Server with GUI"
# yum -y groupinstall "GNOME Desktop"
3.1.2 在服务端上创建用于使用 VNC 的用户
3.1.2.1 创建用户

(只在服务端上执行以下步骤)

# useradd zhumingyu
3.1.2.2 修改用户密码

(只在服务端上执行以下步骤)

# passwd zhumingyu

3.2 服务端安装 VNC 服务

(只在服务端上执行以下步骤)

# yum -y install tigervnc tigervnc-server

步骤四:配置 VNC 服务

4.1 创建 VNC 服务进程文件

(只在服务端上执行以下步骤)

# cp /lib/systemd/system/vncserver\@.service /lib/systemd/system/vncserver\@:1.service

4.2 编辑 VNC 服务进程文件

(只在服务端上执行以下步骤)

# vi /lib/systemd/system/vncserver\@:1.service

将其中的:

......
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=forking

# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l <USER> -c "/usr/bin/vncserver %i"
PIDFile=/home/<USER>/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[Install]
WantedBy=multi-user.target

修改为:

......
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=forking

# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l zhumingyu -c "/usr/bin/vncserver %i"
PIDFile=/home/zhumingyu/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[Install]
WantedBy=multi-user.target

步骤五:开机自启 VNC 服务

5.1 刷新所有服务进程文件

(只在服务端上执行以下步骤)

# systemctl daemon-reload

5.2 开机自启 VNC 服务

(只在服务端上执行以下步骤)

# systemctl enable vncserver@:1.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vncserver@:1.service to /usr/lib/systemd/system/vncserver@:1.service.

步骤六:启动 VNC 服务

6.1 切换到使用 VNC 的用户

(只在服务端上执行以下步骤)

# su - zhumingyu

6.2 开启 VNC 服务

(只在服务端上执行以下步骤)

$ vncserver :1

You will require a password to access your desktops.

Password:
Verify:
Would you like to enter a view-only password (y/n)? y
Password:
Verify:

New 'vnc:1 (zhumingyu)' desktop is vnc:1

Creating default startup script /home/zhumingyu/.vnc/xstartup
Creating default config /home/zhumingyu/.vnc/config
Starting applications specified in /home/zhumingyu/.vnc/xstartup
Log file is /home/zhumingyu/.vnc/vnc:1.log

6.3 补充:修改 VNC 登录密码的方法

# su - zhumingyu
$ vncpasswd

步骤七:确认 VNC 服务是否启动成功

(只在服务端上执行以下步骤)

$ ss -ntulap | grep 5901
tcp    LISTEN     0      5         *:5901                  *:*                   users:(("Xvnc",pid=1152,fd=9))
tcp    LISTEN     0      5      [::]:5901               [::]:*                   users:(("Xvnc",pid=1152,fd=10))

步骤八:客户端使用 VNC 服务

8.1 客户端使用 VNC 服务的前期工作

8.1.1 在客户端上安装桌面

(只在客户端上执行以下步骤)

# yum -y groupinstall "Server with GUI"
# yum -y groupinstall "GNOME Desktop"
8.1.2 客户端安装 VNC 服务的客户端

(只在客户端上执行以下步骤)

# yum -y localinstall VNC-Viewer-6.19.1115-Linux-x64.rpm

(补充:这里以安装 VNC-Viewer-6.19.1115-Linux-x64.rpm 为例)

8.1.3 客户端启动桌面

(只在客户端上执行以下步骤)

# startx
(图:1)

8.2 客户端使用 VNC 服务

8.2.1 客户端启动 VNC 服务的客户端

(只在客户端上执行以下步骤)

(图:2)
(图:3)
(图:4)
8.2.2 连接服务端的 VNC IP 地址和端口号

(只在客户端上执行以下步骤)

(图:5)
(图:6)
8.2.3 输入服务端 VNC 用户的 VNC 密码

(只在客户端上执行以下步骤)

(图:7)
8.2.4 VNC 服务成功

(只在客户端上执行以下步骤)

(图:8)