基本概述

Ansible是一个配置管理系统configuration management system 基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远
程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。

Ansible能做什么

ansible可以帮助我们完成一些批量任务,或者完成一些需要经常重复的工作。
比如:同时再100台服务器上安装nginx服务,并在安装后启动服务。
比如:将某个文件一次性拷贝到100台服务器上。
比如:每当有新服务器加入工作环境时,你都要为新服务器部署某个服务,也就是说你需要经常重复的完成相同的工作。
这些场景中都可以使用到ansible。

Ansible软件的特点

1.ansible不需要单独安装客户端,ssh相当于ansible客户端。
2.ansible不需要启动任何服务,仅需要安装对应工具即可。
3.ansible依赖大量的python模块来实现批量管理。
4.ansible配置文件/etc/ansible.cfg
5.有大量常规运维操作模块,可实现日常绝大部分操作;
6.通过Playbooks来定制强大的配置、状态管理;

Ansible基础架构

1.连接插件(connector plugins)用于连接主机用来连接被管理端
2.核心模块(core modules)连接主机实现操作,它依赖于具体的模块来做具体的事情
3.自定义模块(custom modules)根据自己的需求编写具体的模块
4.插件(plugins)完成模块功能补充
5.剧本(playbooks)ansible的配置文件,将多个任务定义在剧本中,有ansible自动执行
6.主机清单(host inventory)定义ansible需要操作主机的范围

最重要的一点是ansible是模块化的 它所有的操作都依赖与模块

Ansible架构

m_b7ebb60ae48f848ddf6ca22f4d350050_r

ansible任务执行

ansible 任务执行模式

  Ansible 系统由控制主机对被管节点的操作方式可分为两类,即ad-hocplaybook

  • ad-hoc模式(点对点模式)
      使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。
  • playbook模式(剧本模式)
      是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。

ansible 执行流程

  简单理解就是Ansible在运行时, 首先读取ansible.cfg中的配置, 根据规则获取Inventory中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。

ansible 命令执行过程

  1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
  2. 查找对应的主机配置文件,找到要执行的主机或者组;
  3. 加载自己对应的模块文件,如 command;
  4. 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
  5. 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
  6. 给文件 +x 执行权限;
  7. 执行并返回结果;
  8. 删除临时py文件,sleep 0退出;

ansible 配置

主机名IP角色
node01192.168.10.240管理端
node02192.168.10.241受控端
node03192.168.10.242受控端
node04192.168.10.243受控端

1. Ansible借助公钥批量管理

利用非交换工具实现批量分发公钥与批量管理服务器

[[email protected] ~]# yum install sshpass -y
[[email protected] ~]# ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ""
[[email protected] ~]# sshpass -p123456 ssh-copy-id -i .ssh/id_dsa.pub -o StrictHostKeyChecking=no [email protected]
[[email protected] ~]# sshpass -p123456 ssh-copy-id -i .ssh/id_dsa.pub -o StrictHostKeyChecking=no [email protected]
[[email protected] ~]# sshpass -p123456 ssh-copy-id -i .ssh/id_dsa.pub -o StrictHostKeyChecking=no [email protected]
[[email protected] ~]# sshpass -p123456 ssh-copy-id -i .ssh/id_dsa.pub -o StrictHostKeyChecking=no [email protected]

实现从管理机node1到其他机器的秘钥认证

2. 安装Ansible

ansible 安装方式

  ansible安装常用两种方式,yum安装pip程序安装

使用 pip(python的包管理模块)安装

  首先,我们需要安装一个python-pip包,安装完成以后,则直接使用pip命令来安装我们的包,具体操作过程如下:

    yum install python-pip -y
    pip install ansible

使用 yum 安装

  yum 安装是我们很熟悉的安装方式了。我们需要先安装一个epel-release包,然后再安装我们的 ansible 即可。

    yum install epel-release -y
    yum install ansible –y

检查ansible版本

[[email protected] ~]# ansible --version
ansible 2.9.10
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/home/bes/.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, Apr 2 2020, 13:16:51) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]

ansible 程序结构

安装目录如下(yum安装):
  配置文件目录:/etc/ansible/
  执行文件目录:/usr/bin/
  Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/
  Help文档目录:/usr/share/doc/ansible-X.X.X/
  Man文档目录:/usr/share/man/man1/

ansible配置文件查找顺序

  ansible与我们其他的服务在这一点上有很大不同,这里的配置文件查找是从多个地方找的,顺序如下:

  1. 检查环境变量ANSIBLE_CONFIG指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg);
  2. ~/.ansible.cfg,检查当前目录下的ansible.cfg配置文件;
  3. /etc/ansible.cfg检查etc目录的配置文件。

3. 配置ansible主机清单

主机清单配置文件/etc/ansible/hosts

cat >>/etc/ansible/hosts<<EOD
[test]
192.168.10.241
192.168.10.242
192.168.10.243
EOD

4. 验证ansible

[[email protected] ~]# ansible test -m ping
192.168.10.243 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.10.242 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.10.241 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

ansible命令

1. ansible命令语法

ansibletest-mcommand-a"hostname"
命令主机组模块名指定模块参数模块名称指定利用模块执行的动作参数批量执行操作命令
2[[email protected] ~]# ansible test -m command -a 'hostname'
192.168.10.243 | CHANGED | rc=0 >>
linux-node4.com

192.168.10.242 | CHANGED | rc=0 >>
linux-node3.com

192.168.10.241 | CHANGED | rc=0 >>
linux-node2.com
[[email protected] ~]# ansible test -m shell -a "ls -l /etc/hosts"
192.168.10.242 | CHANGED | rc=0 >>
-rw-r--r--. 1 root root 158 Jun  7  2020 /etc/hosts

192.168.10.243 | CHANGED | rc=0 >>
-rw-r--r--. 1 root root 158 Jun  7  2020 /etc/hosts

192.168.10.241 | CHANGED | rc=0 >>
-rw-r--r--. 1 root root 158 Jun  7  2020 /etc/hosts
# 错误演示,ansible不支持命令别名
[[email protected] ~]# ansible test -m command -a "ll /etc/hosts"
192.168.10.243 | FAILED | rc=2 >>
[Errno 2] No such file or directory

192.168.10.241 | FAILED | rc=2 >>
[Errno 2] No such file or directory

192.168.10.242 | FAILED | rc=2 >>
[Errno 2] No such file or directory
# ansible中command与shell对比。结论:command不支持管道,shell支持,记住shell模块就好了
[[email protected] ~]# ansible test -m command -a "df -h | grep /$"
192.168.10.242 | FAILED | rc=1 >>
df: ‘|’: No such file or directory
df: ‘grep’: No such file or directory
df: ‘/$’: No such file or directorynon-zero return code

192.168.10.243 | FAILED | rc=1 >>
df: ‘|’: No such file or directory
df: ‘grep’: No such file or directory
df: ‘/$’: No such file or directorynon-zero return code

192.168.10.241 | FAILED | rc=1 >>
df: ‘|’: No such file or directory
df: ‘grep’: No such file or directory
df: ‘/$’: No such file or directorynon-zero return code

[[email protected] ~]# ansible test -m shell -a "df -h | grep /$"
192.168.10.243 | CHANGED | rc=0 >>
/dev/sda3        500G  10G   100G  2% /

192.168.10.241 | CHANGED | rc=0 >>
/dev/sda3        500G  10G   100G  2% /

192.168.10.242 | CHANGED | rc=0 >>
/dev/sda3        500G  10G   100G  2% /

2. ansible 常用命令

ansible 命令集

/usr/bin/ansible  Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
/usr/bin/ansible-doc  Ansible 模块功能查看工具
/usr/bin/ansible-galaxy  下载/上传优秀代码或Roles模块 的官网平台,基于网络的
/usr/bin/ansible-playbook  Ansible 定制自动化的任务集编排工具
/usr/bin/ansible-pull  Ansible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维的架构能力要求较高)
/usr/bin/ansible-vault  Ansible 文件加密工具
/usr/bin/ansible-console  Ansible基于Linux Consoble界面可与用户交互的命令执行工具

其中,我们比较常用的是/usr/bin/ansible/usr/bin/ansible-playbook

ansible-doc 命令

  ansible-doc 命令常用于获取模块信息及其使用帮助,一般用法如下:

ansible-doc -l                #获取全部模块的信息
ansible-doc -s MOD_NAME        #获取指定模块的使用帮助

ansible-doc的全部用法:

ansible-doc
Usage: ansible-doc [options] [module...]

Options:
  -h, --help            show this help message and exit  # 显示命令参数API文档
  -l, --list            List available modules  #列出可用的模块
  -M MODULE_PATH, --module-path=MODULE_PATH  #指定模块的路径
                        specify path(s) to module library (default=None)
  -s, --snippet         Show playbook snippet for specified module(s)  #显示playbook制定模块的用法
  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable  # 显示ansible-doc的版本号查看模块列表:
                        connection debugging)
  --version             show program's version number and exit
Last modification:August 11th, 2020 at 08:24 pm
如果觉得我的文章对你有用,请随意赞赏