Ansible实验环境部署

Ansible是一个IT自动化部署工具,他能配置系统,部署软件,编排复杂的系统任务,如连续部署或零停机时间滚动更新
Ansible使用Python编写,尽管市面上已经有很多优秀的配置管理解决方案,如Salt,Puppet,Chef等,但是Ansible的优势在于他的简洁,他在主流配置工具中与众不同的一点便是,Ansible使用SSH进行连接管理,所以它不需要用户在想要管理的每一个节点上安装组件,只需要在管理端安装Ansible即可管理在远端的一组主机,而被管理端不需要安装任何软件

Ansibleの实验环境部署,以及简单操作KVM
接下来来配置Ansibe的实验虚拟机~
因为是群体配置部署工具,使用一个CentOS8宿主机作为Ansible-server,其中部署相同系统版本的虚拟机三台
那就得使用KVM的虚拟化了
宿主机使用VMware虚拟机,我可怜的电脑只有8G内存,所以即使要装三台虚拟机的宿主机也只能给6G内存,5555555555555
宿主机配置:

其中,因为要套娃虚拟机,使用KVM,请一定要在CPU选项中打开虚拟化引擎

VT-x和AMD-v对应两家x86CPU大头公司自家的的虚拟化技术,这里的打开就像是物理机在BIOS中打开虚拟化一个道理
先安装宿主机,宿主机使用CentOS8.2最小安装,请最好使用VMware15.5.6,因为稍微老一点的版本没有CentOS8的安装选项,当然使用RHEL8也是可以的
安装过后,如果想要方便点的使用KVM需要图形化界面,组安装在CentOS8中被重新规划,CentOS8完整光盘中有以下安装环境:

其中,KDE已经被RHEL8废除,GNOME在RHEL8中只有在“Server with GUI”和“Workstation“两个选项中存在,都会安装RHEL7中默认的(standard)和经典版(classic)GNOME桌面类型
这里使用最小安装,需要在安装完成后使用yum组安装,查看8版本yum组并安装

[root@ansible-server ~]# yum grouplist
Last metadata expiration check: 0:41:45 ago on Wed 16 Sep 2020 02:33:48 PM CST.
Available Environment Groups:
   Server
   Workstation
   Virtualization Host
   Custom Operating System
Installed Environment Groups:
   Server with GUI
   Minimal Install
Installed Groups:
   Container Management
   Headless Management
Available Groups:
   .NET Core Development
   RPM Development Tools
   Development Tools
   Graphical Administration Tools
   Legacy UNIX Compatibility
   Network Servers
   Scientific Support
   Security Tools
   Smart Card Support
   System Tools
[root@ansible-server ~]# yum groupinstall "Server with GUI”

对比7系统的yum组

Available Environment Groups:
   Minimal Install
   Compute Node
   Infrastructure Server
   File and Print Server
   Cinnamon Desktop
   MATE Desktop
   Basic Web Server
   Virtualization Host
   Server with GUI
   GNOME Desktop
   KDE Plasma Workspaces
   Development and Creative Workstation
Available Groups:
   Cinnamon
   Compatibility Libraries
   Console Internet Tools
   Development Tools
   Educational Software
   Electronic Lab
   Fedora Packager
   General Purpose Desktop
   Graphical Administration Tools
   Haskell
   LXQt Desktop
   Legacy UNIX Compatibility
   MATE
   Milkymist
   Scientific Support
   Security Tools
   Smart Card Support
   System Administration Tools
   System Management
   TurboGears application framework
   Xfce
Done

7中叫做“GNOME Desktop”简单直白

安装完后使用“startx”即可启动图形化终端,但是在那之前,可以把默认的启动终端设为图形化终端

[root@ansible-server ~]# systemctl set-default graphical.target 
Removed /etc/systemd/system/default.target.
Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/graphical.target.

如果想调回命令行终端,可以使用

[root@ansible-server ~]# systemctl set-default multi-user.target 
Removed /etc/systemd/system/default.target.
Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/multi-user.target.

启动图形化界面

[root@ansible-server ~]# startx

接下来先来安装KVM,首先检查必要的环境
检查CPU是否具有虚拟化功能

[root@ansible-server ~]# cat /proc/cpuinfo | grep -E "vmx|svm"
flags                : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xsaves arat md_clear flush_l1d arch_capabilities
flags                : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xsaves arat md_clear flush_l1d arch_capabilities
flags                : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xsaves arat md_clear flush_l1d arch_capabilities
flags                : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xsaves arat md_clear flush_l1d arch_capabilities

CPU具有Intel的vmx虚拟化

清理系统中原有的KVM程序

[root@ansible-server ~]# yum remove `rpm -qa | egrep 'qemu|virt|KVM'`
[root@ansible-server ~]# rm -rf /var/lib/libvirt/ /etc/libvirt/

安装KVM

CentOS7需要安装以下包:[root@ansible-server Desktop]# yum install *qemu* *virt* librdb1-devel
CentOS8中已经可以使用组安装了:[root@ansible-server Desktop]# yum groupinstall "Virtualization Host"
可直接部署完整的KVM

组安装成功后,需要安装KVM图形化管理界面“virt-manager”

[root@ansible-server Desktop]# yum install virt-manager

之后,启动libvirt服务

[root@ansible-server Desktop]# systemctl enable --now libvirtd

查看KVM模块是否已经加载

[root@ansible-server Desktop]# lsmod | grep kvm
kvm_intel             294912  0
kvm                   786432  1 kvm_intel
irqbypass              16384  1 kvm

这个时候,推荐,升级一下系统,然后重启

[root@ansible-server Desktop]# yum upgrade

到目前为止,KVM已经部署完成,现在需要安装GuestOS,也就是要来套娃虚拟机了
这里采用图形化界面工具安装模板GuestOS,再使用命令行进行克隆的方法
启动virt-manager可以去菜单中找,也可以直接在命令行中敲入

[root@ansible-server Desktop]# virt-manager


点击左上角的小电脑,或者在File->New Virtual Machine,可以创建新的虚拟机

选择使用本地介质(当然得先把镜像上传一下,这里使用了CentOS的迷你镜像)
选择文件地址,然后手动选择安装系统的类型为CentOS8(好像是没有识别出来,7的就可以自动识别),可能会提示模拟器对选定的镜像文件路径没有搜查权限,不用管
选择内存,cpu核心数,磁盘大小(这里会直接将存储空间分配,没有VMware那么友好,可以一点点占用空间),选择网络(默认为NAT),开始安装,这里使用CentOS8.2最小安装
(建议:我的8G内存已经在虚拟机套娃的损耗中爆炸了:占用99%,第一次见到windows能够真的占用达到99,请在这个时候尽量释放内存,否则安装过程会及其漫长)
(然而这好像不是电脑的问题,因为是嵌套的虚拟机,损耗已经大到无法形容,一个最小安装的CentOS用了一个半小时,我吐了)

虚拟机创建完成后,开始克隆它,这里先要找到KVM虚拟机的配置文件和磁盘文件

[root@ansible-server ~]# ll /etc/libvirt/qemu/ansible-node1.xml 
-rw-------. 1 root root 5934 Sep 16 18:39 /etc/libvirt/qemu/ansible-node1.xml
[root@ansible-server ~]# ll -h /var/lib/libvirt/images/ansible-node1.qcow2 
-rw-------. 1 qemu qemu 5.1G Sep 16 21:36 /var/lib/libvirt/images/ansible-node1.qcow2

KVM虚拟机需要这两个文件,所以去复制他们

[root@ansible-server ~]# rsync --progress /etc/libvirt/qemu/ansible-node1.xml /etc/libvirt/qemu/ansible-node2.xml 
ansible-node1.xml
          5,934 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=0/1)
[root@ansible-server ~]# rsync --progress /etc/libvirt/qemu/ansible-node1.xml /etc/libvirt/qemu/ansible-node3.xml 
ansible-node1.xml
          5,934 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=0/1)
[root@ansible-server ~]# ll /etc/libvirt/qemu/ansible-node*
-rw-------. 1 root root 5934 Sep 16 18:39 /etc/libvirt/qemu/ansible-node1.xml
-rw-------. 1 root root 5934 Sep 16 21:45 /etc/libvirt/qemu/ansible-node2.xml
-rw-------. 1 root root 5934 Sep 16 21:45 /etc/libvirt/qemu/ansible-node3.xml
[root@ansible-server ~]# rsync --progress /var/lib/libvirt/images/ansible-node1.qcow2 /var/lib/libvirt/images/ansible-node2.img 
ansible-node1.qcow2
  5,369,757,696 100%   43.01MB/s    0:01:59 (xfr#1, to-chk=0/1)
[root@ansible-server ~]# rsync --progress /var/lib/libvirt/images/ansible-node1.qcow2 /var/lib/libvirt/images/ansible-node3.img 
ansible-node1.qcow2
  5,369,757,696 100%   62.25MB/s    0:01:22 (xfr#1, to-chk=0/1)
[root@ansible-server ~]# ll -h /var/lib/libvirt/images/ansible-node*
-rw-------. 1 root root 5.1G Sep 16 21:38 /var/lib/libvirt/images/ansible-node1.qcow2
-rw-------. 1 root root 5.1G Sep 16 21:49 /var/lib/libvirt/images/ansible-node2.img
-rw-------. 1 root root 5.1G Sep 16 21:50 /var/lib/libvirt/images/ansible-node3.img

用rsync命令可以看到进程,不会干等着不知道他复制到那里了。磁盘文件其实那个后缀名无所谓的,所以用了一个img作为后缀名

接下来要去创建新的虚拟机,也就是告知virt-manager有两个新的虚拟机
要先对虚拟机配置文件进行修改,需要修改的有:虚拟机名称,uuid,磁盘文件地址,mac地址(mac地址只可修改后六位十六进制),否则你想嘛,两个虚拟机这些唯一参数是一样的,肯定会冲突的对吧

[root@ansible-server ~]# vim /etc/libvirt/qemu/ansible-node2.xml 
[root@ansible-server ~]# vim /etc/libvirt/qemu/ansible-node3.xml 

下来定义新的虚拟机

[root@ansible-server ~]# virsh define /etc/libvirt/qemu/ansible-node2.xml 
Domain ansible-node2 defined from /etc/libvirt/qemu/ansible-node2.xml
[root@ansible-server ~]# virsh define /etc/libvirt/qemu/ansible-node3.xml 
Domain ansible-node3 defined from /etc/libvirt/qemu/ansible-node3.xml

之后,重启一下libvirt服务

[root@ansible-server ~]# systemctl restart libvirtd

最后,为KVM虚拟机开启路由转发,这样使用nat的KVM虚拟机就可以通过VMnet8访问外网了

[root@ansible-server ~]# vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1
[root@ansible-server ~]# sysctl -p
net.ipv4.ip_forward = 1

列出虚拟机列表

[root@ansible-server ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     ansible-node1                  shut off
 -     ansible-node2                  shut off
 -     ansible-node3                  shut off

查看虚拟机信息

[root@ansible-server ~]# virsh dominfo ansible-node1
Id:             -
Name:           ansible-node1
UUID:           ee84213f-e5ba-4ce1-96ce-ea48ee3f2d8d
OS Type:        hvm
State:          shut off
CPU(s):         1
Max memory:     1048576 KiB
Used memory:    1048576 KiB
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: selinux
Security DOI:   0

启动虚拟机

[root@ansible-server ~]# virsh start ansible-node1
Domain ansible-node1 started

停止虚拟机

[root@ansible-server ~]# virsh shutdown ansible-node1
Domain ansible-node1 is being shutdown

查看全部的虚拟机

[root@ansible-server Desktop]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 13    ansible-node1                  running
 14    ansible-node2                  running
 15    ansible-node3                  running
部署实验环境遇到的问题F&Q(恼火.jpg)
1.装有KVM的VMware宿主机,当要挂起物理机时,一定要先挂起宿主机,否则恢复时宿主机中的KVM虚拟机会被pause,而且无法resume。解决方法,创建虚拟机刚开机时候的快照,它pause了之后直接恢复快照~(不过东西也就没了,没关系,实验机嘛)
2.极其令人恼火的网络问题
a.KVM默认使用的网络是nat,也推荐使用这个,但是这样就不能和KVM的外网,也就是站在物理机这个角度,通信了,必须使用宿主机来和KVM虚拟机通信,这个都没啥。但是虚拟机这个网总是抽风,请最好使用nmcli工具自行手动配置ip地址和网关,以及DHCP的网段,配完估计是得重启一下……唉,开虚拟机10分钟……
b.最恼火的……nat模式下,只要xshell连上宿主机,宿主机就无法与外网同通信,ping不通VMnet8,但是和KVM虚拟机是可以通信的,原因不明,但是有解决办法。将Windows的网络共享打开,共享设备选择VMnet8,但是这时VMnet8的网关地址会被Windows强行修改,修改就修改,再回到VMnet8去把被更改的ip地址改回来就行了。然后就会发现,网好了,又能愉快的使用xshell了
(每次开物理机或者休眠,都得重复这个步骤)

3.关于传输文件到KVM虚拟机,可以使用lrzsz,在xshell上传输文件,但是嵌套的虚拟机好像会出问题,传输过程中会乱码导致传输失败,需要加上参数-be
-b, –binary 用binary的方式上传下载
-e, –escape 强制escape 所有控制字符

[root@ansible-node3 ~]# rz -be
Ansibleの安装
接下来安装Ansible
因为是使用Python编写的,所以需要Python解释器才能正常运行Ansible
目前,只要有2.6或2.7的Python解释器,就可以在管理节点运行Ansible(Windows不可以作为管理机器)
被管理节点需要安装有Python2.5及以上,2.4也可以,但是需要额外的模块:python-simplejson
红帽类的Linux需要从EPEL源中才能yum安装Ansible(当然,毕竟Python,使用pip或者pip3也可以安装Ansible),EPEL最新的Ansible已经更新到了2.9.13,这里就不下载EPEL源的Ansible了,使用本地的Ansible2.8rpm包,配合RHCE8考试

安装本地的Ansible2.8,他有一个依赖:sshpass
(http://shinyanocloud.cn/wp-content/uploads/2020/12/ansible-2.8.0-1.el8ae.noarch.rpm)
(http://shinyanocloud.cn/wp-content/uploads/2020/12/sshpass-1.06-3.el8ae.x86_64.rpm)

[root@ansible-server ~]# ll *.rpm
-rw-r--r--. 1 root root 15270472 Sep 17 20:19 ansible-2.8.0-1.el8ae.noarch.rpm
-rw-r--r--. 1 root root    26620 Sep 17 20:19 sshpass-1.06-3.el8ae.x86_64.rpm
[root@ansible-server ~]# yum install ansible-2.8.0-1.el8ae.noarch.rpm sshpass-1.06-3.el8ae.x86_64.rpm

查看安装好的ansible版本及配置信息

[root@ansible-server ~]# ansible --version
ansible 2.8.0                                        #Ansible版本
 config file = /etc/ansible/ansible.cfg              #Ansible配置文件位置
 configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']        #Ansible模块位置
 ansible python module location = /usr/lib/python3.6/site-packages/ansible                #Ansible使用的python解释器位置                                    
 executable location = /usr/bin/ansible
 python version = 3.6.8 (default, Apr 16 2020, 01:36:27) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]

当然,如果使用epel源安装的话

[root@ansible-server ~]# yum install epel-release

切换成阿里云EPEL镜像

[root@ansible-server ~]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
[root@ansible-server ~]# sed -i 's|^#baseurl=https://download.fedoraproject.org/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
[root@ansible-server ~]# yum install ansible

使用pip的话

[root@ansible-server ~]# yum install epel-release
[root@ansible-server ~]# yum install python2-pip
[root@ansible-server ~]# pip install ansible

如果有python3的话可以直接用pip3哦~

Ansibleの工作架构以及建立SSH密钥互信

这就是整个Ansible的工作架构。在Ansible的管理架构中,存在“管理节点“和“被管理节点”两种角色,被管理节点被称为资产。
管理节点会将Ad-Hoc或者PlayBook转化为Python脚本,然后通过SSH将Python脚本传递到被管理主机上,被管理主机执行这些脚本,并将执行结果依次传回管理节点
了解工作结构之后,其中很重要的就是管理节点和被管理节点的SSH连接。ssh都用过,连接的时候需要交互来输入验证密码,Ansible要实现自动化运维,就不能有这种密钥验证的交互步骤,那么部署完Ansible之后,首先要建立管理节点和被管理节点的密钥信任
先删除原有密钥文件

[root@ansible-server ~]# rm -rf .ssh/
[root@ansible-node1 ~]# rm -rf .ssh/
[root@ansible-node2 ~]# rm -rf .ssh/
[root@ansible-node3 ~]# rm -rf .ssh/

现在在管理节点上生成新的密钥文件
-t,指定密钥类型

[root@ansible-server ~]# ssh-keygen -t rsa
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:gf7ytKYmCoRVK7jff8yz3HpYHwSBf39QzsOKeAzo4bo root@ansible-server.shinya
The key's randomart image is:
+---[RSA 3072]----+
|    .    ...     |
| . . . .. .     .|
|. o . . o. .  .+ |
|.o . . o o. o .oo|
|o.    + S +o.....|
|.. .   + ..+... .|
|. . . oooo.. . . |
| .  .o.=Bo. .    |
|  .. E++*=.      |
+----[SHA256]-----+

查看密钥文件
[root@ansible-server ~]# ll .ssh/
total 8
-rw-------. 1 root root 2610 Sep 21 14:29 id_rsa
-rw-r--r--. 1 root root 580 Sep 21 14:29 id_rsa.pub
建立密钥信任就是互相将公钥拷贝给信任主机,也就是.pub的文件

最后将密钥拷贝到被管理节点

[root@ansible-server ~]# ssh-copy-id root@192.168.20.54
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/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.20.54's password: 

Number of key(s) added: 1

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

这个时候ssh登录就不需要密码了

[root@ansible-server ~]# ssh 192.168.20.54
Last login: Thu Sep 17 20:06:02 2020 from 192.168.20.1

同样,拷贝到另外的节点

[root@ansible-server ~]# ssh-copy-id root@192.168.20.55
[root@ansible-server ~]# ssh-copy-id root@192.168.20.56

ssh信任已建立,可以在密钥文件夹中查看已信任的主机及其指纹密钥

[root@ansible-server ~]# cat .ssh/known_hosts 
192.168.20.54 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGZbYld/EFFYc0cc+WN2ipT1GdnbhPFyLgT6f6SeD6PhRuBUVof2kZCchamZbyDL3FZWy+05WTjj75KAdDeCXMI=
192.168.20.55 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGZbYld/EFFYc0cc+WN2ipT1GdnbhPFyLgT6f6SeD6PhRuBUVof2kZCchamZbyDL3FZWy+05WTjj75KAdDeCXMI=
192.168.20.56 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGZbYld/EFFYc0cc+WN2ipT1GdnbhPFyLgT6f6SeD6PhRuBUVof2kZCchamZbyDL3FZWy+05WTjj75KAdDeCXMI=
Ansibleの入门操作一下~
Ansible直接在命令行使用的话就是前面提到的“Ad-Hoc”,指的是“单行的,临时,快捷命令操作”,具体使用格式可以使用--help查看
[root@ansible-server ~]# ansible --help
Usage: ansible [options]
也就是,ansible [要匹配的被管理主机] [要用什么工具做什么事情]
比如说,使用ping来检查主机联通性

[root@ansible-server ~]# ansible all -i 192.168.20.54,192.168.20.55,192.168.20.56 -m ping
192.168.20.56 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
192.168.20.55 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
192.168.20.54 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}

解释参数选项

-i:inventory,指定资产列表,可以是一个文件,亦可以是一组主机名或ip地址,每个资产使用逗号隔开
all:在Ansible中叫做pattern,即“匹配”,用来匹配资产列表中的一部分,all指的就是匹配全部
-m:module,指定使用的模块,这里指定使用了ping模块
-a:parameter,指定模块要使用的参数
-o:将每一个被管理节点返回的信息用一行来显示

刚才使用了ping模块测试了连通性,可以看到返回的信息有很多,也很好解释。执行返回状态是“SUCCESS”成功,使用的python解释器的位置在哪里,“changed”指的是有没有改变被被管理节点的文件,当然ping是不会改变什么的,所以是false,“ping”的结果是“pong”,“碰~”表示连通成功了
还有一个有趣的参数

-v:显示ansible的执行过程,v越多显示的越详细,最多可以使用-vvv,-vvvv可以启动debug

试一下,因为显示的东西太多,就只ping一个主机,这里注意,如果只有一个资产,列表最后必须有逗号

[root@ansible-server ~]# ansible all -i 192.168.20.54, -m ping -v
Using /etc/ansible/ansible.cfg as config file
192.168.20.54 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
[root@ansible-server ~]# ansible all -i 192.168.20.54, -m ping -vv
ansible 2.8.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.6.8 (default, Apr 16 2020, 01:36:27) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]
Using /etc/ansible/ansible.cfg as config file
META: ran handlers
192.168.20.54 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
META: ran handlers
META: ran handlers

-vvv已经就太多了,显示的信息都是大都是Ansible工作时的信息,一堆又一堆,用于排错

再比如说,将一个配置文件发布到所有的被管理节点

[root@ansible-server ~]# vim zzy.conf
[root@ansible-server ~]# cat zzy.conf 
Aki
[root@ansible-server ~]# ansible all -i 192.168.20.54, -m copy -a "src=/root/zzy.conf dest=/root/zzy.conf"
192.168.20.54 | CHANGED => {              #返回状态CHANGED,改变了目标主机的文件
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": true,
    "checksum": "8e9ed86d39fcae04567078737f46e208e93959e2",                     #checksum,sha1校验值
    "dest": "/root/zzy.conf",                                                   #文件目标位置
    "gid": 0,                                                                   #组id
    "group": "root",                                                            #文件将要属于哪个组
    "md5sum": "f4535bb48ab77a8ab786a4afda648490",                               #MD5校验值
    "mode": "0644",                                                             #文件权限
    "owner": "root",                                                            #文件属主
    "secontext": "system_u:object_r:admin_home_t:s0",           
    "size": 4,                                                                  #文件大小
    "src": "/root/.ansible/tmp/ansible-tmp-1600759534.9525692-79019231693011/source",             #文件来源
    "state": "file",                                                                              #copy的类型
    "uid": 0                                                                                      #文件将属于的属主id
}

返回信息都是目标主机返回的,checksuum等一些都是目标主机在本地计算后返回来的

Ansibleの资产
前面简单操作中,使用了-i来指定资产,但是实际情况中的资产可能有好几十甚至几百台,不可能一个一个敲上去,太麻烦了
Ansible的资产分为静态资产和动态资产,静态资产就是为了解决上述问题,提前写好一个资产列表文件就好。动态资产是一个写好的脚本,用它去获取资产列表,这个就很厉害,比如从数据库中获取资产列表
资产列表的文件是哪个是在Ansible的配置文件中定义的,Ansible的配置文件可以有多个,但是有优先级之分

	1.ANSIBLE_CONFIG,这是一个环境变量,Ansible会先检查这个环境变量是否指向配置文件
	2../ansible.cfg,其次,检查当前目录下是否有这个配置文件
	3.~/ansible.cfg,然后检测家目录下是否有配置文件
	4./etc/ansible/ansible.cfg,这是安装时Ansible自动生成的配置文件,全局生效

查看Ansible的配置文件

[root@ansible-server ~]# vim /etc/ansible/ansible.cfg 
# some basic default values...

#inventory      = /etc/ansible/hosts
#library        = /usr/share/my_modules/
#module_utils   = /usr/share/my_module_utils/
#remote_tmp     = ~/.ansible/tmp
#local_tmp      = ~/.ansible/tmp
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
#forks          = 5
#poll_interval  = 15
#sudo_user      = root
#ask_sudo_pass = True
#ask_pass      = True
#transport      = smart
#remote_port    = 22
#module_lang    = C
#module_set_locale = False

里面定义了好多Ansible的默认属性值,后面再细说,其中就有Ansible的资产列表文件位置“inventory = /etc/ansible/hosts”

# uncomment this to disable SSH key host checking
# host_key_checking = False

这里面有一个需要设置的“host_key_checking = False”,这条被注释掉了,把前面的井号去掉。他有一个比较重要的作用,在第一次ssh连接主机时一般会有这样的提示

The authenticity of host '*****************' can't be established.
ECDSA key fingerprint is SHA256:*******************************************
Are you sure you want to continue connecting (yes/no/[fingerprint])?

这是在防止中间人攻击,展示的一串密钥是“fingerprint key”,当~/.ssh/know_hosts 中没有存储对方的fingerprint key或者对方的公钥有变化,fingerprint key对不上的时候,就会提示是否要存储这指纹密钥,然后继续连接操作。
其实大多数人在这里都会直接无脑yes,但是这有可能引起中间人攻击,应该比对提供的指纹密钥和ssh服务器的指纹密钥。防止连上的是攻击者的服务器,然后被盗取密码,可以参考以下英文文档的描述。
但是对于Ansible的自动化运维来说,需要取消掉这步验证。因为出现的交互界面会打断执行的运维命令

When you make a SSH session, two different key pairs (with a fingerprint for each pair) are involved. One is the user's key which is stored in ~/.ssh. The user's SSH key identity is sometimes used as credentials to login to another computer (if you have set up key based login).
		
The other is the SSH server's key. This is the key you see the fingerprint for when you connect to a different server for the first time. This key's identity is used to make sure you are logging in to the SSH server you intend to. This is important if you are using passwords because you wouldn't want to accidentally try to login to an attackers machine: the attacker would get your password when you typed it in. Then the attacker could login to the machine you thought you were logging in to! (this is known as a "man in the middle attack") The keys a SSH server uses to identify itself when you login to it are located in /etc/ssh/ and usually named something like ssh_host_rsa_key.
		
You can actually change where the SSH server looks for the key in the /etc/ssh/sshd_config file with the HostKey /path/to/host/key setting.
		
By default, ssh-keygen will create a key for the current user, which, by default, will be stored in ~/.ssh. The format of a user key and a server key is the same; the difference is where they are placed and whether /etc/ssh/sshd_config has a HostKey directive pointing to them. When you install the openssh-server package, it automatically generates keys for the server to use. That is where the keys with the unknown fingerprint came from. If you want to see the fingerprint of the SSH server's (RSA*) key, you could run ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub.
		
There are different encryption algorithms. Each one uses a different key. Common ones are DSA (weak), RSA (old default), and ECDSA (new default).

查看资产列表文件

# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
#   - Comments begin with the '#' character                               #注释使用#开头
#   - Blank lines are ignored                                             #空行会被忽略
#   - Groups of hosts are delimited by [header] elements                  #一组主机需要用[组名]这样的元素来定义
#   - You can enter hostnames or ip addresses                             #可以使用主机名或者ip地址来指明主机
#   - A hostname/ip can be a member of multiple groups                    #主机名和ip地址可以是多个组的成员

# Ex 1: Ungrouped hosts, specify before any group headers.

## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10

# Ex 2: A collection of hosts belonging to the 'webservers' group

## [webservers]
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110

# If you have multiple hosts following a pattern you can specify
# them like this:

## www[001:006].example.com

# Ex 3: A collection of database servers in the 'dbservers' group

## [dbservers]
## 
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57

# Here's another example of host ranges, this time there are no
# leading 0s:

## db-[99:101]-node.example.com

其中是在解释书写列表文件的格式,像是这种有各种域,也就是用“[]”来定义一个部分的这样,被称为ini文件。现在自己写一个,但是之前,先在主机host文件中解析一下所有的主机域名

[root@ansible-server ~]# vim /etc/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.20.54 ansible-node1.shinya node1
192.168.20.55 ansible-node2.shinya node2
192.168.20.56 ansible-node3.shinya node3

然后写一下列表文件

[root@ansible-server ~]# vim /etc/ansible/hosts 
ansible-node1.shinya
ansible-node2.shinya
ansible-node3.shinya
node[1:3]

[web_server]
ansible-node[1:2].shinya
node[a:d]

[db_server]
ansible-node[2:3].shinya
node[e:h]

[all_server:children]
web_server
db_server

列表中允许使用“:”来指定连续的名称,不仅可以指定数字,连字母也可以的
其中,我假装按照业务场景定义了组,还用了继承关系,“[group_name:children]”指的是该组是以下组的父组,包含关系
这里要注意的是,这个资产列表被选中是因为这是Ansible的默认属性值,如果在别处写了一个资产列表,需要用-i来指定这个文件的位置

Ansibleの资产选择器(pattern)
为了只是针对某些组或一部分节点进行操作,就需要用到资产选择器
在前面用过,但是指定的是all,也就是选择了所有,资产选择器还有更多的用法
Ad-Hoc基本语法格式:ansible PATTERN -I [inventory] -m [module] -a [argument]
这里要提前注意的是,在资产列表中,如果写了ip地址,没有写其已解析的主机名,在使用资产选择器的时候,必须使用ip地址,而不能使用主机名。也就是只能用写在资产列表中的资产
选择全部的资产

[root@ansible-server ~]# ansible all --list-hosts
  hosts (14):
    node1
    node2
    node3
    ansible-node1.shinya
    ansible-node2.shinya
    nodea
    nodeb
    nodec
    noded
    ansible-node3.shinya
    nodee
    nodef
    nodeg
    nodeh

选择一台节点
[root@ansible-server ~]# ansible ansible-node1.shinya --list-hosts
hosts (1):
ansible-node1.shinya
选择两台

[root@ansible-server ~]# ansible nodea,nodeb --list-hosts
  hosts (2):
    nodea
    nodeb
[root@ansible-server ~]# ansible nodea:nodeb --list-hosts
  hosts (2):
    nodea
    nodeb
[root@ansible-server ~]# ansible node[a,b] --list-hosts
 [WARNING]: Could not match supplied host pattern, ignoring: node[a

 [WARNING]: Could not match supplied host pattern, ignoring: b]

 [WARNING]: No hosts matched, nothing to do

  hosts (0):
[root@ansible-server ~]# ansible node[a:b] --list-hosts
  hosts (2):
    nodea
    nodeb
[root@ansible-server ~]# ansible node[a:c] --list-hosts
  hosts (2):
    nodea
    nodec

这里是在选择一个列表,分隔符使用“,”或者“:”。使用 [ ] 也可以指定列表,但是只能用“:”进行分隔,而且不能指定连续的资产名称

选择一组

[root@ansible-server ~]# ansible db_server --list-hosts
  hosts (6):
    ansible-node2.shinya
    ansible-node3.shinya
    nodee
    nodef
    nodeg
    nodeh
[root@ansible-server ~]# ansible all_server --list-hosts
  hosts (11):
    ansible-node1.shinya
    ansible-node2.shinya
    nodea
    nodeb
    nodec
    noded
    ansible-node3.shinya
    nodee
    nodef
    nodeg
    nodeh

其中,选择了嵌套组的话,会自动过滤其中重复的节点

使用通配符*匹配

[root@ansible-server ~]# ansible ansible-node*.shinya --list-hosts
  hosts (3):
    ansible-node1.shinya
    ansible-node2.shinya
    ansible-node3.shinya

上面模糊查询了资产,“*”也可以用来查询全部的资产

[root@ansible-server ~]# ansible * --list-hosts
ERROR! Extraneous options or arguments

这里不能直接像模糊查询一样直接用“*”,需要转义符

[root@ansible-server ~]# ansible \* --list-hosts
  hosts (14):
    node1
    node2
    node3
    ansible-node1.shinya
    ansible-node2.shinya
    nodea
    nodeb
    nodec
    noded
    ansible-node3.shinya
    nodee
    nodef
    nodeg
    nodeh

或者让他是一个字符串

[root@ansible-server ~]# ansible "*" --list-hosts
  hosts (14):
    node1
    node2
    node3
    ansible-node1.shinya
    ansible-node2.shinya
    nodea
    nodeb
    nodec
    noded
    ansible-node3.shinya
    nodee
    nodef
    nodeg
    nodeh

使用逻辑匹配,或:并集

[root@ansible-server ~]# ansible web_server:db_server --list-hosts
  hosts (11):
    ansible-node1.shinya
    ansible-node2.shinya
    nodea
    nodeb
    nodec
    noded
    ansible-node3.shinya
    nodee
    nodef
    nodeg
    nodeh

使用逻辑匹配,与:交集

[root@ansible-server ~]# ansible 'web_server:&db_server' --list-hosts
  hosts (1):
    ansible-node2.shinya

使用逻辑匹配,非:
在A组而不在B组的

[root@ansible-server ~]# ansible 'web_server:!db_server' --list-hosts
  hosts (5):
    ansible-node1.shinya
    nodea
    nodeb
    nodec
    noded

复杂匹配:A和B组中的节点在C组中存在但是不在D组中存在

A:B:&C:!D
点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

Title - Artist
0:00