码农行者 码农行者
首页
  • Python

    • 语言特性
    • Django相关
    • Tornado
    • Celery
  • Golang

    • golang学习笔记
    • 对比python学习go
    • 模块学习
  • JavaScript

    • Javascript
  • 数据结构预算法笔记
  • ATS
  • Mongodb
  • Git
云原生
运维
垃圾佬的快乐
  • 数据库
  • 机器学习
  • 杂谈
  • 面试
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

DeanWu

软件工程师
首页
  • Python

    • 语言特性
    • Django相关
    • Tornado
    • Celery
  • Golang

    • golang学习笔记
    • 对比python学习go
    • 模块学习
  • JavaScript

    • Javascript
  • 数据结构预算法笔记
  • ATS
  • Mongodb
  • Git
云原生
运维
垃圾佬的快乐
  • 数据库
  • 机器学习
  • 杂谈
  • 面试
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Ansible 快速入门

    • Ansible的介绍
      • 特点
      • 重要概念
      • 变量
      • 变量作用域
      • 变量使用
    • Ansible 应用
      • 命令行方式
      • playbook 方式(yaml配置文件)
      • 使用 Role(角色)
    • 更多文档
    • 运维
    • ansible
    DeanWu
    2021-02-09
    目录

    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。

    • 官方文档:配置文件字段详解 (opens new window)

    被控机

    在 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个模块。还可以自定义模块。

    • 官方文档:可用模块列表 (opens new window)

    任务(Tasks)

    ansible 执行的任务单元。

    剧本(Playbooks)

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

    • 官方文档:编写playbook的技巧 (opens new window)

    ansible

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

    Plugins

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

    • 官方文档:插件列表 (opens new window)

    API

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

    • API 文档: ansible runner (opens new window)

    # 变量

    清单文件中的变量:

    [all:vars]
    foo1=bar
    foo2=bar2
    
    [group1]
    host1
    host2
    
    [group1:vars]
    foo3=bar3
    PlayBook
    
    1
    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
    
    1
    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"
            ......
    }
    
    1
    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"
    
    1
    2
    3

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

    server {
      server_name {{ server_name }};
      listen 80;
      
      location / {
        try_files $uri $uri/ /index.html;
      }
    }
    
    1
    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
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    # Ansible 应用

    # 命令行方式

    ansible [pattern] -m [module] -a "[module options]"
    
    1
    • pattern 匹配主机的模式
    • -m 指定调用的模块
    • -a 模块需要的参数

    更多参考官方文档 (opens new window)

    # playbook 方式(yaml配置文件)

    ansible-playbook <playbook name>.yml 
    
    1
    • 一个完整的playbook,一般包括三部分:基本信息和变量、task列表、handlers列表;
    • 每个 task 的目标在于执行一个 moudle,通常是带有特定的参数来执行,在参数中可以使用变量;
    • 每一个 task 必须有一个名称 name,这样在运行 playbook 时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个 task 的。
    • module 格式为 module: options;

    更多参考官方文档 (opens new window)

    ---
    - 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
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    运行如下命令执行:

    ansible-playbook test.yaml 
    
    1

    # 使用 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
    
    1
    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
    
    1
    2
    3
    4
    5
    6

    角色文件的寻找目录:

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

    运行如下命令执行:

    ansible-playbook nginx.yaml 
    
    1

    # 更多文档

    • 朱双印ansible 系列文章 (opens new window)
    • ansible 最佳实践 (opens new window)
    #ansible
    上次更新: 2023/03/28, 16:27:19
    最近更新
    01
    chromebox/chromebook 刷bios步骤
    03-01
    02
    redis 集群介绍
    11-28
    03
    go语法题二
    10-09
    更多文章>
    Theme by Vdoing | Copyright © 2015-2024 DeanWu | 遵循CC 4.0 BY-SA版权协议
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式