自动化运维工具-Ansible之1-基础

自动化运维工具-Ansible之1-基础

Ansible 基本概述

定义

  Ansible是一个自动化统一配置管理工具基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能,集成了丰富模块以及功能组件,可以通过一个命令完成一系列的操作,进而能减少重复性的工作和维护成本,可以提高工作效率。

  ansible是基于 paramiko(框架) 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。

img


同类型软件对比

  1. puppet---学习难,安装ruby环境难,没有远程执行功能
  2. ansible---轻量级,大规模环境下只通过ssh会很慢,串行的
  3. saltstack---一般选择salt会使用C/S结构的模式,salt-mastersalt-minion,并行的,大规模批量操作的情况下,会比Ansible速度快一些,底层使用的是zero-MQ消协队列

手动运维时代(原始社会)

在以前,运维需要规范,需要统一配置管理,我们只能使用源码安装方式,便于我们去管理,源码安装,如果是单台还好,一会也就装完了。如果此时,生产环境压力骤增,需要扩展100台web节点(源码安装100台nginx)我们要重复以下步骤100遍???

#1.安装依赖
yum install pcre-devel openssl-devel -y

#2.进入安装目录
cd /usr/local/tools

#3.创建nginx用户
useradd nginx -M -s /sbin/nologin

#4.解压
tar xf nginx-1.6.3.tar.gz

#5.进入nginx程序目录
cd nginx-1.6.3

#6.生成
./configure --prefix=/usr/local/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module

#7.编译
make

#8.安装
make install

#9.做软链接
ln -s /usr/local/nginx-1.6.3/ /usr/local/nginx

以上步骤还只是安装,那还要部署代码呢?修改配置文件?优化?启动?那还工作个毛线啊,一天啥也不用干了,就装nginx吧。


自动化运维时代

img

只需要一条命令,搞定100台集群


自动化运维工具的优势

img


特点

  1. 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作,没有agent;

  2. 默认使用SSH协议对设备进行管理;

  3. 有大量常规运维操作模块,可实现日常绝大部分操作。

  4. 配置简单、功能强大、扩展性强;

  5. 支持API及自定义模块,可通过Python轻松扩展;

  6. 通过Playbooks(剧本)来定制强大的配置、状态管理;

  7. 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;

  8. 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。

  9. 模块化:调用特定的模块,完成特定任务。

  10. 无需代理不依赖PKI(无需ssl)

  11. 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况

  12. 可使用任何编程语言写模块

  13. 安全,基于OpenSSH

  14. 有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块


Ansible的功能及优点

  1. 远程执行
    批量执行远程命令,可以对多台主机进行远程操作

  2. 配置管理
    批量配置软件服务,可以进行自动化方式配置,服务的统一配置管理,和启停

  3. 事件驱动
    通过Ansible的模块,对服务进行不同的事件驱动
    比如:
    1)修改配置后重启
    2)只修改配置文件,不重启
    3)修改配置文件后,重新加载
    4)远程启停服务管理

  4. 管理公有云
    通过API接口的方式管理公有云,不过这方面做的不如saltstack.
    saltstack本身可以通过saltcloud管理各大云厂商的云平台。

  5. 二次开发
    因为语法是Python,所以便于运维进行二次开发。

  6. 任务编排
    可以通过playbook的方式来统一管理服务,并且可以使用一条命令,实现一套架构的部署

  7. 跨平台,跨系统
    几乎不受到平台和系统的限制,比如安装apache和启动服务

    在Ubuntu上安装apache服务名字叫apache2
    在CentOS上安装apache服务名字叫httpd

    在CentOS6上启动服务器使用命令:/etc/init.d/nginx start
    在CentOS7上启动服务器使用命令:systemctl start nginx


架构

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

ansible是模块化的,它所有的操作都依赖于模块

img


工作原理

img

Ansible主要组成部分

  1. ANSIBLE PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
  2. INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
  3. MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
  4. PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
  5. API:供第三方程序调用的应用程序编程接口
  6. ANSIBLE:组合INVENTORY、API、MODULES、PLUGINS的绿框,可以理解为是ansible命令工具,其为核心执行工具
  7. Ansible命令执行来源:
USER,普通用户,即SYSTEM ADMINISTRATOR
CMDB(配置管理数据库) API 调用
PUBLIC/PRIVATE CLOUD API 调用

USER-> Ansible Playbook -> Ansibile
  1. Ansible实现管理的方式:

    1. Ad-Hoc 即ansible命令,主要用于临时命令使用场景

    2. Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划

      Ansible-playbook(剧本)执行过程:

      1. Ansible读取playbook剧本,剧本中会记录对哪些主机执行哪些任务。
      2. 首先Ansible通过主机清单找到要执行的主机,然后调用具体的模块。
      3. 其次Ansible会通过连接插件连接对应的主机并推送对应的任务列表。
      4. 最后被管理的主机会将Ansible发送过来的任务解析为本地Shell命令执行。
  2. Ansible主要操作对象:

    • HOSTS主机
    • NETWORKING网络设备

注意事项:

  • 执行ansible的主机一般称为主控端,中控,master或堡垒机
  • 主控端Python版本需要2.6或以上
  • 被控端Python版本小于2.4需要安装python-simplejson
  • 被控端如开启SELinux需要安装libselinux-python
  • windows不能做为主控端

任务执行模式

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

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

命令执行过程

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

执行状态:

  • 绿色:执行成功并且不需要做改变的操作
  • 黄色:执行成功并且对目标主机做变更
  • 红色:执行失败

img


Ansible 安装

环境准备

主机名 wanIP lanIP 角色
m01 10.0.0.61 172.16.1.61 Ansible控制端
web01 10.0.0.7 172.16.1.7 Ansible被控端
web02 10.0.0.8 172.16.1.8 Ansible被控端

Ansible安装

(1)使用yum安装

#1.安装epel源
[root@m01 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

#2.安装Ansible
[root@m01 ~]# yum install -y ansible

(2)使用pip安装:pip是Python包管理器,类似yum

yum install python-pip      # 如果没pip,需先安装pip
pip install ansible

确认安装: ansible --version 查询版本


Ansible 选项参数

ansible [options]
        --version   # 查看Ansible版本及模块路径
        -v          # 显示详细信息
        -i          # 主机清单文件路径,默认是在/etc/ansible/hosts
        -m          # 使用的模块名称,默认使用command模块
        -a          # 使用的模块参数,模块的具体动作
        -k          # 提示输入ssh密码,而不使用基于ssh的密钥认证
        -C          # 模拟执行测试,但不会真的执行
        -T          # 执行命令的超时
Define and run a single task 'playbook' against a set of hosts

positional arguments:
  pattern               host pattern

optional arguments:
  --ask-vault-pass      ask for vault password
  --list-hosts          outputs a list of matching hosts; does not execute
                        anything else
  --playbook-dir BASEDIR
                        Since this tool does not use playbooks, use this as a
                        substitute playbook directory.This sets the relative
                        path for many features including roles/ group_vars/
                        etc.
  --syntax-check        perform a syntax check on the playbook, but do not
                        execute it
  --vault-id VAULT_IDS  the vault identity to use
  --vault-password-file VAULT_PASSWORD_FILES
                        vault password file
  --version             show program's version number, config file location,
                        configured module search path, module location,
                        executable location and exit
  -B SECONDS, --background SECONDS
                        run asynchronously, failing after X seconds
                        (default=N/A)
  -C, --check           don't make any changes; instead, try to predict some
                        of the changes that may occur
  -D, --diff            when changing (small) files and templates, show the
                        differences in those files; works great with --check
  -M MODULE_PATH, --module-path MODULE_PATH
                        prepend colon-separated path(s) to module library (def
                        ault=~/.ansible/plugins/modules:/usr/share/ansible/plu
                        gins/modules)
  -P POLL_INTERVAL, --poll POLL_INTERVAL
                        set the poll interval if using -B (default=15)
  -a MODULE_ARGS, --args MODULE_ARGS
                        module arguments
  -e EXTRA_VARS, --extra-vars EXTRA_VARS
                        set additional variables as key=value or YAML/JSON, if
                        filename prepend with @
  -f FORKS, --forks FORKS
                        specify number of parallel processes to use
                        (default=5)
  -h, --help            show this help message and exit
  -i INVENTORY, --inventory INVENTORY, --inventory-file INVENTORY
                        specify inventory host path or comma separated host
                        list. --inventory-file is deprecated
  -l SUBSET, --limit SUBSET
                        further limit selected hosts to an additional pattern
  -m MODULE_NAME, --module-name MODULE_NAME
                        module name to execute (default=command)
  -o, --one-line        condense output
  -t TREE, --tree TREE  log output to this directory
  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable
                        connection debugging)

Privilege Escalation Options:
  control how and which user you become as on target hosts

  --become-method BECOME_METHOD
                        privilege escalation method to use (default=sudo), use
                        `ansible-doc -t become -l` to list valid choices.
  --become-user BECOME_USER
                        run operations as this user (default=root)
  -K, --ask-become-pass
                        ask for privilege escalation password
  -b, --become          run operations with become (does not imply password
                        prompting)

Connection Options:
  control as whom and how to connect to hosts

  --private-key PRIVATE_KEY_FILE, --key-file PRIVATE_KEY_FILE
                        use this file to authenticate the connection
  --scp-extra-args SCP_EXTRA_ARGS
                        specify extra arguments to pass to scp only (e.g. -l)
  --sftp-extra-args SFTP_EXTRA_ARGS
                        specify extra arguments to pass to sftp only (e.g. -f,
                        -l)
  --ssh-common-args SSH_COMMON_ARGS
                        specify common arguments to pass to sftp/scp/ssh (e.g.
                        ProxyCommand)
  --ssh-extra-args SSH_EXTRA_ARGS
                        specify extra arguments to pass to ssh only (e.g. -R)
  -T TIMEOUT, --timeout TIMEOUT
                        override the connection timeout in seconds
                        (default=10)
  -c CONNECTION, --connection CONNECTION
                        connection type to use (default=smart)
  -k, --ask-pass        ask for connection password
  -u REMOTE_USER, --user REMOTE_USER
                        connect as this user (default=None)

[root@m01 ~]# ansible --version
ansible 2.9.10
  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 = /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 配置文件读取顺序

配置文件

/etc/ansible/ansible.cfg  # 主配置文件,配置ansible工作特性
/etc/ansible/hosts        # 主机清单
/etc/ansible/roles/       # 存放角色的目录

查看

[root@m01 ~]# vim /etc/ansible/ansible.cfg
[root@m01 ~]# rpm -ql ansible
[root@m01 ~]# zcat /usr/share/man/man1/ansible-config.1.gz

#/etc/ansible/ansible.cfg 配置文件,如果存在则使用
/etc/ansible/ansible.cfg \-\- Config file, used if present

#~/.ansible.cfg 用户配置文件,覆盖默认配置(如果存在)
~/.ansible.cfg \-\- User config file, overrides the default config if present

#\&/ansible.cfg 本地配置文件(在当前工作目录中)假定为(aqproject-specific)(aq,如果存在,则重写其余文件)。
\&./ansible.cfg \-\- Local config file (in current working directory) assumed to be \(aqproject specific\(aq and overrides the rest if present.

#如上所述,ANSIBLE_CONFIG环境变量将覆盖所有其他环境变量。
As mentioned above, the ANSIBLE_CONFIG environment variable will override all others.

总结

  1. $ANSIBLE_CONFIG:首先,Ansible命令会检查环境变量,及这个环境变量将指向的配置文件
  2. ./ansible.cfg:其次,将会检查当前目录下的ansible.cfg配置文件
  3. ~/.ansible.cfg:再次,将会检查当前用户home目录下的.ansible.cfg配置文件
  4. /etc/ansible/ansible.cfg:最后,将会检查在用软件包管理工具安装Ansible时自动产生的配置文件

Ansible 主配置文件

[root@m01 ~]# cat /etc/ansible/ansible.cfg
[defaults]
#inventory      = /etc/ansible/hosts      # 主机列表配置文件
#library        = /usr/share/my_modules/  # 库文件存放目录
#remote_tmp     = ~/.ansible/tmp          # 临时py文件存放在远程主机目录
#local_tmp      = ~/.ansible/tmp          # 本机的临时执行目录
#forks          = 5                       # 默认并发数
#sudo_user      = root                    # 默认执行命令的用户
#ask_sudo_pass = True                     # 每次执行是否询问sudo的ssh密码
#ask_pass      = True                     # 每次执行是否询问ssh密码
#remote_port    = 22                      # 远程主机SSHD端口
host_key_checking = False                 # 跳过检查主机指纹
log_path = /var/log/ansible.log           # ansible日志文件存放路径
# SSH timeout
#timeout = 10
#module_name = command                    # 默认模块

#普通用户提权操作
[privilege_escalation]
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False 

Ansible Inventory

Inventory文件/etc/ansible/hosts是ansible默认主机资产清单文件,填写需要被管理的主机与主机组信息,用于定义被管理主机的认证信息, 例如ssh登录用户名、密码以及key相关信息。还可以使用-i指定自定义Inventory主机清单文件的位置。


认证方式一:基于密码连接

[root@m01 ~]# cat /etc/ansible/hosts
# IP+端口+用户+密码
[webs]
10.0.0.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'

认证方式二:基于密钥连接(常用)

需要先创建公钥和私钥,并下发公钥至被控端

[root@m01 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
/root/.ssh/id_rsa already exists.
Overwrite (y/n)?
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.5
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.6
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.8

使用ssh登录验证

[root@m01 ~]# ssh root@172.16.1.5
[root@m01 ~]# ssh root@172.16.1.6
[root@m01 ~]# ssh root@172.16.1.7
[root@m01 ~]# ssh root@172.16.1.8
[root@m01 ~]# cat /etc/ansible/hosts
# IP+端口+密钥
[webs]
10.0.0.7 ansible_ssh_port=22

主机名方式一:IP

[root@m01 ~]# cat /etc/ansible/hosts
[webs]
10.0.0.7

主机名方式二:主机名(需要能够解析)

[root@m01 ~]# cat /etc/ansible/hosts
[webs]
web01

主机名方式三:别名

[root@m01 ~]# cat /etc/ansible/hosts
[webs]
web01 ansible_ssh_host=10.0.0.7

多主机方式一:多个单主机

[root@m01 ~]# cat /etc/ansible/hosts
[web1]
web01 ansible_ssh_host=10.0.0.7
[web2]
web02 ansible_ssh_host=10.0.0.8

多主机方式二:主机组

[root@m01 ~]# cat /etc/ansible/hosts
[webs]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8

多主机方式三:包含组

[root@m01 ~]# cat /etc/ansible/hosts
[web01_group]
web01 ansible_ssh_host=10.0.0.7
[web02_group]
web02 ansible_ssh_host=10.0.0.8
[webss:children]
web01_group
web02_group

提取变量

[root@m01 ~]# vim /etc/ansible/hosts 
[webs]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.7
[webs:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass='1'

主机简写(主机需要能够解析)

[root@m01 ~]# vim /etc/ansible/hosts 
[webs]
web0[1:2]
[webs:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass='1'

Ansible 命令

/usr/bin/ansible          # 主程序,临时命令执行工具
/usr/bin/ansible-doc      # 查看配置文档,模块功能查看工具
/usr/bin/ansible-galaxy   # 下载/上传优秀代码或Roles模块的官网平台
/usr/bin/ansible-playbook # 定制自动化任务,编排剧本工具/usr/bin/ansible-pull 远程执行命令的工具
/usr/bin/ansible-vault    # 文件加密工具
/usr/bin/ansible-console  # 基于Console界面与用户交互的执行工具

ansible

通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于密钥认证的方式联系各被管理节点

ansible <host-pattern> [-m module_name] [-a args]
         -m module              指定模块,默认为command
         -v                     详细过程 –vv -vvv更详细
         --list, --list-hosts   显示主机列表 
         -k, --ask-pass         提示输入ssh连接密码,默认Key验证
         -K, --ask-become-pass  提示输入sudo时的口令
         -C, --check            检查,并不执行
         -T, --timeout=TIMEOUT  执行命令的超时时间,默认10s
         -u, --user=REMOTE_USER 执行远程执行的用户
         -b, --become           代替旧版的sudo 切换
         --become-user=USERNAME 指定sudo的runas用户,默认为root

ansible-doc

显示模块帮助

ansible-doc [options] [module...]
            -a             显示所有模块的文档
            -l, --list     列出可用模块
            -s, --snippet  显示指定模块的playbook片段

示例:
ansible-doc –l             列出所有模块
ansible-doc ping           查看指定模块帮助用法
ansible-doc –s ping        查看指定模块帮助用法

ansible-galaxy

Galaxy是一个免费网站,类似于github网站,网站上基本都是共享roles,从Galaxy下载roles是最快启动项目方式之一。


ansible提供了命令ansible-galaxy,可以用来对roles项目进行初始化,查找,安装,移除等操作。

ansible-galaxy list                       # 列出所有已安装的galaxy
ansible-galaxy install geerlingguy.redis  # 安装galaxy
ansible-galaxy remove geerlingguy.redis   # 删除galaxy
[root@m01 roles]# ansible-galaxy --help
Usage: ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...

Perform various Role related operations.

Options:
  -h, --help            show this help message and exit
  -c, --ignore-certs    Ignore SSL certificate validation errors.
  -s API_SERVER, --server=API_SERVER
                        The API server destination
  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable
                        connection debugging)
  --version             show program's version number, config file location,
                        configured module search path, module location,
                        executable location and exit

 See 'ansible-galaxy  --help' for more information on a specific
command.

  1. 搜索项目
[root@m01 roles]# ansible-galaxy search openvpn

Found 103 roles matching your search:

 Name                                      Description
 ----                                      -----------
 AdrienKuhn.fail2ban                       Configure fail2ban jails
 AdrienKuhn.ufw                            Configure firewall with UFW
 alexiscangelosi.openvpn                   Ansible role openvpn
 andrelohmann.easy_rsa                     ansible galaxy role to deploy easy-rsa
 andrelohmann.openvpn                      ansible galaxy role to deploy an openvpn server
 antoniobarbaro.openvpn-client             Install openvpn client, configure and start service
 arillso.openvpn                           Configurate your OpenVPN Client
 asm0dey.ansible_role_openvpn              OpenVPN playbook for CentOS/Fedora/RHEL/RHEL clones & Ubuntu/Debian
 barbudone.pritunl_server                  Pritunl for EL Linux.
 blaet.openvpn                             OpenVPN playbook for CentOS/Fedora/RHEL/RHEL clones & Ubuntu/Debian
 bmcclure.pia                              Manages Private Internet Access VPN utilizing the AUR and openvpn on Archlinux
 borkenpipe.ansible_openvpn                OpenVPN with PKI for Ubuntu/Debian
 borkenpipe.openvpn                        Install OpenVPN for us with AWS bastions.
 borkenpipe.stouts_openvpn                 Manage OpenVPN server
 cinject.openvpn                           Openvpn role
 clvx.easy-rsa                             Role to generate an openvpn pki.
 clvx.openvpn                              Role to deploy server and openvpn clients.
 cornfeedhobo.openvpn                      Install and manage OpenVPN
 d3atiq.openvpn_client                     A role for automatic managed connection to OpenVPN VPN.
 danrabinowitz.openvpn_for_access          This role provisions an OpenVPN server. This server is NOT designed for routing all traffic from the client. It is for granting access to the server, so that ssh (for example) can be allowed ONLY
 dresden-weekly.openvpn                    collection of Ansible roles to run OpenVPN.
 edeckers.openvpn-ldap                     Installs an OpenLDAP backed OpenVPN-server
 egeneralov.openvpn                        Provision openvpn servers
 ehime.openvpn                             OpenVPN playbook for CentOS/Fedora/RHEL/RHEL clones & Ubuntu/Debian
 escapace.ansible_openvpn                  openvpn role
 gavika.easy_rsa                           Install and configure EasyRSA
 gavika.openvpn                            Role to install and configure OpenVPN server and generate client configurations
 gregorydulin.ansible_role_openvpn         OpenVPN playbook for CentOS/Fedora/RHEL/RHEL clones & Ubuntu/Debian
 grycap.openvpn                            Install OpenVPN to create hybrid clusters with EC3
 iamsudipt.openvpn                         OpenVpn ansible role for creating a secure tunnel to your private infra.
 icasimpan.ansible_role_openvpn            OpenVPN playbook for CentOS/Fedora/RHEL/RHEL clones & Ubuntu/Debian
 ieguiguren.nordvpn                        downloads NordVPN servers' list and set it up
 indigo-dc.openvpn                         Install OpenVPN to create hybrid clusters with EC3
 indix.openvpn-ops                         This repo can be used to create a openvpn server.
 iroquoisorg.openvpn                       manage openvpn server
 iroquoisorg.openvpn_client                install openvpn client
 jtyr.openvpn                              Role which helps to install and configure OpenVPN server.
 juju4.openvpnclient                       setup openvpn as client
 kbrebanov.openvpn                         Installs and configures OpenVPN
 kbrebanov.openvpn_as                      Installs and configures OpenVPN Access Server
 kharkevich.pritunl                        Deploy pritunl: Enterprise Distributed OpenVPN and IPsec Server.
 kostyrevaa.openvpn                        Installs and configures openvpn client
 kyl191.openvpn                            OpenVPN playbook for CentOS/Fedora/RHEL/RHEL clones & Ubuntu/Debian
 leafnode.openvpn_client                   install openvpn client
 linuxhq.iproute                           RHEL/CentOS - Advanced IP routing and network device configuration tools
 linuxhq.openvpn_client                    RHEL/CentOS - The Open Source VPN (client)
  1. 查看详细信息
[root@m01 roles]# ansible-galaxy info kostyrevaa.openvpn

Role: kostyrevaa.openvpn
        description: Installs and configures openvpn client
        active: True
        commit:
        commit_message:
        commit_url:
        company:
        created: 2015-08-17T18:13:15.551754Z
        download_count: 20
        forks_count: 0
        github_branch: master
        github_repo: ansible-openvpn
        github_user: kostyrev
        id: 4798
        imported: None
        is_valid: True
        issue_tracker_url: https://github.com/kostyrevaa/ansible-openvpn/issues
        license: license (GPLv3)
        min_ansible_version: 1.2
        modified: 2018-04-13T06:31:20.195475Z
        open_issues_count: 0
        path: (u'/root/.ansible/roles', u'/usr/share/ansible/roles', u'/etc/ansible/roles')
        role_type: ANS
        stargazers_count: 0
        travis_status_url:
  1. 安装项目
[root@m01 roles]# ansible-galaxy install kyl191.openvpn
- downloading role 'openvpn', owned by kyl191

ansible-playbook

定制自动化任务,编排剧本工具/usr/bin/ansible-pull 远程执行命令的工具

ansible-playbook playbook       # 执行剧本
                 --syntax-check # 剧本语法检查
                 -C             # 测试剧本,不会真的执行
                 -i INVENTORY   # 指定清单主机路径或逗号分隔的主机列表
                 -t TAGS        # 仅执行带有指定标签的剧本或任务

ansible-vault

管理加密解密yml文件

ansible-vault [create|decrypt|edit|encrypt|rekey|view]
ansible-vault encrypt hello.yml # 加密
ansible-vault decrypt hello.yml # 解密
ansible-vault view hello.yml    # 查看
ansible-vault edit hello.yml    # 编辑加密文件
ansible-vault rekey hello.yml   # 修改口令
ansible-vault create new.yml    # 创建新文件

ansible-console

2.0+新增,可交互执行命令,支持tab键

root@test (2)[f:10] $
执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$

设置并发数:        forks n    例如:forks 10
切换组:            cd 主机组  例如:cd web
列出当前组主机列表: list
列出所有的内置命令: ?或help

示例:
root@all (2)[f:5]$ list
root@all (2)[f:5]$ cd appsrvs
root@appsrvs (2)[f:5]$ list
root@appsrvs (2)[f:5]$ yum name=httpd state=present
root@appsrvs (2)[f:5]$ service name=httpd state=started

ansible-pull

推送命令至远程,效率无限提升,对运维要求较高


Ansible host-pattern

匹配主机的列表

All 表示所有Inventory中的所有主机

  • ansible all -m ping

* 通配符

  • ansible "*" -m ping # 其中*代表的意思就是all,所有的IP地址
  • ansible 192.168.1.* -m ping # 匹配1.*的IP地址
  • ansible "*srvs" -m ping

逻辑或

  • ansible "websrvs:appsrvs" -m ping # 或关系,取IP地址的并集
  • ansible "192.168.1.10:192.168.1.20" -m ping

逻辑与

  • ansible "websrvs:&dbsrvs" -m ping # 与关系,取IP地址的交集
  • 在websrvs组并且在dbsrvs组中的主机

逻辑非

  • ansible 'websrvs:!dbsrvs' -m ping # 在websrvs中,取dbsrvs的反
  • 在websrvs组,但不在dbsrvs组中的主机,注意:此处为单引号

综合逻辑

  • ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' -m ping

正则表达式

  • ansible "~(web|db).*\.magedu\.com" -m ping

Ansible 示例

  1. 配置公私钥验证

① 首先生成秘钥

ssh-keygen
           -t dsa | ecdsa | ed25519 | rsa | rsa1 # 指定要创建的密钥类型
           -N new_passphrase  # 提供新密码短语
           -P passphrase      # 提供(旧)密码短语
           -f filename        # 指定密钥文件的文件名

② 然后向主机分发秘钥:

ssh-copy-id -i ~/.ssh/id_rsa.pub root@host

③ 如果出现报错:

# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.4
-bash: ssh-copy-id: command not found

请尝试: yum -y install openssh-clientsansible

④编写批量执行脚本

#!/bin/bash  
user=root
password=centos
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa
 
while read ip ;do
expect <<EOF
set timeout 10
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $user@$ip
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$password\n" }
}
expect eof
EOF
done < iplist.txt

⑤将被管理主机IP地址写入文件

# vim iplist.txt  
192.168.34.102
192.168.34.103
192.168.34.105

⑥直接执行脚本批量将本地公钥传递到对方主机

  1. 创建主机清单
[root@m01 ~]# vim /etc/ansible/hosts 
[webs]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8
[lbs]
lb01 ansible_ssh_host=10.0.0.5
lb02 ansible_ssh_host=10.0.0.6
[lnmp:children]
webs
lbs
[lnmp:vars]
ansible_ssh_port=22
  1. 首次连接需要验证ECDSA密钥指纹

    • 可以用ssh将每台主机连接一次

    • 或者在ansible配置文件禁用验证host_key_checking = False

sed -i '/#host_key_checking = False/a host_key_checking = False' /etc/ansible/ansible.cfg
  1. 验证主机清单
[root@m01 ~]# ansible lnmp -m ping -i /etc/ansible/hosts 
web01 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
web02 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
lb01 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
lb02 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
  1. 查看指定组内主机数量
[root@m01 ~]# ansible web01 --list-host
  hosts (1):
    web01
  1. 查看所有组内主机数量(主机名支持通配符和逗号分隔符)
[root@m01 ~]# ansible 'webs,lbs' --list-host
  hosts (4):
    web01
    web02
    lb01
    lb02
[root@m01 ~]# ansible all --list-host
  hosts (4):
    web01
    web02
    lb01
    lb02
[root@m01 ~]# ansible '*' --list-host
  hosts (4):
    web01
    web02
    lb01
    lb02
posted @ 2021-01-02 18:06  原因与结果  阅读(377)  评论(0编辑  收藏  举报