Ansible是Automation for Everyone为主题的构成管理工具。在这里介绍Ansbile的组成因素,特点及安装方法。

Ansible构成因素

Ansible由以下4个因素构成,接下来一起看一下每个因素的功能。

  1. Ansible本体
  2. Inventory
  3. Module
  4. Playbook

Ansible本体

Ansible本体就是指Ansible软件本身。

Inventory

定义Ansible操作对象服务器的信息(IP地址,连接用户/密码等),既定义在哪里(Where)执行Ansible代码。

Module

Module可以理解为Ansible执行的一个一个的命令,其本质是对操作进行定义(What)。

Playbook

Module是Ansible执行的命令的话,那么Playbook就是Ansible的脚本(code),实际上使用Ansible的时候,基本上会编写及执行Playbook。但是Playbook不需要像脚本一样编写代码,而是使用YAML格式进行定义。
既如何执行(How)以Module为核心的Ansible代码。

Ansible的特点

构成管理软件Ansible和其他构成管理软件比较时的3个特点。

Agentless

其他构成管理工具Chef及Puppet等需要在构成管理对象服务器安装Agent,而Ansible则不需要安装Agent(Agentless)。
Ansible运行服务器只需通过网络连接构成管理对象服务器即可,而无需特殊的网络协议。比如Linux系统的话使用SSH协议,Windows系统使用WinRM,Docker Container使用 docker-exec进行连接。

幂等性

幂等性是指同样的操作无论执行几次其结果是一样的特性。

Ansible定义的是最终结果,而非过程。比如「文件A拷贝到/etc目录下」时,首先会确认/etc目录下是否存在A文件,如果/etc目录下存在A文件时,已经和期待的最终结果一样,因此不会执行任何变更。而文件不存在或者文件内容和期待的内容不同时,将会拷贝A文件到/etc目录下。

再利用性

Ansible通过变量和Role定义提高再利用性。

通过变量抽象其值,根据不同的操作对象服务器通过变量定义不同的值。Role为单位进行部品话,比如Linux系统的共通设定,还有特定中间件比如「MySQL安装及设定」等。

安装Ansible

介绍在Rocky Linux8.6上安装Ansible的方法。而Ansible不支持在Windows上的运行,如果需要在Windows环境运行Ansible的话,需要在Windows环境安装VMwarePlayer或者Vagrant后,安装Linux系统。

Rocky Linux版本为8.6。

首先安装epel-release Repository之后,使用 dnf install ansible -y 命令进行安装。

[root@sys-blog ~]# dnf install epel-release -y
[root@sys-blog ~]# dnf install ansible -y

安装Ansible之后, ansible –version 命令确认Ansible版本。

安装Ansible之后,使用 ansible localhost -m ping 命令确认Ansible是否正常运行。“ping”: “pong”时,表示Ansible正常运行。

在这里 -m ping通过-m选项指定ping module。可通过 ansible-doc [ModuleName] 命令确认module提供的功能。

更多关于ansible提供的Module一览可在 Index of all Modules 进行确认。

Ansible的Role

Role是我们在Ansible上可再利用的重要单位,在这里确认创建Role的方法。

在当前目录下创建 tutorial 目录后,执行 ansible-galaxy init –init-path=”roles” nginx 命令创建nginx的Role。

[root@sys-blog ~]# mkdir mkdir ansible-tutorial
[root@sys-blog ~]# cd mkdir ansible-tutorial
[root@sys-blog ~]# ansible-galaxy init --init-path="roles" nginx
- Role nginx was created successfully

执行tree命令后,可确认到如下目录结构。如果想从服务器的任何位置使用Role的话,可以把Role文件存放到 /etc/ansible/roles目录下使其变为全局Role。

[root@sys-blog ansible-tutorial]# tree
.
└── roles
    └── nginx
        ├── defaults
        │   └── main.yml   -> 定义Role里使用的变量的默认值
        ├── files          -> 存放往构成管理对象服务器拷贝的文件
        ├── handlers
        │   └── main.yml   -> 定义Handler Task
        ├── meta
        │   └── main.yml   -> 定义Role的依赖关系
        ├── README.md
        ├── tasks
        │   └── main.yml   -> 定义Role里执行的task
        ├── templates      -> 存放Jinja2 template文件
        ├── tests          -> 为了测试Role的Playbook(test.yml)及inventory
        │   ├── inventory
        │   └── test.yml
        └── vars
            └── main.yml   -> Role里使用变量

10 directories, 8 files

实际项目一般会创建多个Role,下面的命令可一次性创建多个Role。

# roles=(ansible apache jboss jdk oracle_client)
# for role in ${roles[@]}; do ansible-galaxy init --init-path="roles" $role; done

ssh-keygen命令创建公钥和私钥

Ansible需要ssh登录到对象服务器进行部署,一般使用公钥和私钥,在这里介绍使用ssh-keygen创建公钥及私钥,并把公钥注册到对象服务器的方法。

ssh-keygen命令创建公钥和私钥

在Linux上创建私钥和公钥对,使用 ssh-keygen 命令。选项 -t 可指定 加密方式,-b选项指定bits数。

[root@sys-blog ~]# [root@sys-blog ~]# ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): <Enter>
Enter passphrase (empty for no passphrase): <Enter>
Enter same passphrase again: <Enter>
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:JsBnUo33QJj/mfpRSwM/ymSoq2+i13HEMGu2vJTZkyg root@sys-blog
The key's randomart image is:
+---[RSA 2048]----+
|      .*.        |
|   . .* +        |
|    + oB o.      |
|     =+ +..o     |
|     +.BSooo*    |
|    E O+=+++ +   |
|     +.+ o+ .    |
|    o +..  .     |
|  .o.=o  ..      |

执行ssh-keygen命令后,会在/.ssh/ 目录下创建 id_rsa 和 id_rsa.pub 文件。

[root@sys-blog .ssh]# ll
total 12
-rw-------. 1 root root 1823 Aug  3 07:51 id_rsa      <- 私钥
-rw-r--r--. 1 root root  395 Aug  3 07:51 id_rsa.pub  <- 公钥
-rw-r--r--. 1 root root  525 Aug  2 20:57 known_hosts

而该命令会在公钥的最后加上用户名和主机名,就是id_rsa.pub文件末尾 root@sys-blog的部分。该部分是ssh-keygen命令默认添加的Comment。

[root@sys-blog .ssh]# cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDbyXCUf5Bw3eaL9U4ayoHZSli2DUO+rxSspqjNH1mGLB75eUDEvJc7xDXAsJoPIiiTM9HVFsLcvGLqPC51Ju7tjVyDTar44VFcJHS3rbKZEXxVb9DdKvEpqw4kaQB7YObvBrU/aRfKlxxvqWfTDlMIoqaLuf9xrnunSPT01Ao5SJC3AJLJMdN/FiiLAb/rmYrzrAiIgHaQjn+lq+267IM31pV78cDcAbMPIZp8UGxqUeBaDD19cEuZ/s1jN6cS4N7AHyGxhCybSwLWAorWkijdZLaDbd6rm9tS4r5AjLA/fZVN4aEadbuueFYBKF/cs9XzCqh+czCFBZXK4yDXC2z/ root@sys-blog

如果是测试用的话,有该注释也没有什么问题。但当我们需要把该秘钥对发布到其他服务器时,其实推荐使用-C “”选项,将该注释去掉。

[root@sys-blog ~]# ssh-keygen -t rsa -C "" -b 2048

使用-C选项后的id_res.pub文件内容如下。

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBIJeajD0QtqYVehHzVWgJvLy9R8jfIgYuxwt5VwNNcrcMvJQY1OHwPdRh7sj0Q5PNdKKRI0Xp3HkQSYvc6+ZXQSQMT/s2oFQWPSQQbtbA3572AAY+7e0ceTVkdoHnGw/HJlA2uusPvkM2cuGBJlg5qqzydFs+Pa+h+sH57lFpNij6jjam8OZ9Rf9sqyEtay7pJtfth06Mbj/VXL3vvBlo8q0gmC54Ocagt6bKHKsq3oftm6QEdO/ff4eXR1rsGMGamHchc+9WA1OOIDM1Ar6NI9/BxPiZTfwdWyX173mrDlCZWB5VyQZ3LeDWEPqbV/bbCpvxCXIBsOUZKnvXP9ZV

ssh-copy-id命令将公钥拷贝到authorized_keys文件

使用ssh-copy-id命令将创建的秘钥对里的公钥拷贝到对象服务器,在这里将公钥拷贝192.168.16.16服务器的/root/.ssh/authorized_keys文件。

[root@sys-blog ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.16.16

使用秘钥登录对象服务器

最后使用ssh命令登录对象服务器进行确认,在这里指定已创建秘钥对里的私钥。

[root@sys-blog ~]# ssh -i id_rsa root@192.168.16.16