Ansible 快速入门 – 作者:又拍云

Ansible 快速入门

预期读者画像
  • 熟悉 Python 及常见的第三方模块, 如 Flask、Jinja2;
  • 熟悉 Linux, 如 ssh;
  • 熟悉 YAML 语法;
  • 有在多个机器上部署程序的需求;
操作环境

本文在如下环境中测试通过:

  • 本地系统:macOS High Sierra

  • 目标机器系统:Centos 7

  • Python 3.7.3

  • ansible 2.5.4

更多例子

一、Ansible 是什么?

Ansible是一个配置管理和配置工具,它使用SSH连接到服务器并运行配置好的任务,服务器上只需要开启ssh,所有工作都交给client端的ansible负责。
当我们有批量部署的需求时,我们可以自己写脚本,但是更推荐使用 Ansible。使用 Ansible 无需编码只需要配置 yaml 文件即可,并且 Ansible 已经内置了幂等性、并发度控制等功能,大大减少了批量部署时的工作量。
图片[1]-Ansible 快速入门 – 作者:又拍云-安全小百科
Ansible 原理示意图如上,我们需要关注以下 3 点就能掌握 Ansible 的大致原理。第一,hosts 配置文件的作用是告诉 Ansible 你的程序要部署到哪些机器;第二,yaml 文件的作用是告诉 Ansible 在目标机器上执行哪些操作。第三,Ansible 不需要在目标机器上安装客户端,它通过 SSH 把指令和要部署的程序发送到目标机器上。

二、安装 Ansile

安装命令:
python3 -m pip install --user ansible==2.5.4

验证安装是否正确:
ansible --version

三、配置 Ansible

3.1 配置.ansible.cfg文件

.ansible.cfg的路径:~/.ansible.cfg
将以下内容写入.ansible.cfg文件:
[defaults]

# inventory 是声明 hosts 配置文件

inventory=~/.ansible/hosts

3.2 SSH 使用密钥登录服务器

设置 SSH 通过密钥登录。使用 ssh-keygen 命令生成密钥对,把 id_rsa.pub 写入目标服务器的 authorized_keys 文件中。

3.3 编辑 hosts 文件

hosts 配置文件的格式是 ini。示例如下
# serviceA 是集群名称

[serviceA]

# 枚举 serviceA 集群的 ip 地址

192.168.33.10

四、编辑 YAML 文件

告诉 Ansible 在目标机器上执行哪些操作的 YAML 文件,Ansible 把这类文件称为 “playbook”。
下面我们一起编写一个为名 hello.yml 的 playbook。这个 playbook 的作用是把 helloworld 文件发送到 serviceA 集群。
# hosts 是要部署服务的集群

- hosts: serviceA

# remote_user 是以 root 用户登录远程机器

remote_user: root

# vars 是定义一些变量。这些变量可以在接下来的 tasks 中使用。

vars:

src: /Users/yutou/mywork/ansible-playbook

# tasks 是在远程机器上具体的执行动作。

tasks:

# name 是该动作的名称

- name: upload helloworld

# copy 是要具体执行的动作。copy 是 Ansible 模块,它的作用是把本地文件上传到目标机器上去。

# {{ src }} 是 Jinja2 模板语法,Jinja2 模板语法不懂的话可自行百度。

copy: src={{ src }}/helloworld dest=/home

五、发布

ansible-playbook hello.yml

六、Ansible playbook 常用模块

ansible 很多模块都可以做到 “见其名,知其意”,很多模块都是对 Linux 命令的模仿或者封装,更多模块可参见官方文档。下面我们先挑几个模块简单介绍一下:
  • synchronize,copy,unarchive 都可以上传文件。
  • ping:检查指定节点机器是否还能连通。主机如果在线,则回复pong。
  • yum, apt:这两个模块都是在远程系统上安装包的。
  • pip:远程机器上 python 安装包。
  • user,group:用户管理的。
  • service:管理服务的,类似于 centos7 上的 service。
template 模块和在远程机器上执行 Linux 命令的模块是非常重点的模块,所以接下来重点介绍一下。

6.1 template 模块:上传配置文件

配置文件的一个特点是每个机器上的文件都不一样,都需要一些个性化配置,比如 A 机器配置 “hello world”,B 机器配置 “hello Liming”。这种需求就需要 template 模块实现。
template 模块使用 Jinja2 语法对模板文件进行渲染,然后把渲染后的文件上传到目标机器。渲染时用到的变量可以从 3 个地方读取到:
  • ansible 内置变量
  • hosts 文件中定义的变量,如上所示;
  • 在 playbook 中vars定义的变量。
举例,模板文件 hello_x,内容如下:
hello {{ name }}

hosts 文件配置如下:
[serviceA]

192.168.33.10 name=world

192.168.33.11 name=Liming

在 playbook hello_x.yml 中配置如下:
tasks:

- name: upload helloworld

template: src={{ src }}/hello_x dest=/home

执行ansible-playbook hello_x.yml后,192.168.33.10 上/home/hello_x文件的内容就是hello world, 192.168.33.11 上则是hello Liming

6.2 在远程机器上执行 Linux 命令

raw, command,shell 这三个模块都以用来在远程机器上执行 Linux 命令。三种区别大致区别如下:
  • 一般情况下使用 command
  • 命令中有特殊字符使用 shell
  • raw 是直接执行原始命令,没有经过模块封装,不建议用。
注意命令的内容一般使用""引起来,否则模板渲染的时候可能报错:
- name: start datanode

command: "/hadoop-2.7.5/sbin/hadoop-daemon.sh start datanode"

来源:freebuf.com 2021-07-14 16:16:19 by: 又拍云

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享