自动化运维-Ansible02-Ansible安装和基本使用

1、安装ansible

1.1、安装ansibe

//添加epel源
yum install epel-release -y

//仅下载,不安装
yum install ansible --downloadonly --downloaddir=./

//安装ansible
]# rpm -ivh --force --nodeps ./*

1.2、Ansible目录结构介绍

  • ansible是开源工具,整个开发过程或二次开发均遵循GPL协议,所以所有源码均可见。作为一款日常工作所需的核心软件,我们有必要知道其目录分布及各目录功能。
    • 配置文件目录/etc/ansible/
    • 执行文件目录/usr/bin/
    • 插件文件目录/usr/share/ansible/plugins/
    • Lib库依赖目录/usr/lib/pythonX.X/site-packages/ansible/
    • Help文档目录/usr/share/doc/ansible-X.X.X/
    • Man文档目录/usr/share/man/man1/
  • 配置文件目录/etc/ansible/,主要功能为:Inventory主机信息配置、Ansible工具功能配置等。所有Ansible的配置均存放在该目录下,运维日常的所有配置类操作也均基于此目录进行。
  • 系统默认的Python目录路径是/usr/lib/pythonXXX/site-packages/,因为Ansible是基于Python编写的,所以Ansible的所有lib库文件和模块文件也均存放于该目录下。如果希望了解Ansible源码的话可至该目录下查看其工作原理。

1.3、Ansible配置文件解析

  • 查看ansible配置文件目录
]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg
├── hosts
└── roles
  • hosts(Inventory)用于定义Ansible的主机列表。
  • ansible.cfg是自身配置文件,默认存放在/etc/ansible/目录中。
    • ansible.cfg配置文件可以有多个,生效顺序是“当前命令执行目录” - “用户家目录下” - “/etc/ansible/ansible.cfg”,先找到哪个就使用哪个的配置。
    • ansible.cfg中的所有内容均可在命令行通过参数的形式传递或定义在Playbooks中。
  • ansible.cfg配置文件约有350行语句,大多数为注释行默认配置项。该文件遵循INI格式,分为如下几类配置。
]# cat /etc/ansible/ansible.cfg 
[defaults]
#inventory     = /etc/ansible/hosts      #指定Inventory文件
#log_path      = /var/log/ansible.log    #执行日志存放目录
#forks         = 5                       #默认并发数
#timeout       = 10                      #默认SSH超时时间
#sudo_user     = root                    #默认sudo用户
#ask_sudo_pass = True                    #是否需要sudo密码
#remote_port   = 22                      #连接远程主机的默认端口
#remote_user   = root                    #在远程主机上默认使用的用户,不指定时将ansible命令使用的当前用户作为默认用户
#library               = /usr/share/my_modules/    #指定lib库目录
#roles_path            = /etc/ansible/roles        #默认存放Roles的目录
#poll_interval         = 15                        #默认轮询时间间隔
#ask_pass              = True                      #是否需要密码
#host_key_checking     = False                     #首次连接是否需要检查key认证,建议设为False
#module_name           = command                   #ansible命令默认使用的模块
#fact_caching          = memory                    #getfact缓存的主机信息存放方式
#retry_files_enabled   = False
#executable            = /bin/sh                   #远程主机在sudo下执行命令时使用这个shell。如果sudo受限,在少数情况下可以将其更改为bin/bash
#remote_tmp            = ~/.ansible/tmp            #远程主机存放临时文件的目录
#local_tmp             = ~/.ansible/tmp            #本地存放临时文件的目录
#retry_files_save_path = ~/.ansible-retry          #错误重启文件存放目录
###插件
#action_plugins     = /usr/share/ansible/plugins/action
#become_plugins     = /usr/share/ansible/plugins/become
#cache_plugins      = /usr/share/ansible/plugins/cache
#callback_plugins   = /usr/share/ansible/plugins/callback
#connection_plugins = /usr/share/ansible/plugins/connection
#lookup_plugins     = /usr/share/ansible/plugins/lookup
#inventory_plugins  = /usr/share/ansible/plugins/inventory
#vars_plugins       = /usr/share/ansible/plugins/vars
#filter_plugins     = /usr/share/ansible/plugins/filter
#test_plugins       = /usr/share/ansible/plugins/test
#terminal_plugins   = /usr/share/ansible/plugins/terminal
#strategy_plugins   = /usr/share/ansible/plugins/strategy
force_color = 1    强制输出带有颜色

[privilege_escalation]
#出于安全考虑,部分公司不希望直接以root的权限直接部署应用,而是开放普通用户权限并给予sudo的权限,该部分配置主要针对sudo用户提权的配置。
#become=True               #是否sudo
#become_method=sudo        #sudo方式
#become_user=root          #sudo后变为root用户
#become_ask_pass=False     #sudo后是否验证密码

[paramiko_connection]
#该部分功能不常用,了解即可。
#record_host_keys=False    #不记录新主机的key以提升效率
#pty=False                 #禁用sudo功能

[ssh_connection]
#Ansible默认使用SSH协议连接对端主机,该部分是主要是SSH连接的一些配置,但配置项较少,多数默认即可。
#pipelining = False        #管道加速功能,需配合requiretty使用方可生效

[accelerate]
#Ansible连接加速相关配置。因为有部分使用者不满意Ansible的执行速度,所以Ansible在连接和执行速度方面也在不断地进行优化,该配置项在提升Ansibile连接速度时会涉及,多数保持默认即可。
#accelerate_port = 5099              #加速连接端口
#accelerate_timeout = 30             #命令执行超时时间,单位秒
#accelerate_connect_timeout = 5.0    #连接超时时间,单位秒
#accelerate_daemon_timeout = 30      #上一个活动连接的时间,单位分钟

[selinux]
#关于selinux的相关配置几乎不会涉及,保持默认配置即可。

[colors]
#Ansible对于输出结果的颜色也进行了详尽的定义且可配置,该选项对日常功能应用影响不大,几乎不用修改,保持默认即可。
#highlight = white
#verbose = blue
#warn = bright purple
#error = red
#debug = dark gray
#deprecate = purple
#skip = cyan
#unreachable = red
#ok = green
#changed = yellow
#diff_add = green
#diff_remove = red
#diff_lines = cyan

2、ansible命令的简单使用

2.1、Ansible认证方式

  • Ansible的通信默认基于SSH,因此需要先对主机进行认证。Ansible认证方式有密码认证和公私钥认证两种方式,其实完全等同于SSH的认证。
  • Ansible默认使用(笔者也建议各位使用)公私钥认证方式,究其原因无非是出于安全的考虑,密码不用明文存放。
  • 以本机为例,执行如下命令即可添加本机认证信息。
    • (1)生成公私钥对
//生成公私钥对
]# ssh-keygen -t rsa -P ""

//生成公私钥对在当前家目录
]# ls -l ${HOME}/.ssh/
-rw------- 1 root root 1675 10月 25 23:27 id_rsa
-rw-r--r-- 1 root root  398 10月 25 23:27 id_rsa.pub
    • (2)将公钥复制到其他机器
      • 将公钥复制到其他机器后,该主机就可以免密登录到其他机器(10.1.1.12)上了。
//方法一:使用ssh-copy-id命令将公钥id_rsa.pub复制到其他机器上
ssh-copy-id -i ${HOME}/.ssh/id_rsa.pub root@10.1.1.12

//方法二:或将${HOME}/.ssh/id_rsa.pub的中的数据添加到其他机器的${HOME}/.ssh/authorized_keys文件中
cat ${HOME}/.ssh/id_rsa.pub                             #查看本机的公钥
echo "${id_rsa.pub}" >> ${HOME}/.ssh/authorized_keys    #将本机的公钥添加到其他机器(10.1.1.13)的authorized_keys文件中

2.2、ansible命令使用

  • Ansible的命令使用格式如下:
ansible <host-pattern> [options]
  • <host-pattern>是Inventory中定义的主机或主机组,可以为ip、hostname、Inventory中的group组名、具有“.”或“*”或“:”等特殊字符的匹配型字符串。<>表示该选项是必须项,不可忽略。
  • [options]是Ansible的参数选项,[]表示该选项中的参数任选其一。
    • -i INVENTORY, --inventory INVENTORY:指定主机清单文件(默认/etc/ansible/hosts),或以逗号分隔的主机列表。
    • -m MODULE_NAME, --module-name MODULE_NAME:指定要使用的模块(default=command)。
    • -a MODULE_ARGS, --args MODULE_ARGS:模块参数。
    • -f FORKS, --forks FORKS:并发管控主机的数量(default=5)。
    • --list-hosts:列出符合条件的主机列表,不执行任何操作。
    • -M MODULE_PATH, --module-path MODULE_PATH:指定模块存放路径,默认/usr/share/ansible,也可以通过ANSIBLE_LIBRARY设定默认路径。
    • -l SUBSET, --limit SUBSET:指定运行的主机。
    • -C, --check:检查语法。测试执行,不会做任何更改。
    • -v, --verbose:输出更详细的执行过程信息,-vvv可得到执行过程所有信息。
    • -o, --one-line:标准输出至一行。
    • -t TREE, --tree TREE:输出信息至TREE目录下,结果文件以远程主机名命名。
    • -b, --become:使用在远程主机上切换到root用户去执行命令(不提示密码)。要在远程主机提升sudo权限(例如centoshh ALL=(ALL) NOPASSWD:ALL)。
    • -u REMOTE_USER, --user REMOTE_USER:指定远程主机以此用户运行命令。(default=None)。
    • -K, --ask-become-pass:用户的密码(--sudo时使用)
    • --private-key PRIVATE_KEY_FILE, --key-file PRIVATE_KEY_FILE:指定密钥文件。
ansible <host-pattern> -m MODULE_NAME -a MODULE_ARGS -f FORKS -b
  • ansible命令主要使用场景:
    • 非固化需求
    • 临时一次性操作
    • 二次开发接口调用
  • Ansible的返回结果都非常友好,一般会用3种颜色来表示执行结果:红色、绿色、橘黄色。
    • 红色表示执行过程有异常,一般会中止剩余所有的任务。
    • 绿色和橘黄色表示执行过程没有异常,所有任务均正常执行,但橘黄色表示命令执行结束后目标有状态的变化。
  • 不仅ansible命令的执行结果如此设置,Ansible系列命令均如此设置,所以判断Ansible系列命令的执行结果是否正常是一件非常容易的事情,只要看颜色即可。

示例1:

  • 针对特定主机做变更。
//--limit:通过--limit参数限定主机做变更。
]# ansible all -i /etc/ansible/hosts -m shell -a "pwd" --limit "10.1.1.12"
//指定IP:通过指定具体IP限定主机做变更。
]# ansible 10.1.1.12 -m shell -a "pwd"
//用“,”或“:”作分隔符,指定多台机器做变更。
]# ansible 10.1.1.12,10.1.1.13 -m shell -a "pwd"
]# ansible 10.1.1.12:10.1.1.13 -m shell -a "pwd"
//通过“*”泛匹配,更灵活地针对多台主机做变更。
]# ansible 10.1.1.* -m shell -a "pwd"

示例2:

]# ansible all -i /etc/ansible/hosts -m ping
10.1.1.12 | SUCCESS => {    #10.1.1.12是执行命令的主机,Success表示命令执行成功,“>>{}”表示详细返回结果
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false,       #“"changed":false”表示没有对主机做变更。
    "ping": "pong"          #“"ping":"pong"”表示执行了ping命令返回结果为pong。
}
...

3、Inventory详解

  • Inventory是Ansible管理主机信息的配置文件,相当于系统HOSTS文件的功能,默认存放在/etc/ansible/hosts。使用–i或--inventory-file指定读取。
    • Inventory可以同时存在多个,而且支持动态生成,如AWS EC2、Cobbler等均支持
    • 为了方便批量管理主机,Inventory可以定义主机和组。

3.1、定义主机和组

  • Inventory配置文件遵循INI文件风格,中括号中的字符为组名。
    • 以行为单位,即每行定义一个主机。
    • 可以将同一个主机同时放到到多个不同的组中。
    • 如果目标主机没有使用默认的SSH端口,可以在主机名称后面使用冒号加端口号指定。
    • “#”开头的行表示注释行。
  • Inventory内置参数有数十个,这些参数均可以直接写在命令行或Playbook文件中,以覆盖配置文件中的定义(https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html)。
    • ansible_host:指定连接主机
    • ansible_port:指定SSH连接端口,默认22
    • ansible_user:指定SSH连接用户
    • ansible_password:指定SSH连接密码
    • ansible_sudo_pass:指定SSH连接时sudo密码
    • ansible_ssh_private_key_file:指定特有私钥文件
  • 默认组有两个:all和ungrouped
    • all:包含所有主机。
    • ungrouped:仅包含没有在分组中的主机。

示例:

]# vim /etc/ansible/hosts
#定义主机
10.1.1.10
10.1.1.11:2200 ansible_user=centoshh ansible_password=centoshh
centos72.local ansible_port=2200 ansible_user=centoshh ansible_password=centoshh             #hostname是centos72.local
centos73 ansible_host=10.1.1.13 ansible_port=2200 ansible_user=root ansible_password=root    #别名centos73
#连续主机的表示
10.1.1.1[4:6]           #[4-6]表示4-6之间的所有数字。即表示10.1.1.14,...,10.1.1.16的所有主机
www.hengha-[4:6].com    #[01:10]表示01-10之间的所有数字。即表示www.hengha-4.com,...,www.hengha-6.com的所有主机
web.hengha-[d:f].com    #[a:f]表示a到f之间的所有字母。即表示db.hengha-d.com,...,db.hengha-f.com的所有主机
#定义组
[websevers]
10.1.1.222
10.1.1.1[07:09]         #[07-09]表示07-09之间的所有数字。即表示10.1.1.107,...,10.1.1.109的所有主机
web.hengha-[h:i].com    #[h:i]表示h-i之间的所有字母
  • 使用ansible示例:
//使用清单中的所有主机
]# ansible all -i /etc/ansible/hosts -m shell -a "pwd" -f 1
//仅使用清单中的[websevers]组中的主机
]# ansible websevers -i /etc/ansible/hosts -m shell -a "pwd" -f 1
  • 报错信息:Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host.
    • 解决问题:
//禁用SSH密钥主机检查
]# vim /etc/ansible/ansible.cfg
# uncomment this to disable SSH key host checking
host_key_checking = False

3.2、变量

1、定义主机变量

  • 在日常工作中,通常会遇到非标准化的需求配置,如考虑到安全性问题,业务人员通常将企业内部的Web服务80端口修改为其他端口号,而该功能可以直接通过修改Inventory配置来实现,在定义主机时为其添加主机变量,以便在Playbook中使用针对某一主机的个性化要求。
[webservers]
web.hengha1.com http_port=808 maxRequestsPerChild=801    #自定义http_port的端口号为808,配置maxRequestsPerChild为801

2、定义组变量

  • Ansible支持定义组变量,主要针对大量机器的变量定义需求,赋予指定组内所有主机在Playbook中可用的变量,等同于逐一给该组下的所有主机赋予同一变量。
[groupservers]
web.hengha2.com
web.hengha3.com
[groupservers:vars]          ###注意,[组名:vars]
ntp_server=ntp.hengha.com    #定义groupservers组中所有主机ntp_server值为ntp.hengha.com

[all:vars]                   #设置所有主机使用的用户和密码
ansible_user=centoshh
ansible_password=centoshh

3、定义组嵌套及组变量

  • Inventory中,组还可以包含其他的组(嵌套),并且也可以向组中的主机指定变量。不过,这些变量只能在Ansible-playbook中使用,而Ansible不支持。组与组之间可以相互调用,并且可以向组中的主机指定变量。
[apache]
httpd1.hengha.com
httpd2.hengha.com
[nginx]
ngx1.hengha.com
ngx2.hengha.com
[webservers:children]    ###注意,[新组名:children]
apache                     #引用组名
nginx
[webservers:vars]        #[组名:vars]
ntp_server=ntp.hengha.com

3.3、多重变量定义

  • 变量除了可以在Inventory中一并定义,也可以独立于Inventory文件之外单独存储到YAML格式的配置文件中,这些文件通常以.yml、.yaml、.json为后缀或者无后缀。变量通常从如下4个位置检索:
    • Inventory配置文件(默认/etc/ansible/hosts)
    • Playbook中vars定义的区域
    • Roles中vars目录下的文件
    • Roles同级目录group_vars和hosts_vars目录下的文件

4、Ansible与正则

  • Ansible支持正则表达式(Patterns)。
    • Patterns功能等同于正则表达式,语法使用也和正则类同,
    • 同样Ansible-playbook也可以使用Patterns功能。
  • 使用格式:
    • 该功能主要针对Inventory的主机列表使用。
ansible <pattern_goes_here> -m <module_name> -a <arguments>

1、All(全量)匹配

//all和*功能相同,但*号需要使用引号引起来
ansible all -m ping
ansible "*" -m ping

2、逻辑或(or)匹配

  • 如希望同时对多台主机或多个组同时执行,相互之间用“:”(冒号)分隔即可。
ansible "web1:web2" -m ping

3、逻辑非(!)匹配

  • 逻辑非用感叹号(!)表示,主要针对多重条件的匹配规则。
//所有在webservers组但不在phoenix组的主机
ansible "webservers:!phoenix" -m ping

4、逻辑与(&)匹配

  • 和逻辑非一样,逻辑与也主要针对多重条件的匹配规则,只是逻辑上的判断不同。逻辑与使用&表示。
//webservers组和staging组中同时存在的主机
ansible "webservers:&staging" -m ping

5、多条件组合

  • Ansible同样支持多条件的复杂组合,该情况企业应用不多。
//webservers和dbservers两个组中的所有主机在staging组中存在且在 phoenix组中不存在的主机
ansible "webservers:dbservers:&staging:!phoenix" -m ping

6、模糊匹配

  • *通配符在Ansible表示0个或多个任意字符,主要应用于一些模糊规则匹配,在平时的使用中应用频率非常高。
//所有以.hengha.com结尾的主机均符合
ansible "*.hengha.com" -m ping
//one开头.com结尾的所有主机和dbservers组中的所有主机
ansible "one*.com:dbservers" -m ping

7、域切割

  • Ansible底层基于Python,因此也支持域切割。
//Python字符串域切割的示例如下,通过[0:1]即可获取数值1
str = '12345678'
print str[0:1]

//Inventory内容
[webservers]
cobweb
webbing
weber
//通过截取数组下标可以获得对应变量值
webservers[0]      # == cobweb
webservers[-1]     # == weber
webservers[0:1]    # == webservers[0],webservers[1] # == cobweb,webbing
webservers[1:]     # == webbing,weber

8、正则匹配

  • Ansible支持完整的正则匹配功能,“~”开始表示正则匹配。
//检测beta.example.com、web.example.com、green.example.com、beta.example.org、web.example.org、green.example.org的存活,使用如下匹配模式
ansible "~(beta|web|green)\.example\.(com|org)" -m ping
//检测Inventory中所有以192.168开头的服务器存活信息
ansible ~192\.168\.[0-9]\{\2}.[0-9]\{2,} -m ping

1

#                                                                                                                                         #
posted @ 2022-10-25 19:24  麦恒  阅读(283)  评论(0编辑  收藏  举报