002.Ansible之Inventory文件
一 简介
在使用Ansible来批量管理主机的时候,通常我们需要先定义要管理哪些主机或者主机组,而这个用于管理主机与主机组的文件就叫做Inventory,也叫主机清单。该文件默认位于/etc/ansible/hosts。当然我们也可以通过修改ansible配置文件的hostfile配置项来修改默认inventory的位置。
二 定义主机和组
有五个主机
node1 192.168.132.131 主控端
node2 192.169.132.132 被控端
node3 192.169.132.133 被控端
node4 192.169.132.134 被控端
node5 192.169.132.135 被控端
2.1 直接写进hosts文件
对于/etc/ansible/hosts最简单的定义格式像下面,直接把IP写在里面:
[root@node1 ansible]# cat /etc/ansible/hosts
localhost
192.168.132.132
192.168.132.133
192.168.132.134
192.168.132.135
2.2 简单实用ping模块检测连通性
[root@node1 ansible]# ansible 192.168.132.132 -m ping
ansible 指定主机或者主机组 -m 后跟使用的模块,ping是ansible测试和被控端的连通性
是因为没有配置密码认证也没有配置ssh秘钥自动连接,主机之间不能交互
方法一:
修改配置,可以输入密码
[root@node1 ansible]# vim /etc/ansible/ansible.cfg
[defaults] # some basic default values... #inventory = /etc/ansible/hosts
#library = /usr/share/my_modules/
#module_utils = /usr/share/my_module_utils/
#remote_tmp = ~/.ansible/tmp
#local_tmp = ~/.ansible/tmp
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
#forks = 5
#poll_interval = 15
#sudo_user = root
#ask_sudo_pass = True
ask_pass = True #打开这个配置
#transport = smart
#remote_port = 22
#module_lang = C
#module_set_locale = False
再次执行
使用秘钥自动登录认证
恢复配置,注释掉ack_pass
[root@node1 ansible]# ssh-copy-id root@192.168.132.132
[root@node1 ansible]# ansible 192.168.132.132 -m ping
不用输入密码,也可以使用模块操作
方法三,使用hosts配置密码
修改hosts文件
[root@node1 ansible]# cat /etc/ansible/hosts
localhost
192.168.132.132
192.168.132.133 ansible_ssh_pass=redhat
192.168.132.134
192.168.132.135
执行
[root@node1 ansible]# ansible 192.168.132.133 -m ping
在这里可以使用这种方式推送key到被控端,然后删掉hosts的密码配置
2.3 实用普通用户控制
配置普通用户
[root@node2 ~]# useradd ansible
[root@node2 ~]# vim /etc/sudoers.d/ansible
ansible ALL=(ALL) NOPASSWD: ALL
配置秘钥
[root@node2 ~]# mkdir /home/ansible/.ssh
[root@node2 ~]# cp /root/.ssh/authorized_keys /home/ansible/.ssh/
[root@node2 ~]# chmod 600 /home/ansible/.ssh/authorized_keys
[root@node2 ~]# chown ansible:ansible /home/ansible/.ssh -R
[root@node2 ~]# ll /home/ansible/.ssh/ -d
drwxr-xr-x 2 ansible ansible 29 Apr 27 10:52 /home/ansible/.ssh/
[root@node2 ~]# ll /home/ansible/.ssh/authorized_keys
-rw------- 1 ansible ansible 0 Apr 27 10:52 /home/ansible/.ssh/authorized_keys
主控段配置ansible用户
[root@node1 ansible]# vim ansible.cfg
remote_user = ansible
检查连通性
检查用户,使用shell模块
但是到133就会报错,用户被denied
按照相同方式配置其他几台机器配置ansible用户,并提权设置
2.4 hosts文件管理
使用主机名连接,则需要保证主机名可以被解析
[root@node1 ansible]# cat /etc/ansible/hosts
localhost
node2
192.168.132.133
192.168.132.134
192.168.132.135
不能解析
添加/etc/hosts
[root@node1 ansible]# vim /etc/hosts
192.168.132.132 node2
[root@node1 ansible]# ansible node2 -m shell -a "whoami"
node2 | CHANGED | rc=0 >>
ansible
也可以配置/etc/ansivle/hosts
[root@node1 ansible]# vim /etc/ansible/hosts
localhost
node2
node3 ansible_ssh_host=192.168.132.133
192.168.132.134
192.168.132.135
也可以使用主机名
但是不能使用IP
连接自己[root@node1 ansible]# ansible localhost -m ping
也可以直接指定
[root@node1 ansible]# vim /etc/ansible/hosts
localhost ansible_connection=local
node2
node3 ansible_ssh_host=192.168.132.133
192.168.132.134
192.168.132.135
三 主机分组
配置都使用主机组
3.1 简答配置
[root@node1 ansible]# vim /etc/hosts
192.168.132.131 node1
192.168.132.132 node2
192.168.132.133 node3
192.168.132.134 node4
192.168.132.135 node5
[root@node1 ansible]# vim /etc/ansible/hosts
[web]
node1
node2
[mysql]
node3
node4
[redis]
node5
执行
[root@node1 ansible]# ansible web -m ping
一个主机可位于多个组
[web]
node1
node2
[mysql]
node3
node4
[redis]
node5
[php]
node1
node3
执行
[root@node1 ansible]# ansible php -m shell -a "hostname"
# 中括号中的名字代表组名,可以根据自己的需求将庞大的主机分成具有标识的组,如上面分了两个组webservers和dbservers组;
# 主机(hosts)部分可以使用域名、主机名、IP地址表示;当然使用前两者时,也需要主机能反解析到相应的IP地址,一般此类配置中多使用IP地址;
node4
[web]
node1
node2
[mysql]
node3
node4
[redis]
node5
[php]
node1
node3
hosts的名字可以使用其他的文件名,但是默认找hosts文件,需要用到其他文件
[root@node1 ansible]# cp hosts inventory
[root@node1 ansible]# ansible -i inventory php -m shell -a "hostname"
也可以使用飞hosts命名的文件
3.2 指定主机范围
# 下面指定了从web-node01到web-node50,webservers组共计50台主机;databases组有db-node-a到db-node-f共6台主机
[webservers]
web-node[01:50].test.com
[databases]
db-node[a:f].test.com
3.3 定义主机组嵌套
# 如下示例中,production组包含两个子组,分别为webservers和dbservers,webservers和dbservers组分别包含若干主机
[webservers]
node1
node2
[dbservers]
node3 [php:children]
webservers
dbservers
执行
[root@node1 ansible]# ansible php -m shell -a "echo hostname"
node3 | CHANGED | rc=0 >>
hostname
node2 | CHANGED | rc=0 >>
hostname
node1 | CHANGED | rc=0 >>
hostname
两个主机组都有打印
四 选择主机与组
在前面定义Inventory的时候,我们会把所有被管理主机通过主机组的方式定义到Inventory当中,但是当我们实际使用的时候,可能只需要对某一主机或主机组进行操作,这个时候就需要通过匹配的方式指定某一特定主机或主机组。
4.1 定义主机组
在此之前,先定义一个主机清单示例:
[root@node1 ansible]# cat /etc/ansible/hosts
srv1.example.com
srv2.example.com
s1.lab.example.com
s2.lab.example.com [web]
jupiter.lab.example.com
saturn.example.com [db]
db1.example.com
db2.example.com
db3.example.com [lb]
lb1.lab.example.com
lb2.lab.example.com [boston]
db1.example.com
jupiter.lab.example.com
lb2.lab.example.com [london]
db2.example.com
db3.example.com
file1.lab.example.com
lb1.lab.example.com [dev]
web1.lab.example.com
db3.example.com [stage]
file2.example.com
db2.example.com [prod]
lb2.lab.example.com
db1.example.com
jupiter.lab.example.com [function:children]
web
db
lb
city [city:children]
boston
london
environments [environments:children]
dev
stage
prod
new [new]
172.25.252.23
172.25.252.44
14.2 匹配所有主机
可以通过all
或者*
来指定匹配所有主机,通过如下指令查看all
匹配到的主机:
[root@node1 ansible]# ansible all --list-hosts
或者
4.3 匹配指定的主机或主机组
匹配单个组
[root@node1 ansible]# ansible prod --list-hosts
匹配单个主机
[root@node1 ansible]# ansible db2.example.com --list-hosts
hosts (1):
db2.example.com
匹配多个主机
[root@node1 ansible]# ansible 'lb1.lab.example.com,s1.lab.example.com,db1.example.com' --list-hosts
hosts (3):
lb1.lab.example.com
s1.lab.example.com
db1.example.com
匹配多个组
[root@node1 ansible]# ansible 'london,boston' --list-hosts
hosts (7):
db2.example.com
db3.example.com
file1.lab.example.com
lb1.lab.example.com
db1.example.com
jupiter.lab.example.com
lb2.lab.example.com
匹配不属于任何组的主机
[root@node1 ansible]# ansible ungrouped --list-hosts
hosts (4):
srv1.example.com
srv2.example.com
s1.lab.example.com
s2.lab.example.com
4.4 通配符匹配
匹配'*.example.com':
[root@node1 ansible]# ansible '*.example.com' --list-hosts
hosts (14):
s1.lab.example.com
file1.lab.example.com
lb1.lab.example.com
srv2.example.com
db3.example.com
srv1.example.com
web1.lab.example.com
db2.example.com
db1.example.com
jupiter.lab.example.com
lb2.lab.example.com
file2.example.com
s2.lab.example.com
saturn.example.com
匹配172.25.*
的主机:
[root@node1 ansible]# ansible '172.25.*' --list-hosts
[root@node1 ansible]# ansible '172.25.*' --list-hosts
hosts (2):
172.25.252.23
172.25.252.44
匹配以s
开头的主机及主机组:
[root@node1 ansible]# ansible 's*' --list-hosts
hosts (7):
file2.example.com
db2.example.com
s1.lab.example.com
srv2.example.com
srv1.example.com
s2.lab.example.com
saturn.example.com
4.5 通配符组合匹配
匹配包含*.example.com
但不包含*.lab.example.com
的主机:
[root@node1 ansible]# ansible '*.example.com,!*.lab.example.com' --list-hosts
hosts (7):
srv2.example.com
db3.example.com
srv1.example.com
db2.example.com
db1.example.com
file2.example.com
saturn.example.com
匹配包含prod以及172开头、包含lab关键字的主机或组
[root@node1 ansible]# ansible 'prod,172*,*lab*' --list-hosts
hosts (10):
lb2.lab.example.com
db1.example.com
jupiter.lab.example.com
172.25.252.23
172.25.252.44
s1.lab.example.com
file1.lab.example.com
lb1.lab.example.com
web1.lab.example.com
s2.lab.example.com
匹配属于db组同时还属于london组的主机:
[root@node1 ansible]# ansible 'db,&london' --list-hosts
hosts (2):
db2.example.com
db3.example.com
匹配在london组或者boston组,还必须在prod组中且必须不在lb组中的主机:
[root@node1 ansible]# ansible 'boston,london,&prod,!lb' --list-hosts
hosts (2):
db1.example.com
jupiter.lab.example.com
4.6 正则表达式匹配
在开头的地方使用”~”,用来表示这是一个正则表达式:
[root@node1 ansible]# ansible '~(s|db).*example\.com' --list-hosts
hosts (8):
s1.lab.example.com
srv2.example.com
db3.example.com
srv1.example.com
db2.example.com
db1.example.com
s2.lab.example.com
saturn.example.com
4.7 通过--limit
明确指定主机或组
通过--limit
在选定的组中明确指定主机:
[root@node1 ansible]# ansible ungrouped --limit srv1.example.com --list-hosts
hosts (1):
srv1.example.com
通过--limit
参数,还可以指定一个文件,该文件中定义明确指定的主机的列表,定义一个retry_hosts.txt如下:
[root@node1 ansible]# vim retry_hosts.txt
srv1.example.com
[root@node1 ansible]# ansible ungrouped --limit @retry_hosts.txt --list-hosts
hosts (1):
srv1.example.com
4.8 通配符和正则表达式配合使用
[root@node1 ansible]# ansible '~(s|db).*,prod,*.lab.example.com' --list-hosts
hosts (14):
db1.example.com
db2.example.com
db3.example.com
file2.example.com
s1.lab.example.com
srv2.example.com
srv1.example.com
s2.lab.example.com
saturn.example.com
lb2.lab.example.com
jupiter.lab.example.com
file1.lab.example.com
lb1.lab.example.com
web1.lab.example.com
主机组示例结束
博主声明:本文的内容来源主要来自誉天教育晏威老师,由本人实验完成操作验证,需要的博友请联系誉天教育(http://www.yutianedu.com/),获得官方同意或者晏老师(https://www.cnblogs.com/breezey/)本人同意即可转载,谢谢!
002.Ansible之Inventory文件的更多相关文章
- Ansible学习 Inventory文件
Ansible可同时操作属于一个组的多台主机,组与主机之间关系配置在inventory文件中,inventory默认的配置文件是/etc/ansible/hosts 1.在/etc/ansible/h ...
- ansible的inventory文件含义
默认文件为/etc/ansible/hosts 例如 [test] web.yinzhipeng.com dhcp ansible_ssh_host=172.16.18.195 1.中括号中的名字代表 ...
- Ansible 之动态Inventory文件(二)
上篇主要讲解了Ansible 的安装和配置,并且根据不同的业务场景将服务器的信息存放在Ansible的Inventory中,其实存放这样的数据每次更新都需要我们自动的添加和删除,这样对于我们维护起来很 ...
- Ansible主机清单Inventory文件hosts
Ansible主机清单Inventory文件hosts 发表于 2017-05-14 | 分类于 运维相关 , Ansible | | 阅读次数 4638 | 字数统计 1,442 | 阅读时长预计 ...
- Ansible之 Inventory 资源清单介绍
一.Inventory 库存清单文件 1.Inventory 作用 Ansible 可以在同一时间针对多个系统设施进行管理工作.它通过选择Ansible 资源清单文件中列出的系统,该清单文件默认是在/ ...
- 002. Ansible部署及配置介绍
一 Ansible的安装部署 1.1 PIP方式 安装PIP 略,可参考<001.Pip简介及使用>. 提示:建议将PIP升级到最新:pip install --upgrade pip. ...
- (2)ansible主机清单文件inventory
1)inventory作用 作用:通常用于定义要管理主机的认证信息,例如ssh登录用户名,密码等相关信息 缺省文件:/etc/ansible/hosts 2)定义主机组方式 #vim /etc/ans ...
- Ansible的Inventory管理
Ansible将可管理的服务器集合成为Inventory,Inventory的管理便是服务器的管理. hosts文件的位置: /etc/ansible/hosts 在命令行通过-i参数指定 通过/et ...
- 结合P2P软件使用Ansible分发大文件
一 应用场景描述 现在我需要向50+数量的服务器分发Logstash新版本的rpm包,大概220MB左右,直接使用Ansible的copy命令进行传输,命令如下: 1 ansible all -m ...
随机推荐
- DSP代码搬运至RAM运行
程序运行过程中,有些函数或程序段和数据等经常调用,正常情况下在FLASH中运行处理消耗时间和资源较大,通常将其移植至RAM中运行,可提高运行效率. 如: 1 #pragma CODE_SECTION( ...
- 茫茫内存,我该如何用 windbg 找到你 ?
一:背景 1. 讲故事 前天wx上有个朋友丢给我一个dump,让我帮忙鉴定一下某些敏感信息在内存中是否也是加密的,现在数据安全很重要,不仅数据库中的信息要加密,灌到内存后数据同样也需密文存储,随用随解 ...
- get_started_3dsctf_2016-Pwn
get_started_3dsctf_2016-Pwn 这个题确实有点坑,在本地能打,在远程就不能打了,于是我就换了另一种方法来做. 确这个题是没有动态链接库,且PIE是关的,所以程序的大部分地址已经 ...
- 【笔记】《Redis设计与实现》chapter19 事务
chapter19 事务 Redis通过MULTI.EXEC.WATCH等命令来实现事务功能 19.1 事务的实现 事务开始 redis> MULTI ok 通过切换客户端状态的flag属性的R ...
- 自定义函数和调用函数 return返回值
1.Q: 为什么要有函数,函数是什么? A: 函数能提高应用的模块性,和代码的重复利用率 2. 函数分为两个阶段: 1.定义阶段 2.调用阶段 3.关于函数调用: 01.函数的内存地址加上()就是调用 ...
- (十三)VMware Harbor 身份验证模式
VMware Harbor 修改Harbor仓库admin用户 参考:https://blog.csdn.net/qq_40460909 https://blog.csdn.net/qq_404609 ...
- 在 Y 分钟内学会 Python
在 Y 分钟内学会 Python 这是翻译, 原文地址: Learn Python in Y Minutes 在 90 年代初, Python 由 Guido van Rossum 创造, 现在, 它 ...
- php引入html文件(或php文件)的方法
php引入html文件(或php文件)的方法 一.使用fopen()函数 此函数主要传入的是头两个参数(第一个是文件地址,第二个是打开方式),可以读取任何一个文本文件,然后用while将fopen函 ...
- hdu1815 2sat + 二分 + 建图
题意: 给你两个总部,s1 ,s2,和n个点,任意两点之间都是通过这个总部相连的,其中有一些点不能连在同一个总部上,有一些点可以连接在同一个总部上,总部和总部之间可以直接连接,就是假如a, ...
- 基于三层交换机的VRRP技术--MSTP、VRRP的综合运用
MSTP (多生成树) 每个VLAN或者几个VLAN拥有一颗生成树,基于实例的生成树.instance 1.instance 2 每个实例拥有一颗生成树.MSTP可以实现多VLAN 的负载分担,可以实 ...