Ansible教程:介绍


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就是在任务执行中所有涉及到目标机的列表,比如:

bash
[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不需要):

bash
yum install epel-release
yum install python2-pip
pip install ansible

检测Ansible版本:

bash
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的路径:

bash
inventory = /etc/ansible/hosts

同时为了后续使用方便,在/etc/ansible/hosts中添加内容:

bash
[dev]
xxx.xxx.xxx.xxx

如果要使用自定义的inventory:

bash
cd ~
mkdir ansible
cd ansible
touch inventory

在inventory文件中添加被管理机器的IP:

bash
[dev]
xxx.xxx.xxx.xxx

在运行如下命令查看inventory:

bash
ansible-inventory -i inventory --list

会看到如下输出信息:

json
{
    "_meta": {
        "hostvars": {}
    },
    "all": {
        "children": [
            "dev",
            "ungrouped"
        ]
    },
    "dev": {
        "hosts": [
            "xxx.xxx.xxx.xxx"
        ]
    }
}

测试从管理节点到被管理节点的连接

首先创建一个配置文件:~/.ansible.cfg:

bash
[defaults]
remote_user=ubuntu

运行如下命令:

bash
cd ~
ansible all -i /home/lcoding/ansible/inventory -m ping

当然,也能针对不同分组来运行上面命令。比如针对dev组下的所有机器:

bash
cd ~
ansible dev -i /home/lcoding/ansible/inventory -m ping

会看到类似输出:

json
xxx.xxx.xxx.xxx | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

测试从管理节点复制一个文件到被管理节点

bash
ansible all -i /home/lcoding/ansible/inventory -m copy -a "src=/tmp/test.conf dest=/tmp/test.conf"

运行后会输出类似信息:

json
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

运行命令:

bash
ansible-playbook -i /home/lcoding/ansible/inventory playbook.yml

文章作者: 逻思
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 逻思 !