自动化运维-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)上了。
- (2)将公钥复制到其他机器
//方法一:使用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
# #