Ansible 快速入门

Ansible 是自动化运维领域一款常用的服务器集群管理工具,他有丰富的文档和活跃的社区。

与同类型的竞品开源工具SaltStack/Puppet 相比,各有特色。可参考:

本文旨在让读者快速掌握或回顾 Ansible 的一些概念和用法,所以并不会涉及细节的东西。如想进一步掌握,可阅读 Ansible 的官方文档

介绍

Ansible是一款简单的运维自动化工具,只需要使用ssh协议连接就可以来进行系统管理,自动化执行命令,部署等任务。

Ansible的特点

  • 1、ansible不需要单独安装客户端,也不需要启动任何服务
  • 2、ansible是python中的一套完整的自动化执行任务模块
  • 3、ansible playbook 采用yaml配置,对于自动化任务执行过程一目了然
  • 3、ansible 执行任务时幂等的。

Ansible组成结构

控制机

安装ansible 的机器,截止目前2.9,只支持Linux 和 Mac 作为控制机,不支持 Windows。配置文件默认路径/etc/ansible/ansible.cfg

被控机

在 ansible hosts 清单里的机器,控制机可ssh 登录。ssh 登录时,可使用用户名密码或私钥公钥登录。

清单(Inventory)

Ansible管理主机的清单,可ip、hostname,可分组控制。默认是 /etc/ansible/hosts文件,可使用 -i <path> 参数在命令行中指定。

集合(Collections)

一种ansible 的分发格式,包含剧本、角色、模块和插件。

模块(Modules)

Ansible执行命令的功能模块,执行代码的基本单元。Ansible2.3版本为止,共有1039个模块。还可以自定义模块。

任务(Tasks)

ansible 执行的任务单元。

剧本(Playbooks)

任务剧本(又称任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,可重复执行,yaml格式。

ansible

ansible的命令工具,核心执行工具;一次性或临时执行的操作都是通过该命令执行。

Plugins

插件,模块功能的补充,常有连接类型插件,循环插件,变量插件,过滤插件,插件功能用的较少。

API

提供给第三方程序调用的应用程序编程接口。

Ansible 基本概念

变量

清单文件中的变量:

[all:vars]
foo1=bar
foo2=bar2

[group1]
host1
host2

[group1:vars]
foo3=bar3
PlayBook

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

角色专用变量,一般位于 defaults/mian.yml 或者 vars/ 目录下。官方文档,角色(Roles)

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"
        ......
}

变量作用域

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"

比如我们想根据各种上下文生成 nginx 的配置文件,可以通过 template 命令来渲染。首先定一个模版文件 nginx.conf.j2

server {
  server_name {{ server_name }};
  listen 80;
  
  location / {
    try_files $uri $uri/ /index.html;
  }
}

我们希望这个配置文件可以覆盖默认的 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

角色

统一管理playbook文件,可理解为一个标准的目录规范。可使用如下命令初始化一个角色目录:

ansible-galaxy init roles/role_nginx

└── role_nginx
    ├── defaults
    │   └── main.yml
    ├── files
    ├── handlers
    │   └── main.yml
    ├── meta
    │   └── main.yml
    ├── README.md
    ├── tasks
    │   └── main.yml
    ├── templates
    ├── tests
    │   ├── inventory
    │   └── test.yml
    └── vars
        └── main.yml

roles 同目录,创建调用play文件,即可应用整个角色。

---
# this playbook deploy the whole application stack in this site
- name: configuration and deploy webservers and application code
  hosts: webservers
  
  roles:
    - role_nginx

角色文件的寻找目录:

  • play 文件同级目录的role同名目录
  • play 文件统计目录的roles 目标下
  • ~/.ansible/roles 用户目录下
  • ansible.cfg 配置的角色目录下
  • /etc/ansible/roles 目录下
  • 也可使用绝对路径配置角色

使用指南

命令行方式

ansible [pattern] -m [module] -a "[module options]"
  • pattern 匹配主机的模式
  • -m 指定调用的模块
  • -a 模块需要的参数
  • 其他参数文档,官方文档

playbook 方式(yaml配置文件)

ansible-playbook <playbook name>.yml 
# test.yaml
- hosts: all
  tasks:
    - name: install vim
      yum:
        name: vim
        state: present

    - name: install jdk
      yum:
        name: openjdk
        state: present

运行如下命令执行:

ansible-playbook test.yaml 

更多文档