Ansible系列命令与Inventory配置详解

简介:

Ansible是开源工具,整个开发过程或二次开发均遵循GPL协议,所以所有源码均可见,作为一款日常工作所需的核心软件,我们有必要知道其目录分布及各目录功能。

通过下列命令可以获取ansible所有文件存放目录

rpm -ql ansible

该命令输出较多,大致分为如下几类:

配置文件目录:/etc/ansible/

执行文件目录:/usr/bin/

Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/

Help文档目录:/usr/share/doc/ansible-X.X.X/

Man文档目录:/usr/share/man/manl/

运维经常需要配置的目录:

(1.)/etc/ansible/ 主要功能为:Inventory主机信息配置 、Ansible工具功能配置等。

(2.)执行文件目录/usr/bin/主要功能为:Ansible系列命令默认存放目录,Ansible所有的可执行文件均存放在该目录下。

 

Ansible配置文件解析

配置文件ansible.cfg约有350行语句,大多数为注释行默认配置项。该文件遵循INI格式分为如下几类配置。

(1.)[defaults]

该类配置下定义常规的连接类配置,如:

inventory、library、remote_tmp、local_tmp、forks、poll_interval、sudo_user、ask_sudo_pass、ask_pass、transport

remote_port等。

参数解释:
 

 
  1. [defaults]

  2.  
  3. #inventory = /etc/ansible/hosts #定义Inventory

  4.  
  5. #library = /usr/share/my_modules/ #自定义lib库存放目录

  6.  
  7. #remote_tmp = $HOME/.ansible/tmp #临时文件远程主机存放目录

  8.  
  9. #local_tmp = $HOME/.ansible/tmp #临时文件本地存放目录

  10.  
  11. #forks = 5 #默认开启的并发数

  12.  
  13. #poll_interval = 15 #默认轮询时间间隔

  14.  
  15. #sudo_user = root #默认sudo用户

  16.  
  17. #ask_sudo_pass = True #是否需要sudo密码

  18.  
  19. #ask_pass = True #是否需要密码

  20.  
  21. #roles_path = /etc/ansible/roles #默认下载的Roles存放的目录

  22.  
  23. #host_key_checking = False #首次连接是否需要检查key认证,建议设为False

  24.  
  25. #timeout = 10 #默认超时时间

  26.  
  27. #timeout = 10 #如没有指定用户,默认使用的远程连接用户

  28.  
  29. #log_path = /var/log/ansible.log #执行日志存放目录

  30.  
  31. #module_name = command #默认执行的模块

  32.  
  33. #action_plugins = /usr/share/ansible/plugins/action #action插件的存放目录

  34.  
  35. #callback_plugins = /usr/share/ansible/plugins/callback #callback插件的存放目录

  36.  
  37. #connection_plugins = /usr/share/ansible/plugins/connection #connection插件的存放目录

  38.  
  39. #lookup_plugins = /usr/share/ansible/plugins/lookup #lookup插件的存放目录

  40.  
  41. #vars_plugins = /usr/share/ansible/plugins/vars #vars插件的存放目录

  42.  
  43. #filter_plugins = /usr/share/ansible/plugins/filter #filter插件的存放目录

  44.  
  45. #test_plugins = /usr/share/ansible/plugins/test #test插件的存放目录

  46.  
  47. #strategy_plugins = /usr/share/ansible/plugins/strategy #strategy插件的存放目录

  48.  
  49. #fact_caching = memory #getfact缓存的主机信息存放方式

  50.  
  51. #retry_files_enabled = False

  52.  
  53. #retry_files_save_path = ~/.ansible-retry #错误重启文件存放目录

上述是日常可能用到的配置,这些多数保持默认即可。

(2.)[privilege_escalation]

出于安全角度考虑,部分公司不希望直接以root的高级管理员权限直接部署应用,往往会开放普通用户权限并给予sudo的权限,该部分配置主要针对sudo用户提权的配置 。

参数解释:
 

 
  1. #become = True #是否sudo

  2.  
  3. #become_method=sudo #sudo 方式

  4.  
  5. #become_user=root #sudo后变为root用户

  6.  
  7. #become_ask_pass=False #sudo后是否验证密码

  (3.)[privilege_connection] 该配置不常用到

 
  1. #record_host_keys=False #不记录新主机的key以提升效率

  2.  
  3. #pty=False #禁用sudo功能

(4.)[ssh_connection]

Ansible默认使用的是SSH协议进行与对端主机进行通信。但配置项较少,多数默认即可

# pipelining = False

(5.)[accelerate]
 

 
  1. Ansible连接加速相关配置。多数保持默认即可。

  2.  
  3. #accelerate_port = 5099 #加速连接端口

  4.  
  5. #accelerate_timeout = 30 #命令执行超时时间,单位秒

  6.  
  7. #accelerate_connect_timeout = 5.0 #连接超时时间,单位秒

  8.  
  9. #accelerate_multi_key = yes

   (6.)[selinux]

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

 
  1. #libvirt_lxc_noseclabel = yes

  2.  
  3. #libvirt_lxc_noseclabel = yes

(7.)[colors]

Ansible对于输出结果的颜色也进行了详尽的定义且可配置,保持默认即可。
 

 
  1. #highlight = white

  2.  
  3. #verbose = blue

  4.  
  5. #warn = bright purple

  6.  
  7. #error = red

  8.  
  9. #debug = dark gray

  10.  
  11. #deprecate = purple

  12.  
  13. #skip = cyan

  14.  
  15. #unrechable = red

  16.  
  17. #ok = green

  18.  
  19. #changed = yellow

  20.  
  21. #diff_add = green

  22.  
  23. #diff_remove = red

  24.  
  25. #diff_lines = cyan

Ansible命令用法详解

Ansible命令执行的方式有:Ad-Hoc 、Ansible-playbook两种方式

两者本质没什么区别:Ad-Hoc主要用于临时命令的执行,Ansible-playbook可以理解为Ad-Hoc的集合,通过一定的规则编排在一起。

Ansible认证方式有两种:密码认证、公私钥认证两种方式

Ansible的命令使用格式:

ansible  (主机模式) [options] (选项)

(主机模式):是Inventory(清单)中定义的主机或主机组,可以是ip、hostname(主机名)

Inventory:中的group组名、具有"." 或"*" 或 ":" 等特殊字符的匹配型字符串 。<>表示该选项是必须项,不可忽略。

[options]是Ansible的参数选项,[]表示该选项中的参数任选其一。

 
  1. -m NAME,--module-name=NAME:指定执行使用的模块

  2.  
  3. -u USERNAME,--user=USERNAME:指定远程主机以USERNAME运行命令。

  4.  
  5. -s,--sudo:相当于Linux系统下的sudo命令。

  6.  
  7. -U SUDO_USERNAME,--sudo-user=SUDO_USERNAME:使用sudo,相当于Linux下的sudo命令。

具体实例如下:

以kangshuo用户执行ping存活检测

ansible  all  -m   ping  -u  kangshuo

以kangshuo  sudo 至root执行ping存活检测

ansible  all  -m  ping  -u  kangshuo   --sudo

以kangshuo sudo 至batman 用户执行ping 存活检测

ansible all  -m ping  -u bruce  --sudo  --sudo-user   batman

注意:但在新版本中ansible的sudo命令废弃,改为--become或-b,如上命令修改为如下:

以kangshuo sudo至root执行ping存活检测

ansible all  -m ping  -u  kangshuo  -b

以kangshuo sudo至batman用户执行ping存活检测

ansible all -m ping  -u kangshuo  -b  --become-user   batman

Ansible-playbook的命令用法和Ansible略有不同,虽然参数选项与Ansible有很多相同的地方,但也新增了针对Ansible-playbook特有的参数。

Ansible-playbook的命令使用格式如下:

Ansible-playbook  playbook.yml

Ansible-playbook命令后跟事先编辑好的playbook.yml文件即可。Ansible-playbook新增的功能参数如下:
 

 
  1. --ask-vault-pass:加密playbook文件时提示输入密码。

  2.  
  3. -D,--diff:当更新的文件数及内容较少时,该选项可显示这些文件不同的地方,该选项结合-C用会有较好的效果。

  4.  
  5. -e EXTRA_VARS,--extra-vars=EXTRA_VARS:在Playbook中引入外部变量。

  6.  
  7. --flush-cache:将fact清除到的远程主机缓存。

  8.  
  9. --force-handlers:强制运行handlers的任务,即使在任务失败的情况下。

  10.  
  11. -i INVENTORY:指定要读取的INventory(清单)文件。

  12.  
  13. --list-tags:列出所有可用的tags。

  14.  
  15. --list-tasks:列出所有即将被执行的任务。

  16.  
  17. --skip-tags=SKIP_TAGS:跳过指定的tags任务。

  18.  
  19. --start-at-task=START_AT_TASK:从第几条任务开始执行。

  20.  
  21. --step:逐步执行Playbook定义的任务,并经人工确认后继续执行下一步任务。

  22.  
  23. --syntax-check:检查Playbook中的语法书写。

  24.  
  25. -t TAGS,--tags=TAGS:指定执行该tags的任务。

Ansible系列命令用法详解与使用场景介绍

如何获取Ansible的系列命令呢?

在终端键入ansible后连续按两次Tab键,会补全所有以ansible字母开头的命令,这些命令均是Ansible系列命令。

 
  1. ansible

  2.  
  3. ansible-galaxy

  4.  
  5. ansible-pull

  6.  
  7. ansible-doc

  8.  
  9. Ansible-playbook

  10.  
  11. ansible-vault

  12.  
  13. ansible-console

1.ansible:

ansible主要应用在如下场景:

(1.)非固化需求

(2.)临时一次性操作

(3.)二次开发接口调用

那么什么是非固化需求和临时一次性操作呢?

简单来讲,比如工作中我临时想查看storm_cluster组的主机是否存活。

ansible storm_cluster -m ping
 
  1. [root@192 ~]# ansible storm_cluster -m ping

  2. 192.168.1.5 | success >> {

  3. "changed": false,

  4. "ping": "pong"

  5. }

  6.  
  7. 192.168.1.7 | success >> {

  8. "changed": false,

  9. "ping": "pong"

  10. }

在或者我想临时复制本地的/etc/fstab文件到远程主机192.168.1.7的/tmp目录下做测试。

ansible 192.168.1.7 -m copy -a "src=/etc/fstab dest=/tmp/fstab owner=root group=root mode=644 backup=yes"

执行结果如下:

 
  1. [root@192 ~]# ansible 192.168.1.7 -m copy -a "src=/etc/fstab dest=/tmp/fstab owner=root group=root mode=644 backup=yes"

  2. 192.168.1.7 | success >> {

  3. "changed": false,

  4. "dest": "/tmp/fstab",

  5. "gid": 0,

  6. "group": "root",

  7. "md5sum": "881cdcd7fca7a1dca107d264ba621358",

  8. "mode": "0644",

  9. "owner": "root",

  10. "path": "/tmp/fstab",

  11. "secontext": "unconfined_u:object_r:admin_home_t:s0",

  12. "size": 541,

  13. "state": "file",

  14. "uid": 0

  15. }

再到192.168.1.7主机上面查看/tmp目录下是否有fstab文件。

Ansible系列命令与Inventory配置详解_第1张图片

例如上面的这些没规律的、临时需要做的任务,我们称之为非固化需求、临时一次性操作。

Ansible的返回结果都非常友好,一般会用3种颜色来表示执行结果:

 
  1. 红色:表示执行过程中有异常,一般会中止剩余所有的任务

  2.  
  3. 绿色:表示执行过程中没有异常,所有任务均正常执行

  4.  
  5. 橘黄色:表示执行过程中没有异常,所有任务均正常执行,但是命令执行结束后目标有状态的变化。

所以判断Ansible系列命令的执行结果是否正常是一件非常容易的事情,只要看颜色即可。

2.ansible-galaxy

通过ansible-galaxy命令,我们可以根据下载量和关注量等信息,查找和安装优秀的Roles。

Roles是Ansible非常重要的一项功能。之后的博客会有专门的详解。。。。。

在ansible-galaxy上,我们可以上传和下载Roles,下载地址为:https://galaxy.ansible.com

ansible-galaxy命令使用格式如下:

ansible-galaxy [ init | info | install | list | remove ]  [--help] [options] ...

ansible-galaxy命令分为三大部分:

(1.)[init|info|install|list|remove]

 
  1. init:初始化本地的Roles配置,以备上传Roles至galaxy。

  2.  
  3. info:列表指定Role的详细信息。

  4.  
  5. install:下载并安装galaxy指定的Roles到本地。

  6.  
  7. list:列出本地已下载的Roles。

  8.  
  9. remove:删除本地已下载的Roles。

Ansible2.0版本中,针对ansible-galaxy增加了login、import、delete、setup等功能,但这些功能需要基于login在galaxy认证成功后方可执行,主要为了方便对galaxy上已有的Roles的配置工作。

(2.)help用法显示[--help]

针对上面的init、info等功能,后面跟上--help可单独显示该项用法。例如:

ansible-galaxy   init   --help

执行后会返回ansible-galaxy init选项的用法说明。

 
  1. Usage: ansible-galaxy init [options] role_name

  2.  
  3. Options:

  4. -h, --help show this help message and exit

  5. -p INIT_PATH, --init-path=INIT_PATH

  6. The path in which the skeleton role will be created.

  7. The default is the current working directory.

  8. -s API_SERVER, --server=API_SERVER

  9. The API server destination

  10. -f, --force Force overwriting an existing role

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

其他选项与help用法一样。

(3.)参数项[options]

该部分结合第一部分的参数完成ansible-galaxy完整的功能用法。

可参考如下:

下载用户kangshuo的Nginx这个Role到本地并忽略错误(默认存放在/etc/ansible/roles/)

ansible-galaxy  --ignore-errors  install  azavea.git

 因为ansible-galaxy是对https://galaxy.ansible.com网站的上传、下载、配置类工作,如果有类似如下报错,请确保该网站可以正常访问。

The API server (galaxy.ansible.com) is not responding, please try again later.

3.ansible-pull

该指令的使用涉及Ansible的另一种工作模式:pull模式(Ansible默认使用push模式)。

push模式适用于以下场景:

(1.)你有数量巨大的机器需要配置,即使使用高并发线程依旧要花费很多时间。

(2.)你要在刚启动的、没有网络连接的主机上运行Ansible。

ansible-pull命令的使用格式如下:

ansible-pull  [options] [playbook.yml]

通过ansible-pull结合Git和crontab一并实现,其原理如下:通过crontab定期拉去指定的Git版本到本地,并以指定模式自动运行预先制订好的指令。

具体参考如下实例:

*/20  * *  *  *  root  /usr/local/bin/ansible-pull  -o -C 2.1.0  -d  /srv/www/king-gw/  -i  /etc/ansible/hosts  -U git://git.kingifa.com/king-gw-ansiblepull  >> /var/log/ansible-pull.log  2>&1

 Ansible-pull通常在配置大批量机器的场景下使用,灵活性稍有欠缺,但效率几乎可以无限提升,对运维人员的技术水平和前瞻性规划有较高要求。

4.ansible-doc

ansible-doc是Ansible模块文档说明,针对每个模块都有详细的用法说明及应用案例介绍,功能和Linux系统man命令类似。

该命令使用方式如下:

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

ansible-doc命令后跟[options]参数或[模块名],显示模块用法说明。具体示例如下:

ansible-doc  -l   #列出支持的模块
 
  1. [root@192 ~]# ansible-doc -l

  2. acl Sets and retrieves file ACL information.

  3. add_host add a host (and alternatively a group) to the ansible-playbo

  4. airbrake_deployment Notify airbrake about app deployments

  5. alternatives Manages alternative programs for common commands

  6. apache2_module enables/disables a module of the Apache2 webserver

  7. apt Manages apt-packages

  8. apt_key Add or remove an apt key

  9. apt_repository Add and remove APT repositories

  10. apt_rpm apt_rpm package manager

  11. arista_interface Manage physical Ethernet interfaces

  12. arista_l2interface Manage layer 2 interfaces

  13. arista_lag Manage port channel (lag) interfaces

  14. arista_vlan Manage VLAN resources

  15. assemble Assembles a configuration file from fragments

  16. assert Fail with custom message

  17. at Schedule the execution of a command or script file via the a

  18. authorized_key Adds or removes an SSH authorized key

  19. azure create or terminate a virtual machine in azure

  20. bigip_facts Collect facts from F5 BIG-IP devices

  21. bigip_monitor_http Manages F5 BIG-IP LTM http monitors

  22. bigip_monitor_tcp Manages F5 BIG-IP LTM tcp monitors

  23. bigip_node Manages F5 BIG-IP LTM nodes

  24. bigip_pool Manages F5 BIG-IP LTM pools

  25. bigip_pool_member Manages F5 BIG-IP LTM pool members

  26. boundary_meter Manage boundary meters

  27. bzr Deploy software (or files) from bzr branches

  28. campfire Send a message to Campfire

  29. capabilities Manage Linux capabilities

  30. cloudformation create a AWS CloudFormation stack

  31. command Executes a command on a remote node

  32. composer Dependency Manager for PHP

  33. copy Copies files to remote locations.

  34. cpanm Manages Perl library dependencies.

  35. cron Manage cron.d and crontab entries.

  36. datadog_event Posts events to DataDog service

  37. debconf Configure a .deb package

  38. debug Print statements during execution

ansible-doc ping   //模块功能说明
 
  1. [root@192 ~]# ansible-doc ping

  2. > PING

  3.  
  4. A trivial test module, this module always returns `pong' on

  5. successful contact. It does not make sense in playbooks, but it is

  6. useful from `/usr/bin/ansible'

  7.  
  8. # Test 'webservers' status

  9. ansible webservers -m ping

5.Ansible-playbook

ansible-playbook工作机制:通过读取预先编写好的playbook文件实现批量管理。

要实现的功能与ansible命令一样,可以理解为按一定条件组成的ansible任务集。

ansible-playbook命令后跟YML格式的playbook文件,执行事先编好的任务集。

使用方式如下:

 
  1. ansible-playbook playbook.yml

  2.  

具体示例如下:

ansible-playbook  gw.yml

playbook具有编写简单、可定制性高、灵活方便,以及可固化日常所有操作的特点,运维人员应熟练掌握。

6.ansible-vault

ansible-vault主要用于配置文件加密,例如编写的playbook配置文件中包含敏感信息,不希望其他人随意查看,ansible-vault可加密/解密这个配置文件。

具体示例如下:

首先编辑一个a.yml文件,里面内容为了测试随便输入即可,输入aaaaaaaaa

Ansible系列命令与Inventory配置详解_第2张图片

保存退出,加密a.yml文件。

ansible-vault encrypt  a.yml

会有以下输入加密密码提示:

 
  1. Vault password:

  2. Confirm Vault password:

  3. Encryption successful

设置完,这时再打开a.yml文件后会发现该文件乱码:

Ansible系列命令与Inventory配置详解_第3张图片

  只有通过如下命令解密后方可正常查看。

ansible-vault  decrypt  a.yml

输入预设的密码后方可解密

 
  1. Vault password:

  2. Decryption successful

此时a.yml文件打开后可正常查看:

Ansible系列命令与Inventory配置详解_第4张图片

7.ansible-console

ansible-console是Ansible为用户提供的一款交互式工具,用户可以在ansible-console虚拟出来的终端上像Shell一样使用Ansible内置的各种命令,这为习惯于使用shell交互方式的用户提供了良好的使用体验。

到这里,我们对ansible的用法及系列命令已经有了概念性的了解和掌握,接下来我们进一步了解Ansible Inventory(清单)文件的配置管理。

 

Ansible Inventory(清单) 配置及详解

Inventory(清单)是Ansible管理主机信息的配置文件,相当于系统HOSTS文件的功能,默认存放在/etc/ansible/hosts。

为了方便批量管理主机,便捷使用其中的主机分组,Ansible通过Inventory来定义主机和组。

在使用时通过-i或者--inventory-file指定读取,与Ansible命令结合使用时组合如下:

ansible -i  /etc/ansible/hosts  storm_cluster -m  ping 

读取结果如下:

注意:如果只有一个Inventory(清单)时可不用指定路径,默认读取/etc/ansible/hosts。Inventory(清单)可以同时存在多个,而且支持动态生成

 

Inventory(清单)的使用规则(定义主机和组)

Inventory(清单)配置文件遵循INI文件风格,中括号中的字符为组名。其支持将同一个主机同时归并到多个不同的组中,分组的功能为IT人员维护主机列表提供了非常大的便利。

此外,若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来表名,以行为单位分隔配置

详细代码信息注释内容:

 
  1. # “ # ” 开头的行表示该行为注释行,即当时行的配置不生效。

  2.  
  3. # Inventory(清单)可以直接为IP地址

  4.  
  5. 192.168.1.7

  6.  
  7. #Inventory(清单)同样支持Hostname(主机名)的方式,后跟冒号加数字表示端口号,默认22号端口

  8.  
  9. ntp.magede.com:22

  10.  
  11. nfs.magede.com:22

  12.  
  13. # 中括号内的内容表示一个分组的开始,紧随其后的主机均属于该组成员,空行后的主机亦属于该组,即web2.magedu.com这台主机也属于[webservers]组。

  14.  
  15. [webservers]

  16.  
  17. web1.magedu.com

  18.  
  19. web[10:20].magedu.com #[10:20] 表示10 ~ 20 之间的所有数字(包括10和20 ),即表示web10.magedu.com、web11.magedu.com.................web20.magedu.com的所有主机。

  20.  
  21.  
  22.  
  23. web2.magedu.com[dbservers]

  24.  
  25. db-a.magedu.com

  26.  
  27. db-[b:f].magedu.com # [b:f] 表示b到f之间的所有数字(包括b和f),即表示db-b.magedu.com、db-c.magedu.com..........db-f.magedu.com的所有主机。

定义主机变量

在平时工作中,通常会遇到非标准化的需求配置,如考虑到安全性问题,业务人员通常将企业内部的web服务80端口修改为其他端口号,而该功能可以直接通过修改Inventory(清单)配置来实现,在定义主机时为其添加主机变量,以便在Playbook中使用针对某一主机的个性化要求。

例如:

 
  1. [webservers]

  2.  
  3. web1.magedu.com http_port=808 maxRequestsPerChild=801 #自定义http_port的端口号为808、配置maxRequestsPerChild为801.

Ansible其实支持多种方式修改或自定义变量,Inventory(清单)是其中的一种修改方式。关于更多种方式,将在后期会详细介绍到的。。。。。。。。

 

定义组变量

Ansible支持定义组变量,主要是针对大量机器的变量定义需求,赋予指定组内所有主机在Playbook中可用的变量,等同于逐一给该组下的所有主机赋予同一变量。

例如:

 
  1. [groupservers]

  2.  
  3. web1.magedu.com

  4.  
  5. web2.magedu.com

  6.  
  7. [groupservers:vars]

  8.  
  9. ntp_server=ntp.magedu.com #定义groupservers组中所有主机ntp_server值为ntp.magedu.com

  10.  
  11. nfs_server=nfs.magedu.com #定义groupservers组中的所有主机nfs_server值为nfs.magedu.com

定义组嵌套及组变量

Inventory(清单)中,组还可以包含其他的组(嵌套),并且也可以向组中的主机指定变量。不过,这些变量只能在Ansible-playbook中使用,而Ansible不支持。组与组之间可以相互调用,并且可以向组中的主机指定变量。

示例:

 
  1. [apache]

  2.  
  3. httpd1.magedu.com

  4.  
  5. httpd2.magedu.com

  6.  
  7. [nginx]

  8.  
  9. ngx1.magedu.com

  10.  
  11. ngx2.magedu.com

  12.  
  13. [webservers:children]

  14.  
  15. apache

  16.  
  17. nginx

  18.  
  19. [webservers:vars]

  20.  
  21. ntp_server=ntp.magedu.com

Ansible以简单为其核心理念,上述实现在业务日常使用中并不常见,大家了解其用法即可。

多重变量定义

变量除了可以在Inventory(清单)中一并定义,也可以独立于Inventory(清单)文件之外单独存储到YAML格式的配置文件中,这些文件中,这些文件通常以.yml、.yaml、.json为后缀或者无后缀。

变量通常从如下4个位置检索:

 
  1. Inventory(清单)配置文件(默认/etc/ansible/hosts)

  2.  
  3. Playbook中vars定义的区域

  4.  
  5. Roles中的vars目录下的文件

  6.  
  7. Roles同级目录group_vars和hosts_vars目录下的文件

假设foosball主机同属于raleigh和webservers组,那么其变量在如下文件中设置均有效:

 
  1. /etc/ansible/group_vars/raleigh # can optionally end in '.yml' ,'.yaml' , or '.json'

  2.  
  3. /etc/ansible/group_vars/webservers

  4.  
  5. /etc/ansible/host_vars/foosball

  对于变量的读取,Ansible遵循如上优先级顺序,因此大家设置变量时尽量沿用同一种方式,以方便维护人员管理。

其他Inventory(清单)参数列表

除了支持如上的功能外,Ansible基于SSH连接Inventory(清单)中指定的远程主机时,还内置了很多其他参数,用于指定其交互方式。

下面列举了部分重要参数:

 
  1. ansible_ssh_host:指定连接主机ansible_ssh_port,指定SSH连接端口,默认22

  2.  
  3. ansible_ssh_user:指定SSH连接用户

  4.  
  5. ansible_ssh_pass:指定SSH连接密码

  6.  
  7. ansible_sudo_pass:指定SSH连接时sudo密码

  8.  
  9. ansible_ssh_private_key_file:指定特有私钥文件

其他内置参数还有数十个, 这些参数均可以直接写在命令行或Playbook文件中,以覆盖配置文件中的定义。

Ansible与正则

正则表达式(Patterns)是各类高级语言的必定支持的方法之一,Ansible也不例外。其Patterns(模式)功能等同于正则表达式,语法使用也和正则类同,这大大便利了运维的使用。

该功能同样支持Ansible-playbook,其用法也非常简单,语法如下:

ansible   -m   -a  

该功能主要针对Inventory(清单)的主机列表使用。

如下示例中主要针对webservers进行正则匹配:

重启webservers组所有主机的httpd服务

ansible webservers -m  service -a  "name=httpd state=restarted"

(1.)ALL(全量)匹配

匹配所有主机,all或*号功能相同,但*号需引起来。如检测所有主机存活情况

 
  1. ansible all -m ping

  2.  
  3. ansible "*" -m ping

检查192.168.1.0/24网段所有主机存活状况

ansible 192.168.1.*  -m  ping

(2.)逻辑或(or)匹配

如果我们希望同时对多台主机或多个组同时执行,相互之间用":"(冒号)分隔即可。

ansible  "web1:web2"  -m   ping

(3.)逻辑非(!)匹配

逻辑非用感叹号(!)表示,主要针对多重条件的匹配规则,使用方式如下:

所有在webservers组但不在Phoenix组的主机

webservers:!Phoenix

(4.)逻辑与(&)匹配

和逻辑非一样,逻辑与也主要针对多重条件的匹配规则,只是逻辑上的判断不同。逻辑与使用&表示,请看如下示例:

webservers组和staging组中同时存在的主机

webservers:&staging

(5.)多条件组合

Ansible同样支持多条件的复杂组合,该情况企业应用不多,这里做简单举例说明。

webservers和dbservers两个组中的所有主机在staging组中存在且在Phoenix组中不存在的主机

webservers:dbservers:&staging:!Phoenix

(6.)模糊匹配

*通配符在Ansible表示0个或多个任意字符,主要应用于一些模糊规则匹配,在平时的使用中应用频率非常高,请参考如下示例:

所有以.magedu.com结尾的主机均符合

*.magedu.com

one开头.com结尾的所有主机和dbservers组中的所有主机

one*.com:dbservers

 (7.)域切割

Ansible底层基于python,因此也支持域切割。Python字符串域切割的示例如下:

 
  1. str = '12345678'

  2.  
  3. print = str[0:1]

通过[0:1]即可获取数值1.该功能在Ansible中也支持,以如下Inventory(清单)内容为例:

 
  1. [webservers]

  2.  
  3. cobweb

  4.  
  5. webbing

  6.  
  7. weber

通过上面截取数组下标可以获取到对应变量值。

 
  1. webservers[0] # == cobweb

  2.  
  3. webservers[-1] # == weber

  4.  
  5. webservers[0:1] # == cobweb,webbing

  6.  
  7. webservers[1:] # == webbing,weber

(8.)正则匹配

Ansible同样完整支持正则匹配功能,"~"开始表示正则匹配。

~(web|db).*\.example\.com

检测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

 

  关于Ansible的正则功能到此结束,相信大家在浏览的过程中对其灵活程度也会有所感触,在对Ansible的实际应用过程中也会不断地加深对其理解。

你可能感兴趣的:(Ansible系列命令与Inventory配置详解)