LinuxProbe 0x21 使用Ansible服务实现自动化运维

本文详细介绍了如何使用Ansible这款开源运维自动化工具,包括其安装、基本概念和功能,如自动部署、配置管理、远程控制等。文章通过实例演示了如何通过Ansible进行服务器初始化、软件部署、网络配置等操作,强调了其易于上手、无需客户端、基于SSH协议的优势。此外,还探讨了Ansible的模块化设计、角色功能以及如何通过剧本文件实现复杂任务的自动化执行。
摘要由CSDN通过智能技术生成

Ansible是最近几年特别火的一款开源运维自动化工具,它能够帮助运维人员肉眼可见地提高工作效率,并减少人为失误。Ansible有上千个功能丰富且实用的模块,而且有详尽的帮助信息可供查阅,因此即便是小白用户也可以轻松上手。

  • Ansible介绍与安装

Ansible目前是运维自动化工具中最简单、容易上手的一款优秀软件,能够用来管理各种资源。

可以使用Ansible自动部署应用程序,以此实现IT基础架构的全面部署。

例如,借助于Ansible,可以轻松地对服务器进行初始化配置、安全基线配置,以及进行更新和打补丁操作。

相较于Chef、Puppet、SaltStack等C/S(客户端/服务器)架构的自动化工具来讲,尽管Ansible的性能并不是最好的,但由于它基于SSH远程会话协议,不需要客户端程序,只要知道受管主机的账号密码,就能直接用SSH协议进行远程控制,因此使用起来优势明显。

 

Ansible服务本身并没有批量部署的功能,它仅仅是一个框架,真正具有批量部署能力的是其所运行的模块。

Ansible内置的模块非常丰富,几乎可以满足一切需求,使用起来也非常简单,一条命令甚至影响上千台主机。

如果需要更高级的功能,也可以运用Python语言对Ansible进行二次开发。

 Ansible服务专用术语对照表

术语

中文叫法

含义

Control node

控制节点

指的是安装了Ansible服务的主机,也被称为Ansible控制端,主要是用来发布运行任务、调用功能模块,对其他主机进行批量控制。

Managed nodes

受控节点

指的是被Ansible服务所管理的主机,也被称为受控主机或客户端,是模块命令的被执行对象。

Inventory

主机清单

指的是受控节点的列表,可以是IP地址、主机名称或者域名。

Modules

模块

指的是上文提到的特定功能代码,默认自带有上千款功能模块,在Ansible Galaxy有超多可供选择。

Task

任务

指的是Ansible客户端上面要被执行的操作。

Playbook

剧本

指的是通过YAML语言编写的可重复执行的任务列表,把常做的操作写入到剧本文件中,下次可以直接重复执行一遍。

Roles

角色

从Ansible 1.2版本开始引入的新特性,用于结构化的组织Playbook,通过调用角色实现一连串的功能。

由于受控节点不需要安装客户端,外加SSH协议是Linux系统的标配,因此可以直接通过SSH协议进行远程控制。在控制节点上,也不用每次都重复开启服务程序,使用ansible命令直接调用模块进行控制即可。

RHEL 8系统的镜像文件默认不带有Ansible服务程序,需要从Extra Packages for Enterprise Linux(EPEL)扩展软件包仓库获取。EPEL软件包仓库由红帽公司提供,是一个用于创建、维护和管理企业版Linux的高质量软件扩展仓库,通用于RHEL、CentOS、Oracle Linux等多种红帽系企业版系统,目的是对于默认系统仓库软件包进行扩展。

下面准备在系统上部署Ansible服务程序。

第1步:在“虚拟机设置”界面中,将“网络适配器”的“网络连接”选项调整为“桥接模式”,并将系统的网卡设置成“Automatic(DHCP)”模式

 

[root@localhost ~]# ping www.baidu.com -c 4
PING www.baidu.com (180.101.49.11) 56(84) bytes of data.
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=1 ttl=52 time=24.7 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=2 ttl=52 time=96.6 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=3 ttl=52 time=16.2 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=4 ttl=52 time=16.6 ms


--- www.baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 173ms
rtt min/avg/max/mdev = 16.173/38.527/96.608/33.703 ms
[root@localhost ~]#

第2步:在原有软件仓库配置的下方,追加EPEL扩展软件包安装源的信息。

[root@localhost ~]# ls /etc/yum.repos.d/
redhat.repo  rhel8.repo
[root@localhost ~]# vim /etc/yum.repos.d/rhel8.repo
[BaseOS]
name=BaseOS
baseurl=file:///media/cdrom/BaseOS
enabled=1
gpgcheck=0

[AppStream]
name=AppStream
baseurl=file:///media/cdrom/AppStream
enabled=1
gpgcheck=0

[EPEL]
name=EPEL
baseurl=https://dl.fedoraproject.org/pub/epel/8/Everything/x86_64/
enabled=1
gpgcheck=0
[root@localhost ~]#

第3步:安装!

[root@localhost ~]# dnf install -y ansible
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
AppStream                                       351 kB/s | 3.2 kB     00:00    
BaseOS                                          184 kB/s | 2.7 kB     00:00    
EPEL                                            479 kB/s |  10 MB     00:21    
Dependencies resolved.
================================================================================
Package                 Arch        Version               Repository      Size
================================================================================
Installing:
ansible                 noarch      2.9.24-1.el8          EPEL            17 M
Installing dependencies:
python3-babel           noarch      2.5.1-3.el8           AppStream      4.8 M
python3-jinja2          noarch      2.10-9.el8            AppStream      537 k
python3-jmespath        noarch      0.9.0-11.el8          AppStream       45 k
python3-markupsafe      x86_64      0.23-19.el8           AppStream       39 k
python3-pyasn1          noarch      0.3.7-6.el8           AppStream      126 k
libsodium               x86_64      1.0.18-2.el8          EPEL           162 k
python3-bcrypt          x86_64      3.1.6-2.el8.1         EPEL            44 k
python3-pynacl          x86_64      1.3.0-5.el8           EPEL           100 k
sshpass                 x86_64      1.06-9.el8            EPEL            27 k
Installing weak dependencies:
python3-paramiko        noarch      2.4.3-1.el8           EPEL           289 k


Transaction Summary
================================================================================
Install  11 Packages


Total size: 23 M
Total download size: 18 M
Installed size: 122 M
Downloading Packages:
(1/6): python3-bcrypt-3.1.6-2.el8.1.x86_64.rpm   18 kB/s |  44 kB     00:02    
(2/6): libsodium-1.0.18-2.el8.x86_64.rpm         52 kB/s | 162 kB     00:03    
(3/6): python3-pynacl-1.3.0-5.el8.x86_64.rpm     37 kB/s | 100 kB     00:02    
(4/6): sshpass-1.06-9.el8.x86_64.rpm            103 kB/s |  27 kB     00:00    
(5/6): python3-paramiko-2.4.3-1.el8.noarch.rpm   60 kB/s | 289 kB     00:04    
(6/6): ansible-2.9.24-1.el8.noarch.rpm          529 kB/s |  17 MB     00:32    
--------------------------------------------------------------------------------
Total                                           548 kB/s |  18 MB     00:32     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : sshpass-1.06-9.el8.x86_64                             1/11
  Installing       : python3-bcrypt-3.1.6-2.el8.1.x86_64                   2/11
  Installing       : libsodium-1.0.18-2.el8.x86_64                         3/11
  Installing       : python3-pynacl-1.3.0-5.el8.x86_64                     4/11
  Installing       : python3-pyasn1-0.3.7-6.el8.noarch                     5/11
  Installing       : python3-paramiko-2.4.3-1.el8.noarch                   6/11
  Installing       : python3-markupsafe-0.23-19.el8.x86_64                 7/11
  Installing       : python3-jmespath-0.9.0-11.el8.noarch                  8/11
  Installing       : python3-babel-2.5.1-3.el8.noarch                      9/11
  Installing       : python3-jinja2-2.10-9.el8.noarch                     10/11
  Installing       : ansible-2.9.24-1.el8.noarch                          11/11
  Running scriptlet: ansible-2.9.24-1.el8.noarch                          11/11
  Verifying        : python3-babel-2.5.1-3.el8.noarch                      1/11
  Verifying        : python3-jinja2-2.10-9.el8.noarch                      2/11
  Verifying        : python3-jmespath-0.9.0-11.el8.noarch                  3/11
  Verifying        : python3-markupsafe-0.23-19.el8.x86_64                 4/11
  Verifying        : python3-pyasn1-0.3.7-6.el8.noarch                     5/11
  Verifying        : ansible-2.9.24-1.el8.noarch                           6/11
  Verifying        : libsodium-1.0.18-2.el8.x86_64                         7/11
  Verifying        : python3-bcrypt-3.1.6-2.el8.1.x86_64                   8/11
  Verifying        : python3-paramiko-2.4.3-1.el8.noarch                   9/11
  Verifying        : python3-pynacl-1.3.0-5.el8.x86_64                    10/11
  Verifying        : sshpass-1.06-9.el8.x86_64                            11/11
Installed products updated.


Installed:
  ansible-2.9.24-1.el8.noarch            python3-paramiko-2.4.3-1.el8.noarch    
  python3-babel-2.5.1-3.el8.noarch       python3-jinja2-2.10-9.el8.noarch       
  python3-jmespath-0.9.0-11.el8.noarch   python3-markupsafe-0.23-19.el8.x86_64  
  python3-pyasn1-0.3.7-6.el8.noarch      libsodium-1.0.18-2.el8.x86_64          
  python3-bcrypt-3.1.6-2.el8.1.x86_64    python3-pynacl-1.3.0-5.el8.x86_64      
  sshpass-1.06-9.el8.x86_64             


Complete!
[root@localhost ~]#

安装完毕后,Ansible服务便默认已经启动。使用--version参数可以看到Ansible服务的版本及配置信息。

[root@localhost ~]# ansible --version
ansible 2.9.25
  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, Jan 11 2019, 02:17:16) [GCC 8.2.1 20180905 (Red Hat 8.2.1-3)]
[root@localhost ~]#

  • 设置主机清单

Ansible服务的主配置文件存在优先级的顺序关系,默认存放在/etc/ansible目录中的主配置文件优先级最低。如果在当前目录或用户家目录中也存放着一份主配置文件,则以当前目录或用户家目录中的主配置文件为主。同时存在多个Ansible服务主配置文件时,

Ansible服务主配置文件优先级顺序

优先级

文件位置

./ansible.cfg

~/.ansible.cfg

/etc/ansible/ansible.cfg

Ansible服务是用于实现主机批量自动化控制的管理工具,可以把要管理的主机IP地址预先写入主机清单文件(/etc/ansible/hosts),这样后续再通过执行ansible命令来执行任务时就自动包含这些主机了

 测试受管主机信息

操作系统

IP地址

功能用途

RHEL 8

192.168.10.20

dev

RHEL 8

192.168.10.30

test

将测试主机写入到主机清单文件中,并将主机进行分组,主机清单文件在修改后会立即生效,一般使用“ansible-inventory --graph”命令以结构化的方式显示出受管主机的信息。

[root@localhost ~]# vim /etc/ansible/hosts
[dev]
192.168.10.20
[test]
192.168.10.30
[root@localhost ~]# ansible-inventory --graph
@all:
  |--@dev:
  |  |--192.168.10.20
  |--@test:
  |  |--192.168.10.30
  |--@ungrouped:
[root@localhost ~]#

Ansible常用变量汇总

参数

作用

ansible_ssh_host

受管主机名

ansible_ssh_port

端口号

ansible_ssh_user

默认账号

ansible_ssh_pass

默认密码

ansible_shell_type

Shell终端类型

  再次配置主机清单文件,使其登录各主机时自动登录,因测试主机密码都一样,可以使用all统一配置。

[root@localhost ~]# cat /etc/ansible/hosts
[dev]
192.168.10.20
[test]
192.168.10.30
[root@localhost ~]# vim /etc/ansible/hosts
[root@localhost ~]# cat /etc/ansible/hosts
[dev]
192.168.10.20
[test]
192.168.10.30
[all:vars]
ansible_user=root
ansible_password=123456
[root@localhost ~]# 

将Ansible主配置文件中的第71行设置成默认不需要SSH协议的指纹验证,以及将第107行设置成默认执行剧本时所使用的管理员名称为root

[root@localhost ~]# vim /etc/ansible/ansible.cfg
...
70 # uncomment this to disable SSH key host checking
- 71 #host_key_checking = False
+ 71 host_key_checking = False
72
73 # change the default callback, you can only have one 'stdout' type  enabled     at a time.
...
106 # (/usr/bin/ansible will use current user as default)
- 107 #remote_user = root
+ 107 remote_user = root
108
109 # logging is off by default unless this path is defined
[root@localhost ~]#

不需要重启服务,在以上操作完全搞定后就可以开始后面的实验了。

由于刚才是将Ansible服务器设置成了桥接及DHCP模式,现在将网络适配器修改回“仅主机模式”以及192.168.10.10/24的IP地址。在修改完成后重启网卡,然后执行ping操作,测试 192.168.10.20、192.168.10.30 通信。

[root@localhost ~]# ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.133  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::a7bc:9261:b95:a2f6  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:4a:53:0b  txqueuelen 1000  (Ethernet)
        RX packets 10650  bytes 12302250 (11.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2147  bytes 170750 (166.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 48  bytes 4608 (4.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 48  bytes 4608 (4.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:53:93:e3  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


[root@localhost ~]# ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.10  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::a7bc:9261:b95:a2f6  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:4a:53:0b  txqueuelen 1000  (Ethernet)
        RX packets 10723  bytes 12309131 (11.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2222  bytes 179074 (174.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
      
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Python实现Excel数据比对,可以使用pandas库来读取和处理Excel数据。首先,需要导入pandas库并读取要比对的两个Excel文件,例如data1.xlsx和data2.xlsx。可以使用以下代码实现: ```python import pandas as pd df1 = pd.read_excel('data1.xlsx') df2 = pd.read_excel('data2.xlsx') ``` 接下来,可以使用pandas的函数来比较两个数据框的差异,并标记出不同的数据。例如,可以使用`compare()`函数来比较两个数据框的内容,并将不同的数据标记为True。以下是一个示例代码: ```python diff = df1.compare(df2) ``` 通过执行上述代码,将得到一个包含差异数据的新数据框`diff`。你可以根据需要进一步处理和分析这些差异数据。 请注意,以上代码只是一个示例,实际使用时需要根据具体的数据和需求进行适当的调整。 引用: \[1\] 日常工作中需要对比两个Excel工作表中的数据差异是很不方便的,使用python来做就比较简单了!本文为大家介绍了python实现对比两个Excel的数据内容并标记出不同数据的示例代码,需要的可以参考一下。 \[2\] 接下来我们创建4个简单的Excel数据,方便后续对比,通过pandas读取数据:import pandas as pd df1 = pd.read_excel('data1.xlsx') df2 = pd.read_excel('data2.xlsx') df3 = pd.read_excel('data3.xlsx') df4 = pd.read_excel('data4.xlsx')。 #### 引用[.reference_title] - *1* [Python实现对比两个Excel数据内容并标出不同](https://blog.csdn.net/Linuxprobe18/article/details/128616138)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [超实用!使用Python快速对比两个Excel表格之间的差异](https://blog.csdn.net/kdhonger/article/details/127345584)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [python 实现两个excel表格数据的对比](https://blog.csdn.net/wtt234/article/details/124472790)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值