Ansible 学习笔记(一)
Ansible 发布于 2012 年,当时不同任务需要用不同工具来完成,比如配置管理(Puppet, Chef, cfengine),软件部署(Capistrano, Fabric),命令执行(Func, pssh))。Ansible 的作者 Michael DeHaan 在配置管理和基础设施维护方面有多年的工作经验,他决定用一种更简单更好的方式来完成这些任务,所以后来就有了 Ansible。
目前 Ansible 在 Github 上有将近5万个 star,并于2015年10月被 Red Hat 收购,可见这款开源软件是多么的成功。因此掌握 Ansible 可说是一件很有用也比较保值的技能。
起步
Ansible 是用 Python 写的,可以用 Pip 来安装,也可以用系统的包管理工具安装。
然后,可以用 Vagrant 在本地启动一个或多个虚拟机,作为被 Ansible 管理的对象。
我们主要聚焦在 Ansible 的使用上,环境搭建大家根据自己的情况来即可。理论上,最少需要一台安装 ansible 的管理机,一台可以通过 ssh 连接的被管理机。
假设我有一台被管理机,IP 是 192.168.0.11,SSH 密钥免密码登录已经配好,那么创建一个 hosts.ini 文件
[example]
192.168.0.11
接下来就可以通过 Ansible 来管理该设备了。
# 指定 hosts.ini 文件里的 example 设备,使用 ansible 提供的 ping 模块
$ ansible -i hosts.ini example -m ping
# 指定 hosts.ini 文件里的 example 设备,执行命令 free -h
$ ansible -i hosts.ini example -a "free -h"
$ ansible -i hosts.ini example -a "date"
$ ansible -i hosts.ini example -a "hostname"
$ ansible -i hosts.ini example -a "df -h"
$ ansible -i hosts.ini example -a "tail -10 /var/log/abc.log"
......
Ansible 内置了大量的模块来满足用户需求,我们可以查询官方文档,多做尝试来熟悉,有利于之后写复杂的playbook。
# 拷贝本地文件到远程
$ ansible -i hosts.ini example -b -m copy -a "src=/etc/hosts dest=/tmp/hosts"
# 从远程拷贝文件到本地
$ ansible -i hosts.ini example -b -m fetch -a "src=/etc/hosts dest=/tmp"
# 删除远程文件
$ ansible -i hosts.ini example -b -m file -a "name=/tmp/hosts state=absent"
# 创建目录
$ ansible -i hosts.ini example -b -m file -a "dest=/tmp/test mode=644 state=directory"
# 删除目录
$ ansible -i hosts.ini example -b -m file -a "dest=/tmp/test state=absent"
如果要执行一些复杂的 shell 命令,需要用 Ansible 提供的 shell 模块
$ ansible -i hosts.ini example -b -m shell -a "tail /var/log/messages | grep warn | wc -l"
Playbook
playbook 是 Ansible 的抽象概念,可以理解为一组任务的集合,通过 ansible-playbook 命令执行,一次性在目标设备执行批量操作。
假设我们要在目标机器安装 chrony 软件做时间同步,只需要在本地创建 playbook 文件, 比如 playbook-chrony.yml ,然后定义好相应的任务
---
- hosts: example
become: yes
tasks:
- name: Ensure chrony is installed
yum:
name: chrony
state: present
- name: Ensure chrony is running
service:
name: chronyd
state: started
enabled: yes
执行 ansible-playbook 让 playbook 生效
$ ansible-playbook -i hosts.ini playbook-chrony.yml
该 playbook 共包含两个 task,其实也可以用模块的方式来达到相同效果
$ ansible -i hosts.ini example -m yum -a "name=chrony state=present"
$ ansible -i hosts.ini example -m service -a "name=chronyd state=started enabled=yes"
简单说,ansible -a / ansible -m 用于执行单个命令,查询问题时较常使用。ansible-playbook 用于执行多个命令,部署和配置时较常使用。
配置
Ansible 默认读取 /etc/ansible/ansible.cfg 等配置文件,可以在当前目录创建 ansible.cfg 覆盖默认配置
[defaults]
inventory = hosts.ini
nocows = 1
上面的配置指定了 inventory 文件,这样就不用每次执行时指定了,前面我们测试的几个命令就可以简化
$ ansible example -m ping
$ ansible example -a "free -h"
$ ansible-playbook playbook-chrony.yml
起步阶段掌握一些基础操作,就可以完成一些日常工作了。如果要维护大量不同角色的设备,就需要掌握工程化方法,更多细节我们留待后续讨论。