网络管理与维护综合实训

第九周实训 ansible

周一

Centos 安装

1. 镜像下载

Centos7 今年 6 月就停止维护(会撤源,然后几乎就不能用了)

可以下百度网盘,也可以用这个地址(选7 (x86_64, DVD)

https://mirrors.cernet.edu.cn/os/centos

2. 安装

推荐英文

  1. 可能需要的小点

  1. ISO 镜像:

  2. 安装,选第一个 INSTALL CENTOS7

  1. root 用户名密码

  1. 进系统

3. 克隆

可有可无,有被控机子就行。

配置 EPEL 源、安装 Ansible

粘贴:CTRL+SHIFT+V

master(非克隆机子)上,开机,左上角,开终端

1
2
3
4
su
ping 223.5.5.5 #测试网络
yum install epel-release -y # EPEL源
yum install ansible -y

设置从节点主机名

不知道有没有必要性,可以先弄一下(

搭嘎这样:

1
2
3
4
su
hostnamectl set-hostname node1
[dayi@localhost ~]$ bash
[dayi@node1 ~]$

Centos 关闭自动锁屏

配置免密登录

在主机生成 RSA 密钥对

1
2
su
ssh-keygen -t rsa

查看 IP 地址

先查看 IP 地址:

1
ip addr

下面俩小节选一个就可以

【centos 系】[被控机是 centos 红帽子 系,一般是默认允许 root 直接 ssh 登录]

在 master 上:

1
2
su
ssh-copy-id root@[IP地址]

be-like:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~]# ssh-copy-id root@192.168.59.156
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.59.156 (192.168.59.156)' can't be established.
ECDSA key fingerprint is SHA256:QWGWPbUMNku1ClDrzhN2GOt3T7GfghnMIjj9b4J8qaA.
ECDSA key fingerprint is MD5:5d:bb:9b:49:c5:d9:37:c7:dd:60:dd:14:92:e9:f3:47.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.59.156's password:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh 'root@192.168.59.156'"
and check to make sure that only the key(s) you wanted were added.

[root@localhost ~]#

【debian 系】 [被控机是 Debian 系,一般不允许 root 直接登录]

注意这个跟上面做一个就可以。【debian 系和 centos 系】

跟作业一样啦:

  • 先被控机允许 ROOT 登录
  • 然后ssh-copy-id复制秘钥到主机。
【debian 系】先设置允许 root 通过 ssh 登陆

在被控机:

如果你发现 root 用户无法通过 ssh 登陆到主机(会提示密码错误什么的):(主控机和被控机)

1
2
3
su 
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
systemctl restart sshd

这样就好啦。

主控机和被控机都做一下

如果你发现可以直接 root 登陆就不用做这一步了。

【debian 系】设置免密登陆

debian 系包括 Debian kali ubuntu 等

在 master 上

1
2
su #直接用root了,方便,可以用其他用户
ssh-keygen -t rsa # 生成RSA密钥 一直回车就可以

复制 controler(master 机器)的公钥,到其他的几个被控机器上。(会提示输入密码和 yes)(在 master 上输入)

1
2
3
4
su
ssh-copy-id root@192.168.59.154 [你的IP地址]
ssh-copy-id root@192.168.59.151
ssh-copy-id root@192.168.59.153

测试免密登陆

1
ssh root@192.168.59.154

这样不输入密码就登陆上就可以啦(退出的话输入 exit)

测试免密登录

1
2
3
4
5
su
ssh root@【被控机IP地址】
ssh root@192.168.59.156
ssh root@192.168.59.157
ssh root@192.168.59.153

大概就这样,想控几个配几个

Ansible 配置

这个是 ROOT 用户的:原话:上午做的 ROOT 用户,下午要改。普通用户的。

如果你在图形化界面

1
2
3
su
mkdir -pv /etc/ansible/
nano /etc/ansible/hosts

文件内容类似这样:

1
2
3
4
5
6
7
8
9
10
11
12
node1 ansible_host=192.168.59.156
node2 ansible_host=192.168.59.157
node3 ansible_host=192.168.59.153


[dayi]
node1
node2
node3

[ovo]
localhost ansible_connection=local

CTRL+W 写入文件
ctrl+s 保存文件(可能不同版本没有这个)
ctrl+x 退出

测试下

1
ansible -m ping all

belike:

非 ROOT 用户使用 ansible(救命)

配置 sudo 权限 【controller 机子、和其他所有的机子】

这个命令要在所有机子上执行(controller(主机)和 slaves(被控几)上)

1
2
3
4
5
su
#这一行尽量复制注意空格,(记得用户名改成你自己的)
echo "dayi ALL=(ALL) NOPASSWD: ALL">>/etc/sudoers
su dayi #切换到你的用户
sudo su #试试有没有权限

这样就可以了

记得被控机也弄一下

然后重新配置 ansible (救命)

【controller 机子的】

救命高建鑫没装 ansible
1
2
3
su
sudo yum install epel-release -y # EPEL源
sudo yum install ansible -y
下一步
1
2
3
4
5
su dayi #你的用户名
cd ~
mkdir ansible
cd ansible
cp -a /etc/ansible/ansible.cfg . #这里有个[.]!!
需改配置 1
1
2
su dayi #这里输入的root密码,意思是切换到你的用户,如果在了就不用了。
vim ~/ansible/ansible.cfg

VIM 使用:(高建鑫打不上字看这个)

键盘 作用
i 输入模式
ECS -> 输入:wq 保存+退出

这里两种改法:/home/dayi/ansible/inventory或者~/ansible/inventorydayi是你的用户名

这里,改成 False

需要改配置 2

还是同样一个文件

在 vim 下搜索,先 ESC 退出插入模式,输入/privilege_escalation然后回车,然后再按 I 键

把#去掉:

这样子。

输入 ESC 然后输入 :wq 保存文件

复制 controller 的普通用户的公钥到 slave普通用户的免密登录(again)

1
2
3
4
5
su dayi
ssh-keygen -t rsa #一路回车
ssh-copy-id dayi@192.168.59.156
ssh-copy-id dayi@192.168.59.157
ssh-copy-id dayi@192.168.59.153

测试免密登录

1
2
3
ssh dayi@192.168.59.156
ssh dayi@192.168.59.157
ssh dayi@192.168.59.153

这样就可以了

修改那个vim inventory

1
2
su dayi
nano ~/ansible/inventory

1
2
3
4
5
6
7
8
9
10
11
12
node1 ansible_host=192.168.59.156
node2 ansible_host=192.168.59.157
node3 ansible_host=192.168.59.153


[dayi]
node1
node2
node3

[ovo]
localhost ansible_connection=local

测试

1
2
cd ~/ansible
ansible all -m ping

这样就可以了。

常见错误

对于 debian 系统没有 sudo

1
2
3
4
5
6
7
su
apt install sudo -y
echo "dayi ALL=(ALL) NOPASSWD: ALL">>/etc/sudoers
su dayi
echo "export PATH=\$PATH:/sbin" >> ~/.bashrc
source ~/.bashrc
sudo su #测试
  • 提示什么./.tmp/ XXXX 没有权限 关键词“Permission denied”,这说明你在 root 用户下操作了一些在普通用户的文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#暴力解决
sudo su
rm -rf /home/dayi/.ansible

# 再试一试,如果可以了后面不用了


chmod +777 -R /home/dayi/.ansible
# 再试一试,如果可以了后面不用了

#暴力
chmod +777 -R /home/* #全部给全部权限,所有文件
su dayi
chmod +600 ~/.ssh/id_rsa #给太多了,修一个
chmod u+x,g-wx,o-wx ansible #第二个

#如果普通用户不行就root

修改 IP 地址

不知道为什么好像要固定 IP,但是我好像没听清这个是不是必须的要求。

我只能说,改 IP 是个大活(

说是要改成这样:

先把分配 IP 的地方改过来

机子执行命令

1
(没啥好命令,都很复杂,不同发行版系统差距大)

图形化界面(UI)修改 centos7

关了再开:

查看生效(不生效重新设一次,重启试试)

SHELL 修改 centos7

1
2
sudo su
nmtui #如果没有输入 yum install NetworkManager-tu

1
sudo systemctl restart network # 重启网络服务

SHELL 修改 debian

debian 不推荐用 nmtui,因为默认的网络管理器不同,但是对于有线也可以用

nmtui 方法:

1
2
sudo apt-get install network-manager -y
sudo nmtui #但是要手动添加网络

推荐:

1
2
sudo nano /etc/network/interfaces

修改这里:

注意你不一定是 ens33

1
2
3
4
5
iface ens33 inet static
address 192.168.132.13/24
network 192.168.132.0
gateway 192.168.132.2
dns-nameservers 223.5.5.5 192.168.132.2

重启网络服务

1
sudo systemctl restart networking

记得改完 IP 测下是否还可以上网

1
ping qq.com

无损修改 IP(DHCP 分配)

感觉好像反而复杂了,干脆用【修改 IP 地址】章节手动改吧。

好像要一起固定 IP?我好像没听清这个是不是必须的要求。

我现在的大概这个样子:

1
2
3
4
192.168.59.155 master
192.168.59.156 node1
192.168.59.157 node2
192.168.59.153 py-ovo3

要改成:

其实也挺好,那样后面的 IP 就统一啦。

无损(指不动现有的虚拟机、从 DHCP 来整)这样做

1
2
3
4
5
6
7
8
9
10
1. 虚拟网络管理器
2. 更改设置
3. 找那个NAT模式的
4. 改IP段,保存
5. 查MAC地址(四个机子的 记录下来)
6. WIN+X 选择管理员(终端 或者 powershell)
7. 写配置文件
8. 保存文件
9. 重启DHCP
10. 重启虚拟机
1-4 步

5 步

记录着三个地方的 MAC 地址:

1
ip addr

记录一下四个机子的 IP 地址

6 步

在你的 windows(宿主机)上,WIN+X 打开 cmd 或者 powershell 或者记事本

输入

1
notepad C:\ProgramData\VMware\vmnetdhcp.conf

7 步

很遗憾的是,【编辑】->【虚拟网络编辑器】后,会重置 vmnetdhcp.conf 文件 ,所以你改的这个内容,最好要备份一下)

输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
host ovo_controller {
hardware ethernet 00:0c:29:3f:22:a2; #这里改为controller的地址
fixed-address 192.168.132.10;
}
host ovo_node1 {
hardware ethernet 00:0c:29:c9:96:7b; #这里改为node1的MAC地址
fixed-address 192.168.132.11;
}
host ovo_node2 {
hardware ethernet 00:0c:29:24:fb:d8; #这里改为node2的MAC地址
fixed-address 192.168.132.12;
}
host ovo_node3 {
hardware ethernet 00:0c:29:67:10:46; #这里改为node3的MAC地址
fixed-address 192.168.132.13;
}
8 步,塞后面。保存

保存不了可以另存为桌面,然后在手动复制到:C:\ProgramData\VMware\

9-10 步

管理员终端

1
2
net stop VMnetDHCP
net start VMnetDHCP

然后把虚拟机重启了

也可以不重启,输入这个

1
systemctl restart network

改完 IP 再改下配置文件

是这样的,再在 controller 做:

1
2
3
su
su dayi
nano ~/ansible/inventory

改下 IP

救命,高建鑫没配置文件

1
2
3
4
5
6
7
8
9
10
11
12
node1 ansible_host=192.168.132.11
node2 ansible_host=192.168.132.12
node3 ansible_host=192.168.132.13


[dayi]
node1
node2
node3

[ovo]
localhost ansible_connection=local

正常修改只需要注意这三行

1
2
3
node1 ansible_host=192.168.132.11
node2 ansible_host=192.168.132.12
node3 ansible_host=192.168.132.13

重新认下 IP

1
2
3
4
# yes之后直接exit就行
ssh dayi@192.168.132.11
ssh dayi@192.168.132.12
ssh dayi@192.168.132.13

再测试一遍:

1
2
cd ~/ansible
ansible all -m ping


以上为周一。

周二

推荐 ssh 工具:Xterminal

配置文件:登录用户

可以不修改,不做这一步。

vim (文件位置vim ~/ansible/ansible.cfg)输入/remote_user可以找到这行,然后就可以改登录名了

比如这样(但默认也会是你默认当前登录的用户名)

inventory 配置文件

【仅为格式】不用复制进去。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#批量定义IP
192.168.132.[10-12]


# 父组儿子组
[sjc]
node2

[dev]
node1

[父组.儿子组]
dev
sjc

验证清单

1
2
3
4
# 查看node1
ansible node1 --list-host

ansible all --list-host #查看全部主机
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[dayi@ansible-master ansible]$ ansible node1 --list-host
hosts (1):
node1
[dayi@ansible-master ansible]$ ansible dayi --list-hosts #其实是都可以
hosts (3):
node1
node2
node3
[dayi@ansible-master ansible]$ ansible dayi --list-host #查看组里的表
hosts (3):
node1
node2
node3
[dayi@ansible-master ansible]$

如果没有匹配,返回nothing to do

[debian] debian12 安装 python2

仅没有 python2 的环境,centos7 比较老所以有

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
su
cd /opt
apt-get install build-essential
echo "deb http://mirrors.ustc.edu.cn/debian bookworm main contrib non-free non-free-firmware" >> /etc/apt/sources.list
echo "deb http://mirrors.ustc.edu.cn/debian bookworm-updates main contrib non-free non-free-firmware">>/etc/apt/sources.list
nano /etc/apt/sources.list #看看有没有重行
apt update
apt install gcc make -y
apt install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libpcap-dev xz-utils libexpat-dev -y
apt-get install libssl-dev -y
apt-get install libsqlite3-dev -y
apt-get install libnsl-dev libtirpc-dev -y
wget https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz
tar -zxxf Python-2.7.13.tgz
cd Python-2.7.13
./configure --with-pydebug
make -s -j16

# PATH添加 最后一行
nano /etc/profile
export PATH=$PATH:/opt/Python-2.7.13/
# 保存退出

# 链接文件
ln -s /opt/Python-2.7.13/python /usr/bin/
python -V

root@py-ovo3:/opt/Python-2.7.13# python -V
Python 2.7.13

指定配置文件路径

默认会寻找当前目录下的ansible.cfg找不到就用默认的/etc/ansible/ansible.cfg

具体就是:

  • 当前目录 (./ansible.cfg) > 主目录 (~/.ansible.cfg)>环境变量 ($ANSIBLE_CONFIG)>系统级配置文件 (/etc/ansible/ansible.cfg)

氢弹文件

1
2
3
ansible -i [清单inventory文件位置]
#或者
ansible --inventory

查看 ansible-doc

1
ansible-doc ping【这里是模块名】

查看全部模块

1
2
ansible-doc -l #q回车退出或者ctrl+c
ansible-doc -l |grep ^fetch #【筛选gerp】

模块命令

复制文件

controller -> node : copy 模块
node -> controller : fetch 模块

同步 hosts

这里推荐一起执行了

1
2
su
vim /etc/hosts

添加输入这个(i输入,:wq!保存)

1
2
3
4
192.168.132.10 controller
192.168.132.11 node1
192.168.132.12 node2
192.168.132.13 node3

然后复制文件

1
2
3
su dayi
cd ~/ansible/
ansible all -m copy -a "src=/etc/hosts dest=/etc/hosts mode=644"

复制一个普通文件
1
2
3
su dayi
echo "ovo" >> ~/ovo.txt
ansible all -m copy -a "src=/home/dayi/ovo.txt dest=/home/dayi/ovo.txt owner=dayi mode=644"

从机上有了:

建用户

1
ansible all -m user -a "name=dayi_nologin comment=ovo uid=1200 group=root shell=/sbin/nologin"

查看当前用户们

1
2
compgen -u
lastlog

被控几上也有咧:

【课上作业 1】1、通过 fetch 命令将 node1 上的/etc/resolv.conf 复制到 control 节点、2、利用 file 模块,在 node1 上创建一个软连接

要求

1、通过 fetch 命令将 node1 上的/etc/resolv.conf 复制到 control 节点的/home/upwen/shankeda/,并重命名为 hello.conf

2、利用 file 模块,在 node1 上创建一个软连接,将 hosts-link 连接到/home/upwen/hosts

1
2
# 查看文档用
ansible-doc fetch

1. fetch

1
2
mkdir -pv ~/shankeda/
ansible node1 -m fetch -a "src=/etc/resolv.conf dest=~/shankeda/"

2. file

1
2
3
4
5
echo "ovo_ovo" >> ~/hosts
ansible all -m copy -a "src=/home/dayi/hosts dest=/home/dayi/hosts owner=dayi mode=644"
ansible node1 -m file -a "src=/home/dayi/hosts dest=/home/dayi/hosts-link owner=dayi group=dayi state=link"

# ansible node1 -m file -a "src=/etc/hosts dest=/home/dayi/hosts owner=dayi group=dayi state=link"

模块命令 2

shell 模块

1
ansible node1 -m shell -a "ls /home/dayi"

yum 模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#塞进去
ansible all -m yum_repository -a " name=ali_centos7 description=epel baseurl=/mirrors.aliyun.com/epel/7/$basearch gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 enabled=1 "
# 看看有没有
ansible all -m shell -a " ls /etc/yum.repos.d/ |grep ali_centos7"
#查看仓库信息
ansible all -m shell -a " cat /etc/yum.repos.d/ali_centos7.repo"
# 测试可用 (我这里报错了,说没有前缀)
ansible all -m shell -a " yum info vsftpd --enablerepo=ali_centos7 "
## 没报错不用继续了,小修:


## 字符串替换
ansible all -m shell -a " sudo sed -i 's#baseurl = /mirrors.aliyun.com/epel/7/#baseurl = https://mirrors.aliyun.com/epel/7/x86_64/#' /etc/yum.repos.d/ali_centos7.repo"

ansible all -m shell -a " cat /etc/yum.repos.d/ali_centos7.repo"

# 测试可用
ansible all -m shell -a " yum info vsftpd --enablerepo=ali_centos7 "


# 应该是不可用,好像是没有包
ansible all -m shell -a "yum makecache&& yum info vsftpd --disablerepo=* --enablerepo=ali_centos7 "

我这里,node3炸了正常,因为不是centos

报错:

小修:

还是可能有问题,阿里云的锅。正常。

Playbook

COPY

如果觉得文本编辑很难用,推荐用 xterminal vscode-ssh 插件 xterminal mobaxterm 来进行修改

1
2
cd ~/ansible
nano copy_a_file.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
---
#开始play内容
#以- name开头,描述该play的作用,注意:和后边有空格
- name: copy a file
#描述主机清单列表
hosts: all
#写明任务
tasks:
#接下来就似乎编写playbook
#第一行- name写明你这个play下的tasks想要做什么(描述)
- name: Copy /home/upwen/ansible/inventory to nonde
#调用对应模块,如本tasks当中使用的是copy,并且通过ansible-doc copy可以查看到copy模块的具体使用方法;
#根据你的虚修来配置
copy:
src: /home/dayi/ansible/inventory/
dest: /home/dayi/hosts
owner: dayi
group: dayi
mode: '0666'

验证+执行

1
2
3
4
5
ansible-playbook --syntax-check copy_a_file.yaml #检查缩进
ansible-playbook --check copy_a_file.yaml #预测结果
ansible-playbook copy_a_file.yaml -vv #真正执行

ansible all -m shell -a "cat /home/dayi/hosts" #查看


来份 114514

1
2
echo "114514">>~/114514.txt
vim copy_11451.yaml
1
2
3
4
5
6
7
8
9
10
11
12
---
- name: Copy file to all nodes
hosts: all
become: yes
tasks:
- name: Copy ~/114514.txt to remote user home directory
copy:
src: ~/114514.txt
dest: "{{ ansible_user_dir }}/114514.txt"
owner: dayi
group: dayi
mode: '0644'

1
2
3
ansible-playbook --check copy_11451.yaml #预测结果
ansible-playbook copy_11451.yaml -vv #真正执行
ansible all -m shell -a "cat ~/114514.txt" #查看

镜像源

该过程约占用 40G 的空间

工具

Xshell 绿色版:https://p.dabbit.net/blog/pic_bed/sharex/_pn-2024-04-23-15-30-32_Murrelet_Junior_Realistic.7z

连接 SSH,复制 ISO 镜像到/opt

这样子:

(谢邀,没磁盘空间了)

挂载镜像安装内容

如果你镜像名字不一样,对应改一下。

先把文件复制到/opt

1
2
3
4
5
[dayi@ansible-master ~]$ sudo su      
[root@ansible-master dayi]# ls
114514.txt CentOS-7.5-x86_64-DVD-1804.iso Documents hosts ovo.txt Public Templates
ansible Desktop Downloads Music Pictures shankeda Videos
[root@ansible-master dayi]# mv CentOS-7.5-x86_64-DVD-1804.iso /opt

从光盘复制 yum 文件到本地

然后挂载镜像,复制出来

我感觉有点奇怪,咱先照着做了.

这里特地一个修复的

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo su
cd /opt
mkdir -p /mnt/cdrom/
mount -t iso9660 /opt/CentOS-7.5-x86_64-DVD-1804.iso /mnt/cdrom/

mkdir -pv /opt/yumrepo #【关键】 #这行修复的,不加这行会复制到一个文件里。

sudo cp -a /mnt/cdrom/Packages/ ./yumrepo/
sudo cp -a /mnt/cdrom/repodata/ ./yumrepo/

sudo chmod +644 /opt/yumrepo
sudo chmod +644 /opt/yumrepo/Packages
sudo chmod +644 /opt/yumrepo/repodata

oppos

这里,如果你虚拟机分了 20G 磁盘,很容易出现磁盘空间不足导致的错误

关键词:”IO ERROR” “NO SPACE”

可以看一看这个文章,对的扩容磁盘超级超级麻烦!

https://zhuanlan.zhihu.com/p/83340525

复制文件到结点 PLAYbook

1
2
3
su dayi
cd ~/ansible
nano copy_yum.yaml

文件内容:

1
2
3
4
5
6
7
8
---
- name: copy a file
hosts: all
tasks:
- name: copy /opt/yumrepo/ to /opt/yumrepo/
copy:
src: /opt/yumrepo/
dest: /opt/yumrepo/

执行命令:

1
2
3
4
#执行
ansible-playbook copy_yum.yaml -vv

ansible all -m shell -a "ls -alh /opt/"

挺慢的,等就可以咧

第二个命令执行结果:

该步骤过慢可以看下面的章节【周三】->【配仓库】->【小修】->【加速文件分发】

周三

配仓库

小修

为了让
1
ls -alh /opt/yumrepo

/opt/yumrepo里要这个样子:

所以这样做

也就是已经这个样子了,就不用做这个了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 小修 ?
su
cd /opt
mkdir -p /mnt/cdrom/
chmod +777 /opt
rm -rf /opt/yumrepo
mkdir -pv /opt/yumrepo

sudo mount -t iso9660 /opt/CentOS-7.5-x86_64-DVD-1804.iso /mnt/cdrom/
sudo cp -a /mnt/cdrom/Packages /opt/yumrepo/
sudo cp -a /mnt/cdrom/repodata /opt/yumrepo/

su
chmod +644 /opt/yumrepo
chmod +644 /opt/yumrepo/Packages
chmod +644 /opt/yumrepo/repodata
su dayi
1
ls -alh /opt/yumrepo

/opt/yumrepo里要这个样子:

然后重新发文件:

1
2
3
4
5
su dayi
cd ~/ansible
ansible node1,node2,node3 -m shell -a "rm -rf /opt/yumrepo"
ansible-playbook copy_yum.yaml -vv #超级慢,太慢可以看下面这个[label:ovo]
ansible all -m shell -a "ls -alh /opt/yumrepo"

我这里差不多要发 50 分钟多没发完一个(

加速文件分发
1
2
3
4
5
6
7
8
9
10
11
# 加速文件分发 这几行相当于:[label:ovo]
su
cd /opt
tar zcvf yumrepo.tar.gz yumrepo
chmod +644 /opt/yumrepo.tar.gz
su dayi
cd ~/ansible
ansible node1,node2,node3 -m copy -a "src=/opt/yumrepo.tar.gz dest=/opt/" -v
ansible node1,node2,node3 -m shell -a "cd /opt && tar -zxvf yumrepo.tar.gz"
rm -rf /opt/yumrepo.tar.gz
ansible node1,node2,node3 -m shell -a "rm -rf /opt/yumrepo.tar.gz"

CPU 都给我卡死了。

不容易:

【可选】删除从节点全部 yum 仓库

这个我没做

你可以玩玩这个 PLAYBOOK(建议先打个快照)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
---
- hosts:
- node1
- node2
- node3
become: yes

tasks:
- name: Remove yum repo directories
file:
path: "{{ item }}"
state: absent
loop:
- /etc/yum.repos.d
- /opt/yumrepo
- /var/cache/yum
- /var/lib/rpm

- name: Clean yum cache
command: yum clean all
args:
warn: false

- name: Remove rpm database
command: rm -f /var/lib/rpm/__db*
args:
warn: false

配置本地 YUM 仓库 playbook

1
2
3
su dayi
cd ~/ansible/
nano yum_packages.yml

内容

1
2
3
4
5
6
7
8
9
10
11
12
---
- name: create a repo
hosts: all
tasks:

- name: Add repository
yum_repository:
name: epel_local_opt #这里我有改过
description: EPEL YUM repo
baseurl: file:///opt/yumrepo/
enabled: yes
gpgcheck: no

继续执行:

1
2
3
4
5
6
ansible-playbook yum_packages.yml
ansible all -m shell -a " yum makecache "
ansible all -m shell -a " ls /etc/yum.repos.d/ "
ansible all -m shell -a " cat /etc/yum.repos.d/epel_local_opt.repo "
ansible all -m shell -a " yum repolist all |grep epel_local_opt"
ansible all -m shell -a " yum info vsftpd --disablerepo=* --enablerepo=epel_local_opt" #禁用其他仓库,仅使用这个本地。

继续

1
2
3
su dayi
cd ~/ansible
vim yum_install_vsftpd.yml

文件内容:

1
2
3
4
5
6
7
8
---
- name: install a packages
hosts: node1
tasks:
- name: install vsftpd
yum:
name: vsftpd
state: present
1
ansible-playbook yum_install_vsftpd.yml

启动 vsftpd

1
2
3
4
5
su dayi
cd ~/ansible
ansible node1 -m shell -a " systemctl status vsftpd "

vim start_vsftpd_service.yml

文件内容:

1
2
3
4
5
6
7
8
9
---
- name: start a services
hosts: node1
tasks:
- name: start vsftpd
service:
name: vsftpd
state: started
enabled: yes

继续

1
ansible-playbook start_vsftpd_service.yml

检查

1
ansible node1 -m shell -a " systemctl status vsftpd "

两个 play;1 个 play,多个 tasks

1
2
su dayi
cd ~/ansible/

nano installstart_1.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
---
#play1 install packages
- name: install a packages
hosts: node1
tasks:

- name: install vsftpd
yum:
name: vsftpd
state: present
#play2 start
- name: install a packages
hosts: node1
tasks:
- name: start vsftpd
service:
name: vsftpd
state: started
enabled: yes
1
ansible-playbook installstart_1.yml

nano installstart_2.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
---
- name: install a packages
hosts: node1
tasks:
#tasks1 install
- name: task1 install vsftpd
yum:
name: vsftpd
state: present
#tasks2 start
- name: task2 start vsftpd
service:
name: vsftpd
state: started
enabled: yes
1
ansible-playbook installstart_2.yml

【课上作业 2】

1
2
3
4
使用user模块创建用户:用户名为你个人的姓
指定家目录为/opt/你的名字
shell登录环境为/sbin/nologin
描述为你的名字的全称
1
2
3
su dayi
cd ~/ansible
nano task_2_ovo.yaml

nano task_2_ovo.yaml

1
2
3
4
5
6
7
8
9
10
---
- hosts: all
become: yes
tasks:
- name: 'create user'
user:
name: "dayi_ovo" #姓:li
comment: "dayiiiiiiiiiiiii" # 名:ligoudan
home: "/opt/dayiiiiiiiiiiiii" # 名:ligoudan
shell: "/sbin/nologin"

继续执行

1
2
ansible-playbook task_2_ovo.yaml -vv
ansible all -m shell -a "cat /etc/passwd|grep dayi_ovo"

ovo 查看:

变量

字母、数字、下划线

1
2
3
4
5
su dayi
cd ~/ansible
nano crate_user_var.yaml
ansible-playbook crate_user_var.yaml -vv
ansible all -m shell -a "cat /etc/passwd|grep lisisi"
1
2
3
4
5
6
7
8
9
10
11
---
- name: create a user use vars
vars:
username: lisisi
hosts: all
tasks:
- name: create {{ username }}
user:
name: "{{ username }}"
comment: "{{ username }}"
uid: "1405"

周三下午

要求

如何利用 ansible 为多台 linux 服务器同时配置网站服务:
lamp:linux+apache+mysql+php
1.安装
2.启动服务
3.防火墙
4.test page

先分个组

1
2
3
4
5
vim ~/ansible/inventory

[prod]
node2
node3

写 index.php 文件到

1
2
3
su dayi
cd ~/ansible
echo "<?php phpinfo(); ?>" >> index.php

lamp.yaml

1
2
3
su dayi
cd ~/ansible/
nano lamp.yaml

lamp.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
---
- name: install lamp
hosts: prod
tasks:
- name: install packages
yum:
name: "{{ packages}}"
vars:
packages:
- httpd
- php
- mariadb
- mariadb-server
state: latest

- name: start services
service:
name: httpd
enabled: yes
state: started

- name: copy index.php to node
copy:
src: ~/ansible/index.php
dest: /var/www/html/index.php
mode: '0644'
#php he mariadb 默认是起来的

- name: start firewall
firewalld:
service: http
permanent: yes
state: enabled
immediate: yes

#test php page
- name: test php
hosts: node1
tasks:
- name: use uri to test node2 php page
uri:
url: http://192.168.132.12

- name: use uri test node3
uri:
url: http://192.168.132.13

ovo

1
2
ansible-playbook -C lamp.yaml #测试运行
ansible-playbook lamp.yaml -v #实际执行

有 PHP 啦,我这里 node3 不能用是因为是因为这个系统不是 centos。

换一个 RHEL7 来看下正常界面

debian 图一乐,整个 RHEL7

1
2
ansible-playbook -C lamp.yaml #测试运行
ansible-playbook lamp.yaml -v #实际执行

网页也可以打开:

周四

第一节

1
2
3
4
5
使用user模块,使用loop参数,利用循环结构创建多个用户
如tom jerry david caobo

第一种方式,通过多个play或者task挨个创建
(以下是通过多个tasks创建)

多个 TASK

1
2
3
4
su dayi
cd ~/ansible
nano useradd_muilt_tasks.yml
ansible-playbook useradd_muilt_tasks.yml

like:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
---
- name: create a user
hosts: all
tasks:
- name: create tom
user:
name: tom
state: present
- name: create jerry
user:
name: jerry
state: present
- name: create david
user:
name: david
state: present
- name: create caobo
user:
name: caobo
state: present

loop 创建

1
2
3
4
su dayi
cd ~/ansible
nano useradd_muilt_tasks_loop.yml
ansible-playbook useradd_muilt_tasks_loop.yml

yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
---
- name: create users with loop
hosts: all
tasks:
- name: create tom jerry david caobo
user:
#使用item变量调用loop循环
name: "{{item}}"
state: present


loop:
- tom
- jerry
- david
- caobo

loop 删除

1
2
3
4
su dayi
cd ~/ansible
nano userdel_muilt_tasks_loop.yml
ansible-playbook userdel_muilt_tasks_loop.yml

yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
---
- name: create users with loop
hosts: all
tasks:
- name: create tom jerry david caobo
user:
#使用item变量调用loop循环
name: "{{item}}"
state: absent
remove: yes

loop:
- tom
- jerry
- david
- caobo

handler.yml

1
2
3
4
5
6
su dayi
cd ~/ansible
nano handler.yml

sudo yum install httpd
ansible-playbook handler.yml -vv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
---
- name: hanmler examples
hosts: prod
tasks:
- name: copy config file to node
copy:
src: /etc/httpd/conf/httpd.conf
dest: /etc/httpd/conf/httpd.conf

notify: restart apache service


handlers:
- name: restart apache service
service:
name: httpd
state: restarted

没装 httpd 的话会没配置文件:

周四下午

多个 notify 和多个 handlers 如何运行?

1
2
3
4
su dayi
cd ~/ansible
vim exampleshandler.yml
ansible-playbook exampleshandler.yml -vv

exampleshandler.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
---
- name: hanmler examples
hosts: prod
tasks:
- name: copy config file to node
shell: echo bbbb
notify: restart apache service1


- name: use shell
shell: echo aaaaa
notify: restart apache service2


handlers:
- name: restart apache service1
service:
name: httpd
state: restarted

- name: restart apache service2
service:
name: httpd
state: restarted

#执行顺序还是按照你的 playbook 的顺序去执行,从上往下 #如果其中某一个 task 出现错误。我们使用 ignore_errors 去忽略该错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
vim exampleshandler2.yml 
ansible-playbook exampleshandler2.yml -v

---
- name: hanmler examples
hosts: prod
tasks:
- name: copy config file to node
shell: /bin/dkkddkdd(这个地方是错误的)
notify: restart apache service1
ignore_errors: true

- name: use shell
shell: echo aaaaa
notify: restart apache service2


handlers:
- name: restart apache service1
service:
name: httpd
state: restarted

- name: restart apache service2
service:
name: httpd
state: restarted

导入 EPEL-GPG key

1
2
cd /etc/pki/rpm-gpg
wget https://archive.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7

周五实训报告

实训要求

1、搭建 ansible 的实验环境;搭建四台 centos7.5 版本的虚拟机,其中一台的 hostname 为 controller,另外三台分别为 node1-node3;
2、完善 ansible 的环境。使用普通用户(你名字的全称,如 zhangsan),做以下操作:针对普通用户(如 zhangsan)做 sudo 的提权免密;针对普通用户做 ssh 的免密登录;完成 ansible 的 controller 的 yum 仓库的配置(yum -y install epel)
3、配置 ansible.cfg 文件以及主机清单文件 hosts,其中,node1 和 node2 为 test 组中主机,node3 为 prod 组中主机。通过 ansible 的临时命令去查看主机连通性,是否可以实现基本的联通;
4、配置 node1-node3 的本地 yum 仓库(利用光盘当中的仓库内容)
4、使用 ansible 的临时命令命令在 node1-node3 上 复制/etc/hosts 文件到用户家目录下;
5、使用 ansible 的临时命令命令在 node1-node3 上创建用户 zhangsan;
6、编写一个 playbook,hosts 为 node1 和 node2,复制/etc/passwd 文件,属主为 upwen,属组为 upwen,权限为 0600;并验证结果(ansible-playbook all -a ‘ ls -l /home/upwen/passwd )
7、编写一个 playbook,在 node1-node3 上执行 play1,创建用户 lisi,并指定其 uid 为 1999;在 node3 上执行 play2,删除用户 lisi;(playbook 执行后的结果输出,以及通过临时命令查看/etc/passwd 文件当中的用户信息)
8、编写一个 playbook,利用 loop 循环结构,在 node1-node3 上分别创建三个用户,tom,jerry,cat;(执行完成之后查看并验证结果)
9、利用 handlers 通知信息,完成一下内容;该 task1 的内容为将/etc/hosts 文件复制到所有 node 节点的/home/upwen(你的普通用户的家目录)下,通知信息为 restart service1,task2 的内容为输出“Welcome to this Ansible training session”,通知信息为 restart service2,两个通知信息要做的事情都是从其 httpd 服务,完成该内容。

其实上文已经做啦,说实在,我不是很想重新做一遍)

我拿新机子重新来一遍。有一些细节可能就不截图了,因为上文已经有啦。

1、搭建 ansible 的实验环境;搭建四台 centos7.5 版本的虚拟机,其中一台的 hostname 为 controller,另外三台分别为 node1-node3

具体的安装可以看周一的章节的内容,这里细节就不再弄一次了。

注意磁盘大小:150GB!

改 IP 地址可以看第一天的末尾(应该是【修改 IP 地址】)

安装 4 个虚拟机

都是用 Centos 7.5 的那个镜像。

  • 用英文(不建议用中文语言系统)
  • 虚拟网络编辑器的 NAT 记得修改!不修改虚拟机没法联网。(这个在哪?开始里直接搜)

  • IP 可以直接在安装的时候就修改。记得打开自动连接。(General 里有个 Auto 连接)

  • 安装选 SERVER WITH GUI,方便你后面改 IP

  • 用户名用自己的姓名全拼,这里我用super_dayi,为了区分前后文内容。

克隆机子或者干脆直接再装 3 个

安装好之后分配 IP 地址

具体怎么改可以参考前文的【修改 IP 地址】https://cmd.dayi.ink/sUPF6_zfR-imTz3D2O7PeQ#%E4%BF%AE%E6%94%B9IP%E5%9C%B0%E5%9D%80

1
2
3
4
5
IP地址分配:
controller 192.168.132.10
node1 192.168.132.11
node2 192.168.132.12
node3 192.168.132.13

改完把那个开关开一下再关一下。

试试能不能 ping 通:

xshell 之类的工具连接到 ssh 上。

在 192.168.132.10 上 ping 其他几个机子

1
2
3
ping 192.168.132.11
ping 192.168.132.12
ping 192.168.132.13

我这里都通了

修改 hostname

这里你不同机子进终端自己修改一下就好。

1
2
3
4
5
6
su
sudo hostnamectl set-hostname controller #修改为controller
sudo hostnamectl set-hostname node1 #修改为node1
sudo hostnamectl set-hostname node2 #修改为node2

bash #查看生效

2、完善 ansible 的环境。使用普通用户(你名字的全称,如 zhangsan),做以下操作:针对普通用户(如 zhangsan)做 sudo 的提权免密;针对普通用户做 ssh 的免密登录;完成 ansible 的 controller 的 yum 仓库的配置(yum -y install epel)

在周一到周四的基础上进行新建用户

我知道你想要

这里dayi是之前的用户 rabbit是要改的用户,如果你已经有了,可以建一个rabbit_作为新的用户名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
ssh root@192.168.132.10 #root登录到主机上
useradd rabbit #创建新用户
cp -ra /home/dayi/ansible /home/rabbit/
ls /home/rabbit #查看是否复制成功

rm /home/dayi/.ssh/known_hosts #删除之前的连接信息(如果你换了虚拟机,需要这一步。删完记得手动ssh 都连一下,把yes打上)

[root@ansible-master rabbit]# ls /home/rabbit
ansible

passwd rabbit #修改新用户的密码

sudo su
sudo echo 'rabbit ALL=(ALL) NOPASSWD: ALL' >>/etc/sudoers

su dayi #老用户
cd ~/ansible
# 需要之前可以ping通,这几行跑不动的用下面的【123】 【456】
ansible node1,node2,node3 -m user -a "name=rabbit comment=ovo shell=/bin/bash" #【123】
ansible node1,node2,node3 -m shell -a "echo 'rabbit ALL=(ALL) NOPASSWD: ALL' >>/etc/sudoers" #【456】

#【123】相同的命令
# 从节点每个都做
sudo adduser rabbit

# 【456】相同的命令
# 从节点每个都做
sudo su #必须
sudo echo "rabbit ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers


#从节点每个都做
sudo passwd rabbit #改密码
su rabbit#顺便测试一下是否可以免密提权
sudo su #顺便测试一下是否可以免密提权


# 切换到新用户
#主节点
su rabbit
cd ~/ansible

#生成秘钥
ssh-keygen -t rsa #一路回车
ssh-copy-id rabbit@192.168.132.11
ssh-copy-id rabbit@192.168.132.12
ssh-copy-id rabbit@192.168.132.13

sudo chown -R rabbit /home/rabbit/ansible
sudo chmod +w ansible.cfg
#然后ansible.cfg里有一行需要改: remote_user = rabbit


ansible all -m ping


这样就可以啦:

重新做:设置免密登录

四个机子都要做

设置提权可以看周一的。

1
2
3
4
5
su
#这一行尽量复制注意空格,(记得用户名改成你自己的)
echo "super_dayi ALL=(ALL) NOPASSWD: ALL">>/etc/sudoers
su super_dayi #切换到你的用户
sudo su #试试有没有权限

这样不提示需要输入密码就可以啦。

几个节点都试一下:

针对普通用户做 ssh 的免密登录

在 controller 上发送 rsa 公钥

1
2
3
4
5
su super_dayi
ssh-keygen -t rsa #一路回车
ssh-copy-id super_dayi@192.168.132.11
ssh-copy-id super_dayi@192.168.132.12
ssh-copy-id super_dayi@192.168.132.13

你看这个,咱忘了一个 PVP,确实得测试一下啦。

测试一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[super_dayi@controller ~]$ ssh super_dayi@192.168.132.11
Last login: Thu Apr 25 22:18:17 2024 from 192.168.132.10
[super_dayi@node1 ~]$ sudo su
[root@node1 super_dayi]# exit
exit
[super_dayi@node1 ~]$ exit
logout
Connection to 192.168.132.11 closed.

[super_dayi@controller ~]$ ssh super_dayi@192.168.132.12
Last login: Thu Apr 25 22:18:21 2024 from 192.168.132.10
[super_dayi@node2 ~]$ sudo su
[root@node2 super_dayi]# exit
exit
[super_dayi@node2 ~]$ exit
logout
Connection to 192.168.132.12 closed.
[super_dayi@controller ~]$

[super_dayi@controller ~]$ ssh super_dayi@192.168.132.13
Last login: Thu Apr 25 22:18:24 2024 from 192.168.132.10
[super_dayi@node3 ~]$ sudo su
[sudo] password for super_dayi:
^C[super_dayi@node3 ~]$ su
Password:
[root@node3 super_dayi]# echo "super_dayi ALL=(ALL) NOPASSWD: ALL">>/etc/sudoers
[root@node3 super_dayi]# exit
exit
[super_dayi@node3 ~]$ su
Password:
[super_dayi@node3 ~]$ sudo su
[root@node3 super_dayi]# exit
exit
[super_dayi@node3 ~]$ exit
logout
Connection to 192.168.132.13 closed.
[super_dayi@controller ~]$

完成 ansible 的 controller 的 yum 仓库的配置(yum -y install epel)

在 controller 上

1
2
3
ping 223.5.5.5 #测试网络
sudo yum install epel-release -y #安装EPEL源
sudo yum install ansible -y #安装ansible

3、配置 ansible.cfg 文件以及主机清单文件 hosts,其中,node1 和 node2 为 test 组中主机,node3 为 prod 组中主机。通过 ansible 的临时命令去查看主机连通性,是否可以实现基本的联通

只需要

这里的清单文件用hosts文件名

1
2
3
4
mkdir -pv ~/ansible
cd ~/ansible
cp -a /etc/ansible/ansible.cfg ~/ansible
vim ~/ansible/ansible.cfg

修改:

位置 1:

位置 2:(但这里是可选)

位置 3:

继续:

1
vim ~/ansible/hosts 

内容:

1
2
3
4
5
6
7
8
9
10
node1 ansible_host=192.168.132.11
node2 ansible_host=192.168.132.12
node3 ansible_host=192.168.132.13

[test]
node1
node2

[prod]
node3

ansible 的临时命令去查看主机连通性

1
2
ansible all -m ping
ansible all -m shell -a "whoami" #这里都是ROOT就可以啦,提权成功!

4、配置 node1-node3 的本地 yum 仓库(利用光盘当中的仓库内容)

该过程很慢

CentOS-7.5-x86_64-DVD-1804.iso 放到你的用户文件夹目录,然后再进行如下操作:

注意!这里推荐用 xshell 之类的工具,防止复制不完:避免出现这种 ISO 就 7M 的情况

这个方法请多次检查镜像是否正确:

挂载镜像、复制仓库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

sudo su
chmod +777 /opt

sudo super_dayi
cd ~
mv CentOS-7.5-x86_64-DVD-1804.iso /opt #复制iso到/opt,这一步不应该秒复制完。

sudo su
cd /opt
mkdir -p /mnt/cdrom/
chmod +777 /opt
rm -rf /opt/yumrepo
mkdir -pv /opt/yumrepo
sudo mount -t iso9660 /opt/CentOS-7.5-x86_64-DVD-1804.iso /mnt/cdrom/


sudo cp -a /mnt/cdrom/Packages /opt/yumrepo/ #这行跟后面重复了,注意。同时这个执行不应该直接执行完毕。

如果遇到这种 IO 错误是镜像文件没复制好,重新来一遍就行。

继续:

1
2
3
4
5
6
7
8
9

sudo cp -a /mnt/cdrom/Packages /opt/yumrepo/ #这行跟上面重复了,注意。
sudo cp -a /mnt/cdrom/repodata /opt/yumrepo/
sudo chmod +644 /opt/yumrepo
sudo chmod +644 /opt/yumrepo/Packages
sudo chmod +644 /opt/yumrepo/repodata

su super_dayi
ls -alh /opt/yumrepo

分发文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 在普通用户下
cd ~/ansible
ansible node1,node2,node3 -m shell -a "rm -rf /opt/yumrepo"
ansible-playbook copy_yum.yaml -vv #超级慢,太慢可以看下面这个[label:ovo]
ansible all -m shell -a "ls -alh /opt/yumrepo"

# 加速文件分发 这几行相当于:[label:ovo]
sudo su
cd /opt
tar zcvf yumrepo.tar.gz yumrepo
chmod +644 /opt/yumrepo.tar.gz
su super_dayi
cd ~/ansible
ansible node1,node2,node3 -m copy -a "src=/opt/yumrepo.tar.gz dest=/opt/" -v
ansible node1,node2,node3 -m shell -a "cd /opt && tar -zxvf yumrepo.tar.gz"
rm -rf /opt/yumrepo.tar.gz
ansible node1,node2,node3 -m shell -a "rm -rf /opt/yumrepo.tar.gz"

ansible all -m shell -a "ls -alh /opt/yumrepo"

图,缓慢的三步:

这样就对啦:

附文件

这些是上面步骤可能用到的文件

copy_yum.yaml 文件内容

nano copy_yum.yaml

1
2
3
4
5
6
7
8
---
- name: copy a file
hosts: all
tasks:
- name: copy /opt/yumrepo/ to /opt/yumrepo/
copy:
src: /opt/yumrepo/
dest: /opt/yumrepo/
快速分发的代码的 playbook:(相当于加速文件分发那几行 )
1
2
3
4
5
6
sudo su
cd /opt
tar zcvf yumrepo.tar.gz yumrepo
chmod +644 /opt/yumrepo.tar.gz
su dayi
cd ~/ansible

然后跑这个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
---
- name: Deploy yumrepo to nodes
hosts: node1,node2,node3
become: true
tasks:
- name: Copy tar.gz to target nodes
copy:
src: /opt/yumrepo.tar.gz
dest: /opt/yumrepo.tar.gz

- name: Extract tar.gz on target nodes
shell: tar -zxvf /opt/yumrepo.tar.gz -C /opt
args:
chdir: /opt

- name: Remove tar.gz from target nodes
file:
path: /opt/yumrepo.tar.gz
state: absent

- name: Clean up local tar.gz
file:
path: /opt/yumrepo.tar.gz
state: absent
become_user: root

继续配置

对的,这就一半。

配置本地 YUM 仓库 playbook

1
2
3
su super_dayi
cd ~/ansible/
nano yum_packages.yml

内容

1
2
3
4
5
6
7
8
9
10
11
12
---
- name: create a repo
hosts: all
tasks:

- name: Add repository
yum_repository:
name: epel_local_opt #这里我有改过
description: EPEL YUM repo
baseurl: file:///opt/yumrepo/
enabled: yes
gpgcheck: no

继续执行:

1
2
3
4
5
6
ansible-playbook yum_packages.yml -v
ansible all -m shell -a " yum makecache " #比较慢
ansible all -m shell -a " ls /etc/yum.repos.d/ "
ansible all -m shell -a " cat /etc/yum.repos.d/epel_local_opt.repo "
ansible all -m shell -a " yum repolist all |grep epel_local_opt"
ansible all -m shell -a " yum info vsftpd --disablerepo=* --enablerepo=epel_local_opt" #禁用其他仓库,仅使用这个本地。

ansible-playbook yum_packages.yml -v

剩下的几步

这样就可以啦

4、使用 ansible 的临时命令命令在 node1-node3 上 复制/etc/hosts 文件到用户家目录下

只做符合题目要求的

1
2
ansible all -m copy -a "src=/etc/hosts dest=/home/super_dayi/hosts mode=644" 
ansible all -m shell -a "cat /home/super_dayi/hosts"

推荐做一下:同步 hosts

这里推荐一起执行了

1
2
sudo su
vim /etc/hosts

添加输入这个(i输入,:wq!保存)

1
2
3
4
192.168.132.10 controller
192.168.132.11 node1
192.168.132.12 node2
192.168.132.13 node3

然后复制文件

1
2
3
4
5
su super_dayi
cd ~/ansible/
ansible all -m copy -a "src=/etc/hosts dest=/etc/hosts mode=644"

ansible all -m shell -a "cat /etc/hosts"

示例:复制一个普通文件

1
2
3
4
5
su super_dayi
echo "ovo" >> ~/ovo.txt
ansible all -m copy -a "src=/home/super_dayi/ovo.txt dest=/home/super_dayi/ovo.txt owner=super_dayi mode=644"

ansible all -m shell -a "cat /home/super_dayi/ovo.txt"

从机上有了:

5、使用 ansible 的临时命令命令在 node1-node3 上创建用户 zhangsan

建用户

dayi_nologin 是另外的用户,不要跟现有的重复了

1
ansible all -m user -a "name=dayi_nologin comment=ovo uid=1200 group=root shell=/sbin/nologin"

查看当前用户们

1
2
3
4
5

ansible all -m shell -a "cat /etc/passwd|grep dayi_nologin"
ansible all -m shell -a "compgen -u|grep dayi_nologin"

ansible all -m shell -a "lastlog|grep dayi_nologin"

6、编写一个 playbook,hosts 为 node1 和 node2,复制/etc/passwd 文件,属主为 upwen,属组为 upwen,权限为 0600;并验证结果(ansible-playbook all -a ‘ ls -l /home/upwen/passwd )

1
2
3
4
5
6
7
su super_dayi
cd ~/ansible
nano task6.yaml

ansible-playbook task6.yaml -v

ansible all -m shell -a "ls -alh /home/super_dayi |grep passwd"

task6.yaml

1
2
3
4
5
6
7
8
9
10
11
12
---
- name: Task6_copy_passwd_oppos
hosts: node1,node2
become: true
tasks:
- name: copy password to node1,node2
copy:
src: /etc/passwd
dest: /home/super_dayi/passwd
group: super_dayi
owner: super_dayi
mode: "0600"

这样就可以啦

7、编写一个 playbook,在 node1-node3 上执行 play1,创建用户 lisi,并指定其 uid 为 1999;在 node3 上执行 play2,删除用户 lisi;(playbook 执行后的结果输出,以及通过临时命令查看/etc/passwd 文件当中的用户信息)

我这里用的 rabbit 用户

1
2
3
su super_dayi
cd ~/ansible
nano task7.yaml

task7.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
---
- name: Task7_create_user_rabbit
hosts: node1,node2,node3
become: true
tasks:
- name: Task__create_user_rabbit
user:
name: rabbit
uid: 1999
state: present

- name: Task7_Remove user rabbit on node3
hosts: node3
become: true
tasks:
- name: Remove user rabbit
user:
name: rabbit
state: absent

执行:

1
2
3
ansible-playbook task7.yaml -vv
ansible all -m shell -a "cat /etc/passwd |grep rabbit"

8、编写一个 playbook,利用 loop 循环结构,在 node1-node3 上分别创建三个用户,tom,jerry,cat;(执行完成之后查看并验证结果)

loop 创建

1
2
3
4
su super_dayi
cd ~/ansible
nano task8_useradd_muilt_tasks_loop.yml
ansible-playbook task8_useradd_muilt_tasks_loop.yml -v

yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
---
- name: task8_create users with loop
hosts: all
tasks:
- name: task8_create tom jerry david caobo
user:
name: "{{item}}"
state: present

loop:
- tom
- jerry
- cat

9、利用 handlers 通知信息,完成一下内容;该 task1 的内容为将/etc/hosts 文件复制到所有 node 节点的/home/upwen(你的普通用户的家目录)下,通知信息为 restart service1,task2 的内容为输出“Welcome to this Ansible training session”,通知信息为 restart service2,两个通知信息要做的事情都是从其 httpd 服务,完成该内容

安装 lamp 一起装了

1
2
3
4
5
su super_dayi
cd ~/ansible
echo "<h1>hiiii OVO</h1><?php phpinfo(); ?>" >> index.php
nano task9_1_install_httpd.yaml
ansible-playbook task9_1_install_httpd.yaml -v

task9_1_install_httpd.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
---
- name: install lamp
hosts: node1,node2,node3
tasks:
- name: install packages
yum:
name: "{{ packages}}"
vars:
packages:
- httpd
- php
- mariadb
- mariadb-server
state: latest

- name: start services
service:
name: httpd
enabled: yes
state: started

- name: copy index.php to node
copy:
src: ~/ansible/index.php
dest: /var/www/html/index.php
mode: '0644'

- name: start firewall
firewalld:
service: http
permanent: yes
state: enabled
immediate: yes

#test php page
- name: test php
hosts: node1
tasks:
- name: use uri to test node2 php page
uri:
url: http://192.168.132.12

- name: use uri test node3
uri:
url: http://192.168.132.13

hander 通知信息哦

1
2
3
4
su super_dayi
cd ~/ansible
nano task9_2_handler.yml
ansible-playbook task9_2_handler.yml -vv

task9_2_handler.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
---
- name: Copy files and print messages with handlers
hosts: all
become: true
tasks:
- name: Copy /etc/hosts to /home/
copy:
src: /etc/hosts
dest: /home/super_dayi/hosts
owner: super_dayi # 确保文件属于用户upwen
group: super_dayi # 和用户组upwen
notify: restart service1

- name: Output welcome message
debug:
msg: "Welcome to this Ansible training session ovo!"
notify: restart service2

handlers:
- name: restart service1
service:
name: httpd
state: restarted
enabled: yes

- name: restart service2
service:
name: httpd
state: restarted
enabled: yes

感谢陪伴

有什么问题说的及时跟咱说一下下 OVO

文件下载

1
2
3
链接:https://pan.baidu.com/s/18kMvAkprRthODsqcBL6MdQ?pwd=n18y 
提取码:n18y
--来自百度网盘超级会员V7的分享

下载 ansible 文件所注意的问题,输入

vim ~/ansible/ansible.cfg

把 dayi 改成自己的用户名

dayi 补的内容

因为内容比较重复,就写一点基本滴啦

前面的截图,以自己的姓名

开机,然后跑下面的这个命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
ssh root@192.168.132.10 #root登录到主机上
useradd lijunyi #创建新用户
cp -ra /home/super_dayi/ansible /home/lijunyi/
ls /home/lijunyi #查看是否复制成功


[root@ansible-master lijunyi]# ls /home/lijunyi
ansible

passwd lijunyi #修改新用户的密码

sudo su
sudo echo 'lijunyi ALL=(ALL) NOPASSWD: ALL' >>/etc/sudoers

su super_dayi #老用户
cd ~/ansible
# 需要之前可以ping通,这几行跑不动的用下面的【123】 【456】
ansible node1,node2,node3 -m user -a "name=lijunyi comment=ovo shell=/bin/bash" #【123】
ansible node1,node2,node3 -m shell -a "echo 'lijunyi ALL=(ALL) NOPASSWD: ALL' >>/etc/sudoers" #【456】


#从节点每个都做
sudo passwd lijunyi #改密码
su lijunyi#顺便测试一下是否可以免密提权
sudo su #顺便测试一下是否可以免密提权


# 切换到新用户
#主节点
su lijunyi
cd ~/ansible

#生成秘钥
ssh-keygen -t rsa #一路回车
ssh-copy-id lijunyi@192.168.132.11
ssh-copy-id lijunyi@192.168.132.12
ssh-copy-id lijunyi@192.168.132.13

sudo chown -R lijunyi /home/lijunyi/ansible
sudo chmod +w ansible.cfg
#然后ansible.cfg里有一行需要改: remote_user = lijunyi


ansible all -m ping

截倆图:

前面的截图,以自己的姓名 2

1
ansible all -m shell -a " yum info vsftpd --disablerepo=* --enablerepo=epel_local_opt" #禁用其他仓库,仅使用这个本地。

1
2
3
4
5
[lijunyi@controller ansible]$ ansible all -m shell -a "cat /home/lijunyi/hosts"
[lijunyi@controller ansible]$ ansible all -m shell -a "cat /home/lijunyi/hosts"

[lijunyi@controller ansible]$ ansible all -m user -a "name=lijunyi__ovo_nologin comment=ovo uid=1802 group=roo
t shell=/sbin/nologin

前面的截图,以自己的姓名 3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[lijunyi@controller ansible]$ ansible all -m shell -a "lastlog|grep dayi_nologin"
node3 | CHANGED | rc=0 >>
dayi_nologin **Never logged in**
node2 | CHANGED | rc=0 >>
dayi_nologin **Never logged in**
node1 | CHANGED | rc=0 >>
dayi_nologin **Never logged in**
[lijunyi@controller ansible]$ ansible all -m shell -a "lastlog|grep lijunyi__ovo_nologin"
node3 | CHANGED | rc=0 >>
lijunyi__ovo_nologin **Never logged in**
node1 | CHANGED | rc=0 >>
lijunyi__ovo_nologin **Never logged in**
node2 | CHANGED | rc=0 >>
lijunyi__ovo_nologin **Never logged in**
[lijunyi@controller ansible]$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[lijunyi@controller ansible]$ ansible-playbook task6.yaml -v

Using /home/lijunyi/ansible/ansible.cfg as config file

PLAY [Task6_copy_passwd_oppos] *******************************************************************************

TASK [Gathering Facts] ***************************************************************************************
ok: [node1]
ok: [node2]

TASK [copy password to node1,node2] **************************************************************************
changed: [node2] => {"changed": true, "checksum": "022d51c9190a222324b8c7619c037fd4e27b009c", "dest": "/home/lijunyi/passwd", "gid": 2003, "group": "lijunyi", "md5sum": "85a671beac26bb86936cd1f29e0ad297", "mode": "0600", "owner": "lijunyi", "secontext": "unconfined_u:object_r:user_home_t:s0", "size": 2255, "src": "/home/lijunyi/.ansible/tmp/ansible-tmp-1714207917.99-109749-113954787151792/source", "state": "file", "uid": 2003}
changed: [node1] => {"changed": true, "checksum": "022d51c9190a222324b8c7619c037fd4e27b009c", "dest": "/home/lijunyi/passwd", "gid": 2003, "group": "lijunyi", "md5sum": "85a671beac26bb86936cd1f29e0ad297", "mode": "0600", "owner": "lijunyi", "secontext": "unconfined_u:object_r:user_home_t:s0", "size": 2255, "src": "/home/lijunyi/.ansible/tmp/ansible-tmp-1714207917.98-109747-174111327070366/source", "state": "file", "uid": 2003}

PLAY RECAP ***************************************************************************************************
node1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

[lijunyi@controller ansible]$
[lijunyi@controller ansible]$ ansible all -m shell -a "ls -alh /home/lijunyi |grep passwd"
node1 | CHANGED | rc=0 >>
-rw-------. 1 lijunyi lijunyi 2.3K Apr 27 04:51 passwd
node2 | CHANGED | rc=0 >>
-rw-------. 1 lijunyi lijunyi 2.3K Apr 27 04:51 passwd
node3 | FAILED | rc=1 >>
non-zero return code
[lijunyi@controller ansible]$

前面的截图,以自己的姓名 4

1
2
3
4
5
6
7
8
9
nano task7.yaml
````

![](https://cmd.dayi.ink/uploads/upload_18f18273ba11430031967c8e4c2465bb.png)

![](https://cmd.dayi.ink/uploads/upload_262107dd13865ecc8e0fe52901d69304.png)

```bash
ansible-playbook task8_useradd_muilt_tasks_loop.yml -v

1
2
ansible-playbook task9_1_install_httpd.yaml -v
ansible-playbook task9_2_handler.yml -vv

OVO

超级大的虚拟机

Ansible 图形化 Tower

安装

1
2
3
4
wget https://releases.ansible.com/ansible-tower/setup/ansible-tower-setup-latest.tar.gz --no-check-certificate
tar xvzf ansible-tower-setup-latest.tar.gz

yum upgrade

需要更新诶

更新一下下:

CTRL+C 了,本来想加点核心,然后 kernel panic 啦~

换个机子重新来 PVP:

更新:

1
2
3
[root@ansible-master dayi]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)
[root@ansible-master dayi]# clear

inventory 改个密码

开始安装

1
2
[root@ansible-master ansible-tower-setup-3.8.6-2]# ./setup.sh

好大的 playbook

oppos 需要订阅

测试版免费, 但他又不让我用测试版本

那就弄点小手段

参考 https://www.milkfish.site/2021/05/13/1038.loli

1
ansible-tower-service restart #重启

502

卸载重新装个 3.8.3 的

呜呜呜

https://www.annda.net/post/ansible-tower-3.8.x-install-and-crack

总算破完了

UI

端口转发出来 SSH

写一个 playbook

1
vim  /var/lib/awx/projects/get_time.yaml

公钥

可以执行脚本啦

实训总结

本次 Ansible 实训为期一周,通过理论学习和动手实践,我对 Ansible 自动化运维工具有了全面的认识和掌握。以下是我的收获总结:

一、实训内容

  1. 搭建 Ansible 实验环境,创建多台 CentOS 虚拟机,配置 hostname
  2. 完善 Ansible 环境,配置 sudo 免密、SSH 免密登录,安装配置 yum 仓库
  3. 编写 Ansible 配置文件 ansible.cfg 和主机清单 hosts,测试节点连通性
  4. 为多个节点配置本地 yum 仓库,实现从光盘安装软件包
  5. 使用 Ansible 临时命令在被控节点上复制文件、创建用户等
  6. 编写多个 Ansible Playbook 实现复杂任务编排和自动化
  7. 使用 vars 变量、loop 循环、handler 通知等高级 Playbook 特性
  8. 实践 Ansible Tower 图形化管理平台的安装、破解和基本使用

二、实训体会

通过本次 Ansible 实训,我深刻体会到自动化运维工具给系统管理带来的高效和便利。传统的人工登录到每台服务器逐个操作的方式,已经无法满足当前动辄上百台服务器规模的运维需求。而 Ansible 不需要编译,不需要启动服务,只需要在控制节点上写好 yml 剧本,就可以快速地在成百上千台机器上执行任务,大大提高了运维效率。

Ansible 的另一个优势是它提供了丰富的模块,涵盖了运维过程中绝大部分操作。比如 yum、service、copy、user 等模块,让系统配置变得非常简单。而 register、when、loop 等语句则让剧本的逻辑控制更加灵活多变。总之 Ansible 简单易学但功能强大,是自动化运维领域的首选利器。

三、不足和改进

本次实训时间较短,对 Ansible 的学习还不够全面深入。比如 role、template 等特性还没来得及实践,对 Ansible Tower 的使用也比较浅显。未来我还需要在实际工作中多多使用 Ansible,并研读官方文档,不断积累经验,把 Ansible 的高级特性学以致用,写出更加健壮高效的 Playbook。

对于破解 Ansible Tower 一事,作为一名学生出于学习目的尚可接受,但工作中还是应该使用正版软件,维护知识产权,这也是一名工程师应有的职业操守。

四、总结

Ansible 实训让我明白,在云计算时代,自动化运维的重要性愈发凸显。Ansible、Puppet 等自动化运维工具的掌握和应用能力,已成为运维工程师的核心竞争力之一。感谢学校开设了 Ansible 实训课程,让我能与时俱进,掌握这一抢手技能。我将以此为契机,在今后的学习和工作中,继续深耕自动化运维领域,早日成长为一名优秀的运维工程师。

在线链接:

1.dayi的小键盘 https://type.dayiyi.top/index.php/archives/328/

2.cmd.dayi https://cmd.dayi.ink/sUPF6_zfR-imTz3D2O7PeQ

3.dayi的大键盘 https://blog.dayi.ink/?p=175

4.本文(doc文件,含本文新内容)专链接:

https://ovo.dayi.ink/2024/04/27/%E7%BD%91%E7%BB%9C%E7%AE%A1%E7%90%86%E4%B8%8E%E7%BB%B4%E6%8A%A4%E7%BB%BC%E5%90%88%E5%AE%9E%E8%AE%AD/

5.本文因文件过大无法正常上传到校友邦,原始文件下载:

1.链接1(腾讯云HK):https://pic.icee.top/blog/pic_bed/sharex/_pn-2024-04-27-23-25-22_Crocodile_Farflung_Lined.rar

2.链接2(cloudflare):https://p.dabbit.net/blog/pic_bed/sharex/_pn-2024-04-27-23-25-22_Crocodile_Farflung_Lined.rar

3.蓝奏云(推荐):https://wwl.lanzoum.com/b00rmzgt1c 密码:6w9w