Ansible基础:(一)Ansible工具简介

admin 2022年09月18日 738次浏览

ansible 是一个自动化运维工具,基于 Python 开发,集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能

1、ansible特性

  • 模块化:调用特定模块,完成特定任务

    三个关键模块:paramiko、pyYAML、jinja2

  • 支持自定义模块,可以使用任何编程语言编写模块

  • 基于 python 语言实现

  • 部署简单,基于 python 和 SSH,agentless,无需代理不依赖 PKI(无需ssl)

  • 安全,基于 OpenSSH

  • 幂等性:一个任务执行1次和执行多次的效果一样,不会因为重复执行带来意外情况

  • 支持 playbook 编排任务,使用 YAML 格式编排任务,支持丰富的数据结构

  • 较强大的多层解决方案 role

2、ansible架构

2.1、ansible组成

  • INVENTORY
    ansible 管理主机的清单,其路径为:/etc/ansible/hosts

  • MODULES
    ansible 执行命令的功能模块,多数为内置的核心模块,也可以自定义

  • PLUGINS
    模块功能的补充,如链接类型的补充、循环插件、变量插件、过滤插件等(该功能不常用)

  • API
    供第三方程序调用的应用程序编程接口

2.2、ansible命令执行来源

  • USER (普通用户)
  • PLAYBOOKS:任务剧本,编排定义 ansible 任务集的配置文件,由 ansible 顺序依次执行,通常是 JSON 格式的 YAML 文件
  • CMDB(配置管理数据库)API调用
  • PUBLIC / PRIVATE CLOUD API 调用
  • 执行顺序:USER —> ansible playbooks —> ansible

3、ansible 安装与入门

3.1、ansible 安装

  • CentOS

    CentOS 安装 ansible 需要先安装 EPEL 源

    $ sudo yum install epel-release
    $ sudo yum install ansible
    
  • Ubuntu

    Ubuntu 需要配置 PPA 然后才能安装 ansible

    $ sudo apt update
    $ sudo apt install software-properties-common
    $ sudo add-apt-repository --yes --update ppa:ansible/ansible
    $ sudo apt install ansible
    
  • 验证安装

    $ ansible --version
    ansible 2.9.27
      config file = /etc/ansible/ansible.cfg
      configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
      ansible python module location = /usr/lib/python2.7/site-packages/ansible
      executable location = /usr/bin/ansible
      python version = 2.7.5 (default, Jun 28 2022, 15:30:04) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
    

3.2、ansible 相关文件

3.2.1、配置文件

  • /etc/ansible/ansible.cfg
    主配置文件,配置 ansible 的工作特性,一般不需要修改
  • /etc/ansible/hosts
    主机清单
  • /etc/ansible/roles
    存放角色的目录

3.2.2、ansible主配置文件

ansible 主配置文件为:/etc/ansible/ansible.cfg,该配置文件中的配置项绝大部分无需修改,使用默认配置即可,下表为部分默认配置

命令 功能 默认值
inventory 主机列表配置文件 /etc/ansible/hosts
library 库文件存放目录 /usr/share/my_modules/
remote_tmp 远程临时目录 ~/.ansible/tmp
local_tmp 本地临时目录 ~/.ansible/tmp
forks 并发数 5
sudo_user 默认sudo用户 root
ask_sudo_pass 每次执行ansible命令时 ,是否询问SSH密码 True
ask_pass 同上 True
remote_port 远程SSH端口 22
host_key_checking 检查对应服务器的host_key(一般需要取消) False
log_path 日志文件 /var/log/ansible.log
module_name 默认模块,可修改为shell command

3.2.3、inventory主机清单

ansible 的主要功能时用于批量主机的操作,为了更便捷的使用其中部分主机,可以在 inventory 文件中将其分组命名。默认的 inventory 文件为:/etc/ansible/hosts,inventory 文件可以有多个,可以使用 Dynamic inventory 来动态生成

  • 主机清单文件格式

    inventory 文件遵循 ini 文件风格,中括号中的字符为组名,可以将同一个主机归并到不同的分组中,如果目标主机使用非默认 SSH 端口,可以在主机 IP 或名称后面使用冒号加端口来说明,如果主机名称遵循相似的命名模式,也可以使用列表的方式来标识各主机

    [webservers]
    # 同时指定多台主机
    192.168.137.[121:128]
    
    # 指定主机端口
    [rcoky]
    192.168.137.130:2020
    
    [omv]
    192.168.137.152
    

3.3、ansible相关工具简介

  • ansible: 主程序,用于临时命令的执行

  • ansible-pull: 远程执行命令的工具

  • ansible-doc: 配置文档、模块功能查看工具

  • ansible-config: 查看配置文件

  • ansible-playbook: 定制自动化任务,编排剧本

  • ansible-vault: 文件加密、解密工具

  • ansible-console: 基于 console 界面与用户交互的执行工具

  • ansible-galaxy: 从官方平台下载 Roles

3.3.1、使用ansible管理设备的方式

  • Ad-Hoc

    利用 ansible 命令直接执行命令,常用于临时命令的执行

  • ansible-playbook

    主要用于需要重复执行的工作或大型项目

3.3.2、ansible

此工具通过 SSH 协议实现对远程主机的配置管理、应用部署、任务执行等功能。在使用该工具前,建议先配置 RSA 认证

  • 语法

    ansible <主机> [选项] [-a 参数]
    

    常用选项

    • –version:显示版本
    • -m module:指定模块,默认为 command
    • -v:显示详细信息(-vv,-vvv 显示更详细信息)
    • –list-hosts:显示主机列表
    • -K,–ask-pass:提示输入 SSH 密码,默认使用 key 验证
    • -C,–check:第一次登录客户机,只检查,不做任何修改
    • -T,–timeout ‘TIMEOUT’:执行命令的超时时间
    • -u,–user ‘REMOTE_USER’:远程执行命令的用户
  • 示例

     ansible all -m ping
    
  • 逻辑关系符与正则表达式

    <主机>支持通配符和逻辑关系符及正则表达式

    • * 通配符

      ansible "*" -m ping
      ansible 192.168.1.* -m ping
      ansible "*server" -m ping
      
    • 逻辑或

      ansible "webserver:dbserver" -m ping
      ansible "192.168.1.10:192.168.10.20" -m ping
      
    • 逻辑与

      # 在webserver且在dbserver中的主机
      ansible "webserver:&dbserver" -m ping
      
    • 逻辑非

      # 在webserver中,但不在dbserver中的主机
      ansible 'webserver:!dbserver' -m ping
      
    • 综合逻辑

      ansible 'appserver:webserver:&dbserver:!ftpserver' -m ping
      
    • 正则表达式

      ansible "~(web|db)server" -m ping
      
  • ansible命令执行过程

    • 加载自己的配置文件
    • 加载自己对应的模块文件
    • 通过 ansible 将模块或命令生成对应的临时 python 文件,并将该文件传输到被管理主机对应执行用户 $HOME/.ansible/tmp/ansible-tmp-数字/xxx.py文件
    • 给文件添加执行权限
    • 执行并返回结果
    • 删除临时 python 文件,并退出

3.3.3、ansible-doc

该工具用于显示模块的帮助信息

  • 语法

    ansible-doc [选项] [模块]
    

    常用选项

    • -l,–list:列出可用模块
    • -s,–snippet:显示指定模块的playbook片段
  • 示例

    # 查看所有模块
    ansible-doc -l
    
    #查看指定模块帮助
    ansible-doc ping
    ansible-doc -s ping
    

3.3.4、ansible-galaxy

该工具用于从 https://galaxy.ansible.com/ 下载相应的 roles

# 查看已安装的galaxy
ansible-galaxy list

# 安装galaxy
ansible-galaxy install fedora.linux_system_roles

# 卸载galaxy
ansible-galaxy remove fedora.linux_system_roles

3.3.5、ansible-playbook

该工具用于执行编写好的 playbook 任务,其语法为 ansible-playbook YAML_FILE

  • 示例

    # 创建hello.yml文件
    [root@ansible ~]# vim hello.yml
    - hosts: host_g2
      remote_user: root
      tasks:
        - name: hello word
          command: /usr/bin/wall hello word
          
    # 执行剧本
    [root@ansible ~]# ansible-playbook hello.yml
    

3.3.6、ansible-vault

该工具用于加密、解密 yml 文件

  • 语法

    ansible-vault [create | decrypt | edit | view | encrypt | rekey] YAML_FILE
    
  • 示例

    • 源文件

      - hosts: host_g2
        remote_user: root
        tasks:
          - name: hello word
            command: /usr/bin/wall hello word
      
    • 加密、解密操作

      # 加密文件
      ansible-vault encrypt hello.yml
      # 解密文件
      ansible-vault decrypt hello.yml
      # 修改加密口令
      ansible-vault rekey hello.yml
      # 创建带加密的新文件
      ansible-vault create hello.yml
      # 编辑加密文件内容
      ansible-vault edit hello.yml
      # 查看加密文件内容
      ansible-vault view hello.yml
      

3.3.7、ansible-console

该工具可以用于交互式执行命令

  • 提示符格式说明

    执行 ansible-console 命令后,将出现 “root@all (4)[f:5]$” 提示符,其含义是:

    • root:当前执行命令的用户
    • all:所有主机
    • (4):当前分组包含四台主机
    • [f:5]:并发数为5
  • 常用子命令

    • forks:设置并发数
    • cd:切换分组
    • list:查看当前分组主机列表
  • 示例

    [root@ansible ~]# ansible-console
    Welcome to the ansible console.
    Type help or ? to list commands.
    
    # 所有分组中的主机
    root@all (3)[f:5]$ list
    192.168.1.12
    192.168.1.11
    192.168.1.13
    
    # 切换分组
    root@all (3)[f:5]$ cd host_g2
    
    # 查看分组中的主机
    root@host_g2 (2)[f:5]$ list
    192.168.1.11
    192.168.1.13
    
    # 修改并发数
    root@host_g2 (2)[f:5]$ forks 10
    root@host_g2 (2)[f:10]$