我们的未来

蔚蓝的天空
沐浴着圣洁的阳光
它依旧在作着无忧无虑的梦

如今的大地
已在寂静之中
开始了隐秘却剧烈的翻滚

那些温柔又神圣的祈祷
还未传播到需要的地方
便开始消失匿迹

那些理性又严谨的理想
还未开始深刻的探讨
便被尘封于盲从的大潮

生命的意义
应该如何用本来就矛盾的思想去诠释?
灵魂的价值
又该如何用独一无二的人生去描述?

在纯白的、洁白的、净白的憧憬之后
会创造和邂逅出怎样的未来
在迷惑的、困惑的、迷茫的挣扎之后
是否能在虚空之中真正开始独立思考

那些让人类感到混沌不堪却又欲罢不能的说法
该如何回归到它该有的澄清?
那些充满自我牺牲与博爱却又容易被误解的传奇
又该如何依靠历史的密码去佐证?

在鲜红的、血红的、艳红的青春热情之后
会创造和邂逅出怎样的未来
在努力的、拼命的、穷尽一切的尝试之后
是否能在虚空之中找到真正的路

能够让每一个人都听到公平、包容、理解的歌谣
能够让每一个人都能够公平实现自我价值和自我幸福
能够创造和邂逅出一个属于这个星球上每一个人的未来

[内容] Ansible Playbook 的排错技巧

注意:

在使用 Ansible Playbook 之前,要先安装 Ansible、添加被 Ansible 管理的主机,并且需要 root 权限

正文:

内容一:Ansible Playbook 语法检查的方法

# ansible-playbook --syntax-check <yaml>

或者:

# ansible-playbook --syntax <yaml>

内容二:Ansible Playbook 测试运行的方法

# ansible-playbook -C <yaml>

内容三:Ansible Playbook 显示执行内容的方法

# ansible-playbook <yaml> --list-tasks

[内容] Ansible 执行脚本 Playbook 的结构

注意:

在使用 Ansible Playbook 之前,要先安装 Ansible、添加被 Ansible 管理的主机,并且需要 root 权限

正文:

内容一:Ansible Playbook 的结构介绍

1) Playbook 是 yaml 结构
2) Playbook 默认的执行顺序是从上往下 1 个层级接着 1 个层级地执行,若某个命令报错则不会再执行下面的命令

内容二:Ansible Playbook 的常用目录层级种类

1) vars

变量层


2) tasks

任务层


3) handlers

触发条件层


4) files

文件层


5) template

模板层


6) default

优先级最低层

[步骤] 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