Ansible介绍
Ansible是用于IT自动化的工具,可以用于完整一些重复性的工作。比如:
- 需要在多个服务器上更新Docker版本
- 需要在多个服务器上安装同样的软件
- 系统备份
- 创建用户
- 授予权限
通过Ansible,你可以:
- 在自己的机器上执行一些任务,而无需SSH到不同的服务器上之后再运行相应任务
- 在一个YAML文件中完成配置,安装和部署,而不是通过手工方式或Shell脚本来完成
- 可以在不同环境中反复使用同样的YAML文件
- 和人工方式相比,更加可靠不易出错
Ansible可以支持不同的操作系统和云服务提供商。
Ansible的特点:
- Agentless: Ansible的一大特点就是无需在目标机器上安装Ansible,而只需要在本地安装,就能通过远程方式在不同目标机器上执行任务。
- 支持异构IT架构,可以用来管理Windows,Mac OS,Linux
Ansible组成模块:
- Ansible Core: 提供自动化的核心模块
- Ansible Tower: 这是由Redhat提供的一个UI面板以及相关API,用于在团队间集中管理自动化任务,配置权限等。
- Ansible Galaxy: Ansible’s official hub for sharing Ansible content.
Ansible的主要用途:
- Configuration management
- Deployment
- Orchestration
- Provisioning
Ansible系统架构
在Ansible中,本地的Ansible管理节点负责从Inventory及Module中配置相应的Playbook,然后将这些命令转换为Python脚本,远程SSH到目标机器,将转换后的Python脚本在目标机器上运行以达到安装及配置相应软件的目的。
因此需要在管理节点和被管理节点间建立一种信任关系,比如将管理节点的公钥传递到被管理节点上。
对于管理节点,需要安装:
- OpenSSH
- Python
- Ansible
对于被管理节点,需要安装:
- OpenSSH
- Python
modules模块
Ansible会将不同的模块push到目标机器上。等到这些模块完成了它们的任务之后,就会被删除。
Ansible的模块一般都是实现一个细粒度的小任务的,比如:安装Redis服务器,启动Docker容器,创建一个配置文件等。
Ansible有很多不同的模块,针对不同的云平台,也有专门针对性的模块。
在完成一个任务的时候,经常需要把不同的模块进行组合,按照特定的顺序依次执行,以实现特定目标。
YAML
Ansible使用标准的YAML文件。
可以使用hosts属性来声明在哪个目标机器上运行特定的task。使用remote_user指定以哪个用户身份在目标机上运行任务。
Ansible Playbooks
在Ansible中,所谓一个Play,包含了如下信息:
- 在哪个目标机上
- 以哪个用户身份
- 执行哪些任务
在同一个YAML文件中,可以定义多个Play,比如一个是创建Web服务器的,另一个是创建Redis的,等等。这就叫做一个Playbook。
换句话说,Playbook的作用就是编排这些模块的执行(Orchestration)。
Inventory List
Ansible中的inventory就是在任务执行中所有涉及到目标机的列表,比如:
[webservers]
10.0.1.1
10.0.1.2
[redis]
10.11.1.1
10.11.1.2
10.11.1.3
有了inventory,在Playbook中就可以通过名字引用一组目标机了。
Ansible和Docker的配合使用
在传统的方式下,要通过Dockerfile来创建应用环境。
有了Ansible之后,甚至可以不用Dockerfile,直接可以在Playbook中定义应用运行的目标环境。
其实,有了Ansible之后,你可以在同一个Playbook中既管理Docker容器,也同时管理Docker容器所在的host。
Ansible和Puppet/Chef的对比
- 首先,是Ansible的语法超级简单,直接使用标准的YAML。而不像Puppet和Chef,使用Ruby
- Ansible无需在目标机器上安装任何Agent,但Puppet和Chef都需要。
Ansible的安装
如果使用Python 2, 需要单独安装epel(Python 3不需要):
yum install epel-release
yum install python2-pip
pip install ansible
检测Ansible版本:
ansible --version
Ansible配置文件
Ansible主配置文件
/etc/ansible/ansible.cfg
Ansible配置文件检查次序
- 首先检查ANSIBLE_CONFIG变量所定义的配置文件
- 其次检查当前目录下的 ansible.cfg 文件
- 然后检查用户更目录下的文件:~/ansible.cfg
- 最后检查主配置文件:/etc/ansible/ansible.cfg
简单演示Ansible的使用
建立管理节点和被管理节点的信任关系
首先将管理节点的公钥添加到被管理节点的信任列表中。
创建Ansible inventory
注意,可以不创建inventory,而使用系统默认的inventory。比如在**/etc/ansible/ansible.cfg**中,可以定义inventory的路径:
inventory = /etc/ansible/hosts
同时为了后续使用方便,在/etc/ansible/hosts中添加内容:
[dev]
xxx.xxx.xxx.xxx
如果要使用自定义的inventory:
cd ~
mkdir ansible
cd ansible
touch inventory
在inventory文件中添加被管理机器的IP:
[dev]
xxx.xxx.xxx.xxx
在运行如下命令查看inventory:
ansible-inventory -i inventory --list
会看到如下输出信息:
{
"_meta": {
"hostvars": {}
},
"all": {
"children": [
"dev",
"ungrouped"
]
},
"dev": {
"hosts": [
"xxx.xxx.xxx.xxx"
]
}
}
测试从管理节点到被管理节点的连接
首先创建一个配置文件:~/.ansible.cfg:
[defaults]
remote_user=ubuntu
运行如下命令:
cd ~
ansible all -i /home/lcoding/ansible/inventory -m ping
当然,也能针对不同分组来运行上面命令。比如针对dev组下的所有机器:
cd ~
ansible dev -i /home/lcoding/ansible/inventory -m ping
会看到类似输出:
xxx.xxx.xxx.xxx | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
测试从管理节点复制一个文件到被管理节点
ansible all -i /home/lcoding/ansible/inventory -m copy -a "src=/tmp/test.conf dest=/tmp/test.conf"
运行后会输出类似信息:
xxx.xxx.xxx.xxx | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": true,
"checksum": "70a71261e149044792ef942c9b4984d261e1458d",
"dest": "/tmp/test.conf",
"gid": 1001,
"group": "ubuntu",
"md5sum": "98977f1da9ac4035f854dd02357834ee",
"mode": "0664",
"owner": "ubuntu",
"size": 13,
"src": "/home/ubuntu/.ansible/tmp/ansible-tmp-1664793594.7358556-59294-97930720216752/source",
"state": "file",
"uid": 1001
}
测试一个playbook
运行命令:
ansible-playbook -i /home/lcoding/ansible/inventory playbook.yml