Ansible是Automation for Everyone为主题的构成管理工具。在这里介绍Ansbile的组成因素,特点及安装方法。
Ansible构成因素
Ansible由以下4个因素构成,接下来一起看一下每个因素的功能。
- Ansible本体
- Inventory
- Module
- 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 可指定
[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命令后,会在
[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命令将创建的秘钥对里的公钥拷贝到对象服务器,在这里将公钥拷贝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