红帽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虚拟网络来连接三台虚拟机的做法是更合理的。

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

当在"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]$ 

运行在"VMware Workstation Player"上的三台虚拟机的用户情况
操作系统名称 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

三台虚拟机中的用户情况如上表所示。回到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= [email protected]
[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 [email protected]", "ssh-copy-id [email protected]", "ssh-copy-id [email protected]", "ssh-copy-id [email protected]"。

[dqx@localhost ~]$ ssh-copy-id [email protected]
/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 [email protected]
/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 [email protected]
/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 [email protected]
/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"已配置成功。 

你可能感兴趣的:(linux,ansible)