Inventory详解
Ansible 可以根据Inventory文件实现同时配置多个系统。这个文件位于/etc/ansible/hosts
。实际使用的时候可以编写多个Inventory文件,使用的时候用-i
参数临时指定就行。
这个文件不仅可以自己编写、编写多个。配置的时候不光可以使用本地的资源,也可以使用云端的资源。
这个文件可以编写成多种格式,常用的有:INI,YAML。
Inventory基础:多台主机分组
表示同一个意思的inventory文件可以用INI写也可以用YAML写,不过需要安装对应的插件。
INI格式的是这样:
mail.example.com
[webservers]
foo.example.com
bar.example.com
[dbservers]
one.example.com
two.example.com
three.example.com
方括号里面的是组名,未达到见名知义的效果,最好让这个名字体现出:这是个什么操作系统,它被用来干什么事,一般什么时间运行。
这个文件用YAML格式写是这样:
all:
hosts:
mail.example.com:
children:
webservers:
hosts:
foo.example.com:
bar.example.com:
dbservers:
hosts:
one.example.com:
two.example.com:
three.example.com:
将多台主机配置到多个组
可以给多个组同时装系统,于是可以做到这种效果:一台主机既是一个web服务器,又是一个数据库服务器。
创建组的时候可以用这样一种思路:
用来干啥
应用,栈,微服务。比如: database servers , web servers。
在哪里
在哪个数据中心或哪个区域的本地的DNS服务器,storage存储服务器。比如:east,west。
什么阶段
开发阶段,需要避免测试线上代码。比如:prod,test。
包含以上的三种思想的YAML格式的Inventory文件可以写成这样:
all:
hosts:
mail.example.com:
children:
webservers:
hosts:
foo.example.com:
bar.example.com:
dbservers:
hosts:
one.example.com:
two.example.com:
three.example.com:
east:
hosts:
foo.example.com:
one.example.com:
two.example.com:
west:
hosts:
bar.example.com:
three.example.com:
prod:
hosts:
foo.example.com:
one.example.com:
two.example.com:
test:
hosts:
bar.example.com:
three.example.com:
可以看到one.example.com
在dbservers
组中,也在east
组中,也在prod
组中。
也可以使用嵌套的方式简化这个文件:
all:
hosts:
mail.example.com:
children:
webservers:
hosts:
foo.example.com:
bar.example.com:
dbservers:
hosts:
one.example.com:
two.example.com:
three.example.com:
east:
hosts:
foo.example.com:
one.example.com:
two.example.com:
west:
hosts:
bar.example.com:
three.example.com:
# 以上相同
prod:
children:
east:
test:
children:
west:
如果用了这种简写的方法,要注意变量代表它包含的所有主机。
多台主机使用不同端口
如果有的主机没有用默认ssh端口,那么在主机名后加上端口就行。
如果要配置的主机的端口号确实不是默认端口22,那最好还是配一下端口。
就像这样:
badwolf.example.com:5309
如果主机的IP是静态的,不会变更,而且连接的时候需要通过隧道连接,那可以在hosts文件中配置一下别名。
INI文件这样配:
jumper ansible_port=5555 ansible_host=192.0.2.50
别名 端口号 主机名
YAML文件这样配:
...
hosts:
jumper:
ansible_port: 5555
ansible_host: 192.0.2.50
如果写入的主机名称有统一的模式,可以这样简写:
INI格式:
[webservers]
www[01:50].example.com
YAML格式:
...
webservers:
hosts:
www[01:50].example.com:
对于数字的模式匹配,前导0可以根据需要加上或者去掉,前后的范围是闭区间的,两个边界值都可以取到。
也可以定义字母范围:
[databases]
db-[a:f].example.com
也可以选择连接类型和每个主机的用户:
[targets]
localhost ansible_connection=local
other1.example.com ansible_connection=ssh ansible_user=mpdehaan
other2.example.com ansible_connection=ssh ansible_user=mdehaan
主机 连接类型 连接用户
如上所述,在inventory文件中设置这些只是一种简化方法,稍后我们将讨论如何将它们存储在host_vars目录中的各个文件中。
用变量指代一台主机:主机变量
主机也可以用变量指代,而且现在指定的变量在后面的playbook中会用到。
INI格式:
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
YAML格式:
atlanta:
host1:
http_port: 80
maxRequestsPerChild: 808
host2:
http_port: 303
maxRequestsPerChild: 909
用变量指代多台主机:组变量
变量也可以一次应用到整个组。
INI格式:
[atlanta]
host1
host2
[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
YAML格式:
atlanta:
hosts:
host1:
host2:
vars:
ntp_server: ntp.atlanta.example.com
proxy: proxy.atlanta.example.com
组变量继承:子组变量
也可以配置子组,以及使用子组变量
INI格式 | YAML格式 | |
---|---|---|
子组 | :children |
children: |
子组变量 | :vars |
vars: |
INI格式:
[atlanta]
host1
host2
[raleigh]
host2
host3
[southeast:children]
atlanta
raleigh
[southeast:vars]
some_server=foo.southeast.example.com
halon_system_timeout=30
self_destruct_countdown=60
escape_pods=2
[usa:children]
southeast
northeast
southwest
northwest
YAML格式:
all:
children:
usa:
children:
southeast:
children:
atlanta:
hosts:
host1:
host2:
raleigh:
hosts:
host2:
host3:
vars:
some_server: foo.southeast.example.com
halon_system_timeout: 30
self_destruct_countdown: 60
escape_pods: 2
northeast:
northwest:
southwest:
几个默认组
有两个默认组:all和ungrouped。
all包含所有主机
ungrouped包含只属于all组的主机
每个主机至少属于两个组
尽管all和ungrouped始终存在,但它们可以是隐式的,不会出现在group_names之类的组清单中。
最新评论