概述
Ansible 是自动化运维工具,基于 Python 开发,实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible 是基于模块(module)和剧本(playbook)工作.
接下来通过以下几个方面来演示 Ansible 的基本使用:
Linux 配置 SSH 免密
安装 Ansible
使用 Ansible 模块
使用 Ansible Playbook
a.安装并启动 NGINX
b.停止并卸载 NGINX
c.配置 NGINX 并重启
实验环境如下:
管理端: (安装 Ansible)
a.系统: Debian
b.IP: 192.168.1.1
远程主机 1 和 2:
a.系统: Ubuntu
b.IP: 192.168.1.106 和 192.168.1.107
备注:
为了方便演示, 以下命令都是基于root
用户
免密配置
即: 基于公钥的登陆
# 1. 创建密钥对(创建后默认位于 ~/.ssh)
ssh-keygen -t ed25519 -C "Login to nginx lab"
# 2. 使用 ssh-copy-id 命令安装公钥
ssh-copy-id -i /root/.ssh/id_ed25519 root@192.168.1.106
ssh-copy-id -i /root/.ssh/id_ed25519 root@192.168.1.107
# 3. 验证免密是否配置成功: (无需输入密码)
ssh root@192.168.1.106 -i /root/.ssh/id_ed25519
ssh root@192.168.1.107 -i /root/.ssh/id_ed25519
复制代码
备注:
免密配置有多种情况会导致失败, 本文不一一列举详细失败原因. 如果失败查看远程主机的日志/var/log/secure
安装 Ansible
APT 安装方式如下: (其他类似, 不一一列举)
apt install -y ansible
# 验证
ansible --version
# 输出如下:
#ansible 2.2.1.0
# config file = /etc/ansible/ansible.cfg
# configured module search path = Default w/o overrides
复制代码
使用 Ansible 模块
引用:
Ansible 附带了许多模块(module 称为“module library”),这些模块可以直接在远程主机上或通过 playbooks 执行。
用户也可以编写自己的模块。这些模块可以控制系统资源,比如服务、包或文件(实际上是任何东西),或者处理执行系统命令。
先对/etc/ansible/hosts
做最基本配置:
[web]
192.168.1.106
192.168.1.107
复制代码
上文的 web 就是一个 host group, 可以直接通过web
进行引用.
ansible-doc
所有的模块的使用方法可以通过以下命令查询:
ansible-doc -s <module_name>
ansible-doc -s ping
# - name: Try to connect to host, verify a usable python and return `pong' on success.
# action: ping
ansible-doc -s command
#- name: Executes a command on a remote node
# action: command
# chdir # cd into this directory before running the command
# creates # a filename or (since 2.0) glob pattern, when it already #exists, this step will *not* be run.
# executable # change the shell used to execute the command. Should be #an absolute path to the executable.
# free_form= # the command module takes a free form command to run. #There is no parameter actually named 'free form'. See the examples!
# removes # a filename or (since 2.0) glob pattern, when it does not #exist, this step will *not* be run.
# warn # if command warnings are on in ansible.cfg, do not warn #about this particular line if set to no/false.
复制代码
使用 Ansible 模块示例
下面以 command 和 ping module 为例:
ansible web -a "pwd chdir=/tmp"
ansible web -m ping
复制代码
输出如下:
# ansible web -a "pwd chdir=/tmp"
192.168.1.106 | SUCCESS | rc=0 >>
/tmp
192.168.1.107 | SUCCESS | rc=0 >>
/tmp
# ansible web -m ping
192.168.1.106 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.1.107 | SUCCESS => {
"changed": false,
"ping": "pong"
}
复制代码
简单说明
1.web
: 在/etc/ansible/hosts
中配置的 web 主机组. 包含本次实验的: 远程主机 1 和 2
2.-a "pwd chdir=/tmp"
: -a MODULE_ARGS
模块的参数.
3.-m ping
: ansible 命令参数 - 模块, 后跟模块名. (默认为 command
). "pong"
表示 ping 成功, 返回不是"pong"
则连接异常
.
使用 Ansible Playbook
Playbook(剧本)是使用 ansible 的一种完全不同的形式,非常强大。
简单地说,playbook 是一个非常简单的配置管理和多机部署系统的基础,不像任何已经存在的系统,它非常适合部署复杂的应用程序。
在 ansible-examples git 仓库中, 有一些完整的 playbook 具体展示了这些技术。建议可以看看。
安装并启动 NGINX
创建安装并启动 NGINX 的 Ansible Playbook YAML 文件: vi nginx_install.yml
---
- hosts: web
become: true
tasks:
- name: install nginx
apt: name=nginx state=latest
- name: start nginx
service:
name: nginx
state: started
复制代码
简单说明:
- hosts: web
: 该 playbook 首先说明应将其应用于 inventory 资源中的web
主机。
become: true
: 告诉 Ansible 提升权限(如 sudo)来执行此 playbook 中的所有任务。
tasks
: 定义实际 tasks(任务)的部分。第一个任务安装 nginx,第二个任务是启动 nginx.
执行:
ansible-playbook nginx_install.yml
复制代码
输出:
PLAY [all] *******************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************
ok: [192.168.1.106]
ok: [192.168.1.107]
TASK [ensure nginx is at the latest version] *********************************************************************
changed: [192.168.1.106]
changed: [192.168.1.107]
PLAY RECAP *******************************************************************************************************
192.168.1.106 : ok=2 changed=1 unreachable=0 failed=0
192.168.1.107 : ok=2 changed=1 unreachable=0 failed=0
复制代码
这时 NGINX 已经安装并启动完毕.
备注:
下面几个小章节的ansible-playbook
执行结果类似, 就不一一贴出来了.
停止并卸载 NGINX
创建停止并卸载 NGINX 的 Ansible Playbook YAML 文件:
vi nginx_uninstall.yml
---
- hosts: web
tasks:
- name: stop nginx
service:
name: nginx
state: stopped
- name: uninstall nginx
apt: name=nginx state=absent
复制代码
再次执行并查看结果.
配置 NGINX 并重启
步骤如下:
1. 创建一个 nginx conf 的模板文件:
vi static_site.conf.tpl
server {
listen 80 default_server;
listen [::]:80 default_server;
root /usr/share/nginx/html;
server_name _;
location / {
index.html index.htm;
}
}
复制代码
2. 把以上文件放到/etc/nginx/sites-available/
3. 在/etc/nginx/sites-enabled/
里创建个软链接指向该文件.
4. 创建一个index.html
页面:
<html>
<head>
<title>Hello ansible</title>
</head>
<body>
<h1>Hello World Ansible</h1>
<p>Running on {{ inventory_hostname }}</p>
</body>
</html>
复制代码
5. 重启 NGINX.
完整 Ansible Playbook
整合之前的安装, 完整的 Ansible Playbook 如下:
vi nginx.yml
---
- hosts: web
vars:
src_root: /tmp
tasks:
- name: install nginx
apt: name=nginx state=latest
- name: start nginx
service:
name: nginx
state: started
become: yes
- name: copy nginx conf
copy:
src: {{ src_root }}/static_site.conf.tpl
dest: /etc/nginx/sites-available/static_site.conf
become: yes
- name: create symlink
file:
src: /etc/nginx/sites-available/static_site.conf
dest: /etc/nginx/sites-enabled/000-default.conf
state: link
become: yes
- name: copy the html
copy:
src: {{ src_root }}/index.html
dest: /usr/share/nginx/html/index.html
notify: restart nginx
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
become: yes
复制代码
再次执行并查看结果.
分别访问:
http://192.168.1.106/
http://192.168.1.107/
查看 NGINX 运行状态.
简单说明:
index.html
页面, 可以通过{{ vars }}
来使用一些变量. 可以使用 ansible 已有的, 也可以使用后续自定义的. 本例中使用的inventory_hostname
为 ansible 自带的变量.
Ansible Playbook - nginx.yml
:
安装
启动
复制 NGINX 配置文件
创建软链接
复制 html 文件
总结
本文通过批量管理 NGINX 这样一个实际案例, 介绍了 Ansible 的基本用法. 你可以在工作中使用类似的语法来创建属于你自己的剧本(playbook)
评论