Ansible自动化运维|第1章:简介

  • 原创
  • Madman
  • /
  • /
  • 0
  • 1090 次阅读

ansible-min.png

Synopsis: Ansible 是使用了 Python 作为开发语言,简单易用、功能强大的自动化运维管理工具,可以出色地完成配置管理、应用部署、任务编排等多方面工作。与 Puppet、Saltstack 等其它自动化产品相比较,Ansible 无需在远程服务器上安装 agent 客户端代理,它只依赖 SSH 连接,而且它的学习曲线非常低

1. 架构

文档: https://docs.ansible.com/

Ansible 基于 Python 语言所开发,使用 Paramiko 来实现 SSH 连接,使用 PyYAML 来解析 YAML 格式的 playbook 文件,并使用 Jinja2 作为模板引擎来生成模板文件

Ansible 由控制节点和远程受管节点组成,控制节点 是用来安装 Ansible 软件、执行维护命令的服务器( 控制节点不支持 Windows),受管节点是运行业务服务的服务器,由控制节点通过 SSH 来进行管理,受管节点可以是 Linux、OS X、类 Unix、Windows 等主机,或者 Cisco 等网络设备或负载均衡器

1.1 主要组件

Ansible-Architechture.png

各组件的详细说明请参考: https://docs.ansible.com/ansible/latest/dev_guide/overview_architecture.html

  • Host Inventory: 定义了 Ansible 能够管理的远程主机资源清单,默认为 /etc/ansible/hosts 文件。也可以编写一个 inventory plugin 来连接到任何返回 JSON 的数据源(比如你的 CMDB)
  • Modules: Ansible 执行命令的功能模块,包括内置核心模块或用户自定义模块
  • Plugins: 功能模块的补充,比如上面的 inventory plugin,或者提供转换数据、记录输出、日志记录等附加功能。插件只能使用 Python 编写
  • API: 提供给第三方应用调用的接口

1.2 特性

  • 模块化: Ansible 依靠 模块(Modules) 来实现批量部署,模块就是实现了指定功能的 Python 脚本程序,通过 SFTP 或 SCP 拷贝到远程受管节点的临时目录中,执行后(返回 JSON 数据)会被删除。Ansible 内置了大量的模块,使用它们可以完成软件包安装、重启服务、拷贝配置文件等诸多操作
  • 支持自定义模块: 由于模块支持可插拔,所以你也可以开发自己的模块来扩展它的功能,可以使用任何能够返回 JSON 数据的语言(比如 Python、Ruby、Shell 等)来编写专用模块
  • 部署简单: 基于 Python 和 SSH,无需代理客户端(agentless),很多 Linux 发行版默认已安装了 Python 和 OpenSSH
  • 安全性: 基于 OpenSSH
  • 支持任务编排: 通过 playbook 来描述任务(使用非常简单的 YAML 语言)
  • 幂等性(idempotent): 一个任务执行 1 遍和执行 n 遍的结果是一样的,不会因为重复执行带来意外情况

2. 安装

目前 Ansible 可以从安装了 Python 2(2.7 版)或 Python 3(3.5 及更高版本)的任何机器上运行,注意: 控制节点不支持 Windows

[root@CentOS ~]# cat /etc/yum.repos.d/ansible.repo
[ansible-el7]
name=Ansible noarch packages
baseurl=https://releases.ansible.com/ansible/rpm/release/epel-7-x86_64/
enabled=1
gpgcheck=0

[root@CentOS ~]# yum -y install ansible

[root@CentOS ~]# ansible --version
ansible 2.8.2
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Nov  6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]

2.1 配置文件

👑 /etc/ansible/ansible.cfg: 主配置文件

[root@CentOS ~]# cat /etc/ansible/ansible.cfg 
# config file for ansible -- https://ansible.com/
# ===============================================

# nearly all parameters can be overridden in ansible-playbook
# or with command line flags. ansible will read ANSIBLE_CONFIG,
# ansible.cfg in the current working directory, .ansible.cfg in
# the home directory or /etc/ansible/ansible.cfg, whichever it
# finds first

[defaults]

# some basic default values...

#inventory      = /etc/ansible/hosts
#library        = /usr/share/my_modules/
#module_utils   = /usr/share/my_module_utils/
#remote_tmp     = ~/.ansible/tmp
#local_tmp      = ~/.ansible/tmp
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
#forks          = 5
#poll_interval  = 15
#sudo_user      = root
#ask_sudo_pass = True
#ask_pass      = True
#transport      = smart
#remote_port    = 22
#module_lang    = C
#module_set_locale = False

...

🚀 /etc/ansible/hosts: 默认用来保存远程受管节点的清单文件

Ansible 使用的第一步必须提供受管节点的 主机清单(Host Inventory),默认为 /etc/ansible/hosts ,它是 INI 格式的配置文件,其注释信息写的很详细,我们可以参照示例来提供主机 IP、主机名,还可以将主机分组等(当然,你也可以创建新的主机清单文件,后续通过 ansible -i INVENTORY 指定新主机清单文件即可)。假设我们的受管节点有三个,在此文件末尾添加:

[webservers]
192.168.40.121
192.168.40.122

[dbservers]
192.168.40.122
192.168.40.123

同一个主机可以同时属于不同的主机组,如果主机使用的 SSH 端口并非默认的 22,可以在主机名或 IP 的后面添加 : 和端口号,比如 192.168.40.123:26789

💖 /etc/ansible/roles/: 角色(role)目录

2.2 常用命令

(1) ansible

ansible 命令是 Ansible 的主程序,用来执行 Ad-Hoc 临时命令,可参考章节 3.1。它的常用选项如下:

[root@CentOS ~]# ansible -h
Usage: ansible <host-pattern> [options]

Define and run a single task 'playbook' against a set of hosts

Options:
  -m MODULE_NAME, --module-name=MODULE_NAME
                        module name to execute (default=command)
  -a MODULE_ARGS, --args=MODULE_ARGS
                        module arguments
  -C, --check           don't make any changes; instead, try to predict some
                        of the changes that may occur
  -k, --ask-pass        ask for connection password
  -K, --ask-become-pass
                        ask for privilege escalation password
  -u REMOTE_USER, --user=REMOTE_USER
                        connect as this user (default=None)
  -b, --become          run operations with become (does not imply password
                        prompting)
  -i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY
                        specify inventory host path or comma separated host
                        list. --inventory-file is deprecated
  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable
                        connection debugging)

其中 <host-pattern> 支持如下几种模式来匹配受管节点列表:

  • all: 表示 主机清单(Host Inventory) 中的所有主机
  • *: 通配符,比如 *192.168.40.12**servers
  • :: 或关系,比如 192.168.40.121:192.168.40.122webservers:dbservers
  • :&: 与关系,比如 webservers:&dbservers 表示在 webservers 组中且在 dbservers 组中,即 192.168.40.122 主机
  • :!: 非关系,比如 webservers:!dbservers 表示在 webservers 组中但不在 dbservers 组中,即 192.168.40.121 主机
  • 可以组合上述关系,或者使用正则表达式

(2) ansible-doc

ansible-doc 命令可以用来查看 模块 的帮助文档

1. 列出所有的内置模块
[root@CentOS ~]# ansible-doc -l
[root@CentOS ~]# ansible-doc -l | wc -l

2. 查看指定模块的帮助文档
[root@CentOS ~]# ansible-doc shell

3. 仅显示指定模块的选项参数在 playbook 中的示例用法
[root@CentOS ~]# ansible-doc -s shell

(3) ansible-galaxy

ansible-galaxy 命令会到 https://galaxy.ansible.com/ 去上传或下载 role,类似于 Docker 的镜像仓库

1. 安装 geerlingguy 用户所上传的 docker 这个角色
[root@CentOS ~]# ansible-galaxy install geerlingguy.docker
- downloading role 'docker', owned by geerlingguy
- downloading role from https://github.com/geerlingguy/ansible-role-docker/archive/2.5.2.tar.gz
- extracting geerlingguy.docker to /root/.ansible/roles/geerlingguy.docker
- geerlingguy.docker (2.5.2) was installed successfully

2. 查看下载的 role 文件结构
[root@CentOS ~]# tree /root/.ansible/roles/geerlingguy.docker
/root/.ansible/roles/geerlingguy.docker
├── defaults
│   └── main.yml
├── handlers
│   └── main.yml
├── LICENSE
├── meta
│   └── main.yml
├── molecule
│   └── default
│       ├── molecule.yml
│       ├── playbook.yml
│       └── yaml-lint.yml
├── README.md
├── tasks
│   ├── docker-1809-shim.yml
│   ├── docker-compose.yml
│   ├── docker-users.yml
│   ├── main.yml
│   ├── setup-Debian.yml
│   └── setup-RedHat.yml
└── templates
    └── override.conf.j2

7 directories, 15 files

3. 查看已安装的 role 列表
[root@CentOS ~]# ansible-galaxy list
# /root/.ansible/roles
- geerlingguy.docker, 2.5.2
# /etc/ansible/roles
 [WARNING]: - the configured path /usr/share/ansible/roles does not exist.

4. 删除指定 role
[root@CentOS ~]# ansible-galaxy remove geerlingguy.docker
- successfully removed geerlingguy.docker

详情见本系列的第 3 篇博文

未经允许不得转载: LIFE & SHARE - 王颜公子 » Ansible自动化运维|第1章:简介

分享

作者

作者头像

Madman

如需 Linux / Python 相关问题付费解答,请按如下方式联系我

0 条评论

暂时还没有评论.

专题系列