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

起步阶段掌握一些基础操作,就可以完成一些日常工作了。如果要维护大量不同角色的设备,就需要掌握工程化方法,更多细节我们留待后续讨论。

© 2017 - 2023 · 记事本 · Theme Simpleness Powered by Hugo ·