Ansible 快速入门
Ansible 是自动化运维领域一款常用的服务器集群管理工具,他有丰富的文档和活跃的社区。
与同类型的竞品开源工具SaltStack/Puppet 相比,各有特色。可参考:
- https://www.edureka.co/blog/chef-vs-puppet-vs-ansible-vs-saltstack/
- https://www.educba.com/saltstack-vs-ansible/
本文旨在让读者快速掌握或回顾 Ansible 的一些概念和用法,所以并不会涉及细节的东西。如想进一步掌握,可阅读 Ansible 的官方文档 (opens new window)。
# Ansible的介绍
Ansible是一款简单的运维自动化工具,只需要使用ssh协议连接就可以来进行系统管理,自动化执行命令,部署等任务。
# 特点
- 1、ansible不需要单独安装客户端,也不需要启动任何服务
- 2、ansible是python中的一套完整的自动化执行任务模块
- 3、ansible playbook 采用yaml配置,对于自动化任务执行过程一目了然
- 3、ansible 执行任务时幂等的。
# 重要概念
控制机
安装ansible 的机器,截止目前2.9
,只支持Linux 和 Mac 作为控制机,不支持 Windows。配置文件默认路径/etc/ansible/ansible.cfg
。
被控机
在 ansible hosts 清单里的机器,控制机可ssh 登录。ssh 登录时,可使用用户名密码或私钥公钥登录。
清单(Inventory)
Ansible管理主机的清单,可ip、hostname,可分组控制。默认是 /etc/ansible/hosts
文件,可使用 -i <path>
参数在命令行中指定。
- 配置文件中,清单可以是文件或目录。当是目录的时候,ansible会合并目录中所有的静态清单和动态清单的数据。
- 官方文档:如何构建清单文件 (opens new window)
- 清单理解:Ansible_静态和动态清单文件管理 (opens new window)
集合(Collections)
一种ansible 的分发格式,包含剧本、角色、模块和插件。
模块(Modules)
Ansible执行命令的功能模块,执行代码的基本单元。Ansible2.3版本为止,共有1039个模块。还可以自定义模块。
任务(Tasks)
ansible 执行的任务单元。
剧本(Playbooks)
任务剧本(又称任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,可重复执行,yaml格式。
ansible
是ansible
的命令工具,核心执行工具;一次性或临时执行的操作都是通过该命令执行。
Plugins
插件,模块功能的补充,常有连接类型插件,循环插件,变量插件,过滤插件,插件功能用的较少。
API
提供给第三方程序调用的应用程序编程接口。
# 变量
清单文件中的变量:
[all:vars]
foo1=bar
foo2=bar2
[group1]
host1
host2
[group1:vars]
foo3=bar3
PlayBook
2
3
4
5
6
7
8
9
10
11
Playbook 中的变量:
---
- hosts: all
vars:
http_port: 80
vars_prompt:
- name: service_name
prompt: "Which service do you want to remove?"
private: no
vars_files:
- /vars/external_vars.yml
2
3
4
5
6
7
8
9
10
角色专用变量,一般位于 defaults/main.yml
或者 vars/
目录下。官方文档,角色(Roles) (opens new window)
ansible 内部自定的变量,可以通过下面命令查看:
$ ansible hostname -m setup
{
"ansible_all_ipv4_addresses": [
"REDACTED IP ADDRESS"
],
"ansible_all_ipv6_addresses": [
"REDACTED IPV6 ADDRESS"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "11/28/2013"
......
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 变量作用域
ansible 的变量作用域主要有 3 种:
- Global:ansible 配置文件,环境变量,命令行
- Play:playbook vars, vars_prompt, vars_files; role defaults, vars
- Host: Inventory 中定义的的 host vars; facts
# 变量使用
ansible 允许你在各处通过 jinja2 的语法使用变量。jinja2 是一个用 Python 开发的模版引擎,本身并不复杂,核心东西就 3 个:变量的输出,控制流,过滤器。
需要注意的是,在 Ansible 中如果你要使用 jinja2 的语法去引用一个变量,必须用双引号内使用。
- hosts: all
vars:
deploy_path: "{{ home_dir }}/apps"
2
3
比如我们想根据各种上下文生成 nginx 的配置文件,可以通过 template 命令来渲染。首先定一个模版文件 nginx.conf.j2
server {
server_name {{ server_name }};
listen 80;
location / {
try_files $uri $uri/ /index.html;
}
}
2
3
4
5
6
7
8
我们希望这个配置文件可以覆盖默认的 nginx 配置:
- hosts: nginx
vars:
server_name: gio.com
nginx_user: nginx
nginx_group: "{{ nginx_user }}"
tasks:
- name: generate nginx config file
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
owner: "{{ nginx_user }}"
group: "{{ nginx_group }}"
become: yes
2
3
4
5
6
7
8
9
10
11
12
13
# Ansible 应用
# 命令行方式
ansible [pattern] -m [module] -a "[module options]"
- pattern 匹配主机的模式
-m
指定调用的模块-a
模块需要的参数
# playbook 方式(yaml配置文件)
ansible-playbook <playbook name>.yml
- 一个完整的playbook,一般包括三部分:基本信息和变量、task列表、handlers列表;
- 每个 task 的目标在于执行一个 moudle,通常是带有特定的参数来执行,在参数中可以使用变量;
- 每一个 task 必须有一个名称 name,这样在运行 playbook 时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个 task 的。
- module 格式为
module: options
;
---
- hosts: webservers # 要执行的主机组,多个时逗号分隔,all 为全部
vars: # 自定义变量
http_port: 80
max_clients: 200
remote_user: root # 全局执行用户
tasks: # 任务列表
- name: ensure apache is at the latest version
yum: pkg=httpd state=latest
- name: write the apache config file
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running
service: name=httpd state=started
handlers: # 在发生改变时执行的操作
- name: restart apache
service: name=httpd state=restarted
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
运行如下命令执行:
ansible-playbook test.yaml
# 使用 Role(角色)
统一管理playbook文件,可理解为一个标准的目录规范。可使用如下命令初始化一个角色目录:
ansible-galaxy init roles/role_nginx
整体目录结构如下:
.
├── nginx.yaml # 主调用play文件
└── roles
└── role_nginx
├── defaults # 默认变量存放的目录,文件中定义了此角色使用的默认变量;
│ └── main.yml
├── files # 存放有copy或script等模块调用的文件;
├── handlers # 存放相关触发执行器的目录;
│ └── main.yml
├── meta # 用于存放此角色元数据;
│ └── main.yml
├── README.md
├── tasks # 任务存放的目录;
│ └── main.yml
├── templates # 存放template模块查找所需要的模板文件的目录;
| └── nginx.conf.j2
├── tests
│ ├── inventory
│ └── test.yml
└── vars # 变量存放的目录;
└── main.yml
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
roles 同目录,创建调用 play文件,即可应用整个角色。
---
$ cat nginx.yaml
- hosts: webservers
remote_user: root
roles:
- role: role_nginx
2
3
4
5
6
角色文件的寻找目录:
- play 文件同级目录的role同名目录
- play 文件统计目录的roles 目标下
~/.ansible/roles
用户目录下- ansible.cfg 配置的角色目录下
- /etc/ansible/roles 目录下
- 也可使用绝对路径配置角色
运行如下命令执行:
ansible-playbook nginx.yaml