1.Ansible介绍
1.1 Ansible简介
(1)Ansible不需要安装客户端,通过sshd去通信(无密钥登陆)。
(2)Ansible无服务器端,使用时直接运行命令。
(3)Ansible基于模块工作,模块可以由任何语言开发。
(4)Ansible不仅支持命令行使用模块,也支持编写Yaml格式的playbook,易于编写和阅读。
(5)Ansible安装十分简单,CentOS上可直接Yum安装。
(6)Ansible有提供UI(浏览器图形化)www.ansible.com/tower,收费的官方文档 http://docs.ansible.com/ansible/latest/index.html。
Ansible已经被RedHat公司收购,它在Github(https://github.com/ansible/ansible)上是一个非常受欢迎的开源软件。
一本不错的入门电子书 https://ansible-book.gitbooks.io/ansible-first-book/
1.2 Ansible系统架构
Ansible的系统架构如图1所示。
(1)Ansible:核心程序(核心引擎)
(2)Core Modules:核心模块,主要操作是通过调用核心模块来完成管理任务(Ansible自带模块)
(3)Custom Modules:自定义模块,如果核心模块不足以完成某种功能,可以添加自定义模块来完成功能,支持多种语言。
(4)Plugins:插件,完成模块功能的补充,借助插件完成记录日志,邮件等功能。
(5)Playbooks:剧本定义Ansible任务的配置文件,可以将多个任务定义在一个剧本中,有Ansible自动执行,剧本支持多个任务,可以由控制主机运行多个位置,同时对多台远程主机进行管理。Playbooks是Ansible的配置、部署和编排语言,可以描述一个想要的运程系统执行策略或一组步骤的一般过程.
(6)Connectior plugins:连接插件,Ansible基于连接插件连接到各个主机上,负责和被管节点实现通信(Ansible和Host通信使用)
(7)Host Inventory:主机清单,定义Ansible管理的主机策略,默认是在Ansible的hosts配置文件中定义被管节点,记录由Ansible管理的主机信息,包括端口、密码、IP等。
1.3 Ansible执行流程
如图2所示,Ansible在运行时,首先读取ansible.cfg中的配置,根据规则获取Inventory中的管理主机列表,并行的在这些主机中执行配置的任务,最后等待执行返回的结果。
2.Ansible安装
(1)环境准备
修改主机名
rootalocalhost ~]# hostnamectl set-hostname ansible-test]
rootalocalhost ~l# bash
在两台机器上关闭防火墙和SELinux
[root@ansible-test1 ~]# systemctl stop firewalld
[root@ansible-test1 ~]# systemctl disable firewalld
[root@ansible-test1 ~]# setenforce 0
修改/etc/hosts文件
[root@ansible-test1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.2.10 ansible-test1 //添加两台主机的IP和主机名
192.168.2.20 ansible-test2
(2)安装Ansible
准备两台机器anisble-01和anisble-02,只需要在anisble-01上安装Ansible,先安装epel仓库
[root@ansible-test1 ~]# yum install epel-release -y
[root@ansible-test1 ~]# yum install -y ansible
[root@ansible-test1 ~]# ansible --version
ansible 2.9.27config file = /etc/ansible/ansible,cfgconfigured module search path = [u'/root/.ansible/plugins/modules’, u'/usr/share/ansible/plugins/modules']ansible python module location = /usr/lib/python2.7/site-packages/ansibleexecutable location =/usr/bin/ansiblepython version = 2.7,5 (default, Apr 11 2018,07:36:10) [GCc 4.8.5 20150623 (Red Hat 4.8.5-28)]
(3)免密配置
anisble-01上生成密钥对ssh-keygen -t rsa,把公钥放到anisble-02上,设置密钥认证
[root@ansible-test1 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
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:noXQMFFeEGuct0KdmqnqPaKwPZawovbauE6ejo22hfQ root@ansible-test1
The key's randomart image is:
+---[RSA 2048]----+
| +o+o. |
| * = . |
| . O + |
| + * . |
| . S o |
|o o o + |
|.= E . o |
|*OO .o. |
|%@O*o... |
+----[SHA256]-----+
[root@ansible-test1 ~]# ssh-copy-id 192.168.20.45
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.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: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.20.45's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.20.45'"
and check to make sure that only the key(s) you wanted were added.
[root@ansible-test1 ~]# ssh 192.168.20.45
Last login: Mon Dec 9 19:01:28 2024 from 192.168.20.1
[root@ansible-test2 ~]# exit
logout
Connection to 192.168.20.45 closed.
(4)主机组设置
在/etc/ansible/hosts文件中添加本机和另一台机器的IP
[root@ansible-test1 ~]# grep ^[^#] /etc/ansible/hosts
[testhost]
127.0.0.1
2.1 Ansible远程登录执行命令-command
[root@ansible-test1 ~]# ansible testhost -m command -a "hostname"
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:XAJ0u7oW+LkZyLPHW0KHB984o9XoOdFoRq6Z6kS31s4.
ECDSA key fingerprint is MD5:96:9a:2e:7e:a5:2a:9c:54:2f:5d:84:b2:20:f0:0e:dd.
Are you sure you want to continue connecting (yes/no)? yes