红帽Redhat--Ansible实战1

在运行Windows操作系统的主机LAPTOP-OUR52V78上安装有VMware Workstation Player软件。因为Windows自带的虚拟机平台软件"Hyper-V"使用难度较大,而且关于在"Hyper-V"上运行虚拟机,修改虚拟机错误的相关技术博客和文章的数量稀少,不利于顺利进行Ansible实战,所以使用"VMware Workstation Player"软件,并通过"VMware Workstation Player"软件,创建用来进行Ansible实战的虚拟机。同时只需要采用VMware Workstation Player来进行Ansible实战,不需要使用VMware Workstation,因为VMware Workstation过于丰富的界面设置选项会将本应用于Ansible实战的注意力转移到虚拟机管理上去,而虚拟机管理是红帽RHCSA(红帽认证系统管理员)认证的主要内容,并不是将Ansible作为主要考察内容的RHCE(红帽认证工程师)认证的主要内容,所以为了集中注意力,屏蔽掉虚拟机管理的细节,只使用VMware Workstation Player来进行Ansible实战的做法是合理的。另外,"VMware Workstation"软件的版本是17,而不是16,也是为了避免软件版本对Ansible实战产生可能的Bug,进而影响Ansible实战的进度。

因为Ansible是一款开源的软件,所以我们能够通过软件包管理工具,免费下载到ansible软件。同时Ansible是一款自动化运维工具,在传统的运维工作中,假如一位运维人员负责生产环境下的20台服务器,那么对于这一个运维人员来说,一台接一台的在生产环境的20台服务器上,进行相同的日志查看、网卡管理、软件更新、用户管理等工作就成为无法避免的事情,也是影响运维效率的一大因素。而Ansible自动化运维工具的使用,使得下面的场景成为可能:在生产环境中,新引入1台服务器,一共21台服务器。其中新引入的1台服务器作为控制节点,安装Ansible软件包,控制其余的20台服务器。原有的20台服务器作为被管理节点,不需要安装Ansible软件包,仍照常执行生产任务。所以Ansible是一款开源的自动化运维工具。

Ansible的底层是Python和SSH这两款同时被在安装Linux系统时自动安装的软件。因为Ansible基于Python和SSH软件,作为控制节点的服务器通过使用Ansible软件对作为被管理节点的服务器发出的所有命令,最终都会转化为经由SSH传输并且在作为被管理节点的主机上执行的Python代码,而生产环境中的服务器在被安装Linux系统时就已经自动安装了Python和SSH。所以在上面的例子中,作为被管理节点的服务器不需要安装Ansible软件包,只有作为控制节点的主机才需要安装Ansible软件包。

基于Ansible的特性,为了进行Ansible实战,"VMware Workstation Player"上至少需要三台虚拟机,因为如果只有两台虚拟机,那么将不利于学习在作为控制节点的主机上进行作为被控制节点的服务器的分组。因为Ansible软件对于支持它运行的操作系统的要求是,CentOS8和RHEL9这两款Linux发行版的优于CentOS7这款Linux发行版,而我们仅需要一台虚拟机,让它作为控制节点的主机,并且RHEL9这款Linux发行版只有在红帽官网上注册账号后才能下载到,且来自中国区的下载请求会被红帽官方列入管控行为,所以CentOS8被选择作为运行Ansible软件的操作系统,安装在一台虚拟机上。另外的两台虚拟机可以选择安装曾经同样由红帽推出的CentOS7操作系统。值得注意的一点是,三台虚拟机的虚拟网络适配器应该连接在同一个虚拟网络上,即如果安装有CentOS8操作系统的作为控制节点的主机的虚拟网络适配器连接到了VMnet8这个默认采用NAT模式的虚拟网络上时,安装有CentOS7操作系统的作为被控制节点的主机的虚拟网络适配器也应该同时连接到VMnet8这个默认采用NAT模式的虚拟网络。当然考虑到作为控制节点的主机需要使用yum软件包管理工具进行ansible软件包的安装,使用默认采用NAT模式的VMnet8虚拟网络来连接三台虚拟机的做法是更合理的。

|----------------|-----------------|-------|
| 操作系统名称 | IP地址 | 角色 |
| CentOS8 Stream | 192.168.133.148 | 控制节点 |
| CentOS7 | 192.168.133.147 | 被控制节点 |
| CentOS7 | 192.168.133.146 | 被控制节点 |
[运行在"VMware Workstation Player"上的三台虚拟机的简介]

当在"VMware Workstation Player"上创建三台虚拟机并安装好对应的操作系统、配置好对应的虚拟网络适配器之后,我们需要对作为控制节点的主机进行Ansible软件的安装。虽然当初在安装有CentOS8 Stream操作系统的主机上作为root用户使用"yum install ansible"命令安装"ansible"时,并没有提前下载epel源,但是在文心一言关于"如何在Linux系统上安装Ansible软件"的回答中,在安装"ansible"之前应该先下载epel源被提到,我猜测,是因为CentOS8 Stream操作系统默认的软件源中已包含可供下载的"ansible"软件,所以在作为控制节点的安装有CentOS8 Stream操作系统的主机中,直接使用"yum install ansible"命令安装"ansible"软件是合理的。下图显示已被安装好的ansible软件:

root@localhost \~# rpm -qa | grep ansible

ansible-core-2.15.3-1.el8.x86_64

root@localhost \~#

"rpm -qa | grep ansible" ,"rpm -qa"命令表示列出已经安装在CentOS8 Stream操作系统中的所有rpm软件包,"-q"参数表示"query"查询,"-a"参数表示所有,"-qa"即表示查询所有软件包,"grep ansible"表示在列出的已经安装在CentOS8 Stream操作系统中的所有rpm软件包中,过滤出包含有"ansible"的软件包。"ansible-core-2.15.3-1.el8.x86_64"即表示ansible软件包已经被安装在作为控制节点的主机中。

root@localhost \~# ansible --version

ansible core 2.15.3

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.11/site-packages/ansible

ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections

executable location = /usr/bin/ansible

python version = 3.11.4 (main, Aug 11 2023, 13:46:19) GCC 8.5.0 20210514 (Red Hat 8.5.0-20) (/usr/bin/python3.11)

jinja version = 3.1.2

libyaml = True

root@localhost \~#

运行"ansible --version"命令,当出现图中所示的包含"ansible"的版本信息在内的"ansible"软件配置信息时,即表示"ansible"已被正确下载并安装在作为管理节点的主机中。

在作为控制节点的主机成功安装Ansible软件之后,作为一般用户user,需要创建一个文件夹专门用于存放Ansible相关文件,可以通过"mkdir ~/ansible"命令,在当前用户user的家目录下,创建名为"ansible"的文件夹。在该文件夹下有两个基本的配置文件,一个是"inventory"文件,作用是列出作为被管理节点的所有主机;另一个是"ansible.cfg"文件,作用是确定被使用的inventory文件、确定作为管理节点的主机在通过SSH连接到作为被管理节点的服务器上时使用被管理节点服务器上的哪个用户来执行Python命令、确定管理节点主机在通过SSH连接到被管理节点服务器上时需不需要提示输入SSH连接的密码、确定在被管理节点服务器上是否需要提权到另一个用户、确定在被管理节点服务器上提权到另一个用户的方法、确定在被管理节点服务器上提权到哪个用户、确定在被管理节点服务器上进行提权操作时是否需要提示输入密码。在作为管理节点的服务器上的"inventory"和"ansible.cfg"文件内容如下所示:

dqx@localhost ansible$ pwd

/home/dqx/Desktop/ansible

dqx@localhost ansible$ ls -alh

total 8.0K

drwxrwxr-x. 2 dqx dqx 42 Oct 31 06:22 .

drwxr-xr-x. 3 dqx dqx 21 Oct 31 05:41 ..

-rw-rw-r--. 1 dqx dqx 157 Oct 31 06:22 ansible.cfg

-rw-rw-r--. 1 dqx dqx 42 Oct 31 05:44 inventory

dqx@localhost ansible$ cat ansible.cfg

defaults

inventory=./inventory

remote_user=dqx

ask_pass=false

privilege_escalation

become=false

become_method=sudo

become_user=root

becom_ask_pass=false

dqx@localhost ansible$ cat inventory

192.168.133.147

192.168.133.146

centos

192.168.133.147

dqx@localhost ansible$

|----------------|-----------------|-------|---------|--------|
| 操作系统名称 | IP地址 | 角色 | 非root用户 | root用户 |
| CentOS8 Stream | 192.168.133.148 | 控制节点 | dqx | root |
| CentOS7 | 192.168.133.147 | 被控制节点 | dqx | root |
| CentOS7 | 192.168.133.146 | 被控制节点 | dqx | root |
[运行在"VMware Workstation Player"上的三台虚拟机的用户情况]

三台虚拟机中的用户情况如上表所示。回到shell的输出结果当中,"pwd"表示列出当前的工作目录, "/home/dqx/Desktop/ansible"是"pwd"命令在shell中的执行结果,表示当前工作目录是"/home/dqx/Desktop/ansible","ls -alh"命令表示列出当前工作目录下包括以"."开头作为文件名称的隐藏文件在内的所有文件的详细信息,并且将文件的大小的单位转换为合适的单位使得更加易读。在"ls -alh"的返回结果中,"ansible.cfg"与"inventory"即为两个ansible配置文件。通过使用cat命令将"ansible.cfg"文件的内容输出到shell中,从"defaults"到"ask_pass=true"之间的所有行都属于"default"块的配置内容,从"privilege_escalation"到"becom_ask_pass=false"之间的所有行都属于"privilege_escalation"块的配置内容。"inventory=./inventory"表示"ansible.cfg"配置文件使用的"inventory"文件是和"ansible.cfg"文件在同一目录下并且同层级的"inventory"文件,"remote_user=dqx"表示作为管理节点的主机在通过SSH连接到作为被管理节点的服务器上时使用被管理节点服务器上的dqx用户来执行Python命令。"ask_pass=false"表示管理节点主机在通过SSH连接到被管理节点服务器上时不需要提示输入SSH连接的密码,但是考虑到没有在管理节点主机上设置为采用基于密钥的认证方法,而仍然采用的是基于密码的认证方法,所以我们在正式通过Ansible管理被管理节点服务器之前,需要设置免密SSH登录。暂时忽略"privilege_escalation"块的配置内容。

要设置免密SSH登录,需要在作为管理节点的主机上,通过"ssh-keygen"命令生成一组公钥与私钥,之所以要通过该命令生成一组公钥与私钥,是因为之前为了让被管理节点服务器允许来自管理节点主机的SSH连接时采用的认证方式是基于密码的认证方式,而基于密码的认证方式并不会使得管理节点主机自动生成一组公钥与私钥,所以需要通过"ssh-keygen"命令生成一组公钥与私钥。通过"ls -alh ~/.ssh/"命令可以查看到在管理节点主机上的公钥与私钥:

dqx@localhost \~$ ls -alh ~/.ssh

total 16K

drwx------. 2 dqx dqx 57 Nov 1 06:55 .

drwx------. 19 dqx dqx 4.0K Nov 1 06:40 ..

-rw-------. 1 dqx dqx 2.6K Oct 31 05:58 id_rsa

-rw-r--r--. 1 dqx dqx 579 Oct 31 05:58 id_rsa.pub

-rw-r--r--. 1 dqx dqx 177 Oct 31 05:58 known_hosts

dqx@localhost \~$ cat ./.ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQD+iR5IYRa8M8PSWhwZHyFLCb8pwnsiNyKWyw6SLWRZ48ghJW++oeCqH9EqukR/dEc0O11L1CH0+cjeq9H9824PlN1MXMXA7rCV7XX5Cu8fWH2a/q+ezluEtXOvjUWWAk251Zi5traCFzQRPUUJOV9Rqa8Sqo+knV07AFOnzsTY/YP3Tq16qa9ZAI+UBVG2N8axgnshyA4oRGL+vE1zodxqWZY+QC7egJKw8bB3IyiYGYQbPxzqWaqmsv6op0oFmGOtPmuPMLXuKhzDsUnMPFh7W++RWveBWbm40HzUTu7PtpsThEsRpXp33Bt3Ulkj6AXqHD5tQl296hKCiB/r/bo+LIcSAben3l0wGl5tNFTbDaVgyext8qTA5kb5ruvX4Jf6oT+ngBpk9hDLSu7XBFQBcWS06D8Gatgt3JNZah4j5BbXcV9dHZ2vtIoDy2iYtIB5Q2DChetLkmee1I+UOMJWM4N+4n5kGki9Zw3UoBwB2iCp80Lhrlb28gr1WzF60+s= dqx@localhost.localdomain

dqx@localhost \~$ cat ./.ssh/known_hosts

dqx@localhost \~$ cat .ssh/known_hosts

192.168.133.147 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHb17ZDiFBmpoRrdFAQce1pEbzyLtcGNrXWmWpCxsTcCaeAnLQTzKqAbaq48ZSbxIIzgj4dlpp8Cuy4hb9vWtY8=

192.168.133.146 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDjg1FIrArIYhNXHPfzttOH1UTZEWYIfvbCBnOsO0jf4DTyQ0A6ps3NrwgxWR20whcfTn3LEd6CxvgFxFoDzt6U=

dqx@localhost \~$

"id_rsa"即为通过"ssh-keygen"命令生成的私钥,"id_rsa.pub"即为通过"ssh-keygen"命令生成的与"id_rsa"私钥为一对的公钥。因为公钥可以公布,私钥不可以公布,所以只通过"cat ./.ssh/id_rsa.pub"命令显示公钥的内容。在"ls -alh ~/.ssh"的结果中的"known_hosts"文件表示已被确认身份且不会被冒充的主机,在这里已经确定IP地址为"192.168.133.147"和"192.168.133.146"的主机,也就是作为被管理节点的服务器的身份。

接着将作为管理节点的主机生成的一对公私钥中的公钥传给作为被管理节点的服务器。使用命令"ssh-copy-id dqx@192.168.133.147", "ssh-copy-id root@192.168.133.147", "ssh-copy-id dqx@192.168.133.146", "ssh-copy-id root@192.168.133.146"。

dqx@localhost \~$ ssh-copy-id dqx@192.168.133.147

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/dqx/.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: WARNING: All keys were skipped because they already exist on the remote system.

(if you think this is a mistake, you may want to use -f option)

dqx@localhost \~$ ssh-copy-id root@192.168.133.147

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/dqx/.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: WARNING: All keys were skipped because they already exist on the remote system.

(if you think this is a mistake, you may want to use -f option)

dqx@localhost \~$ ssh-copy-id dqx@192.168.133.146

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/dqx/.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: WARNING: All keys were skipped because they already exist on the remote system.

(if you think this is a mistake, you may want to use -f option)

dqx@localhost \~$ ssh-copy-id root@192.168.133.146

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/dqx/.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: WARNING: All keys were skipped because they already exist on the remote system.

(if you think this is a mistake, you may want to use -f option)

dqx@localhost \~$

四条命令的结果均为"All keys were skipped because they already exist on the remote system.",说明已经将作为管理节点的主机的公钥传递给了作为被管理节点的两台服务器中,进而SSH免密登录设置完成。这时在作为管理节点的主机中包含"inventory"文件的"ansible"目录下,使用命令"ansible all -m ping"命令:

dqx@localhost ansible$ ansible all -m ping

192.168.133.146 | SUCCESS => {

"ansible_facts": {

"discovered_interpreter_python": "/usr/bin/python"

},

"changed": false,

"ping": "pong"

}

192.168.133.147 | SUCCESS => {

"ansible_facts": {

"discovered_interpreter_python": "/usr/bin/python"

},

"changed": false,

"ping": "pong"

}

dqx@localhost ansible$

这就表明"Ansible"已配置成功。

相关推荐
HLC++5 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室6 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
groundhappy8 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕9 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫10 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生11 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.1112 小时前
linux基础IO
linux·运维·服务器
BelongPanda14 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯14 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_7779983414 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器