-
什么是
inventory
?
官方解释:Ansible automates tasks on managed nodes or “hosts” in your infrastructure, using a list or group of lists known as inventory.
Ansible
可以同时与您基础设施中的一个或多个系统协同工作。为了与多台服务器协同工作,Ansible
需要与这些服务器建立连接。这是通过使用SSH
(适用于Linux
)和PowerShell
远程处理(适用于Windows
)来完成的。 这就是Ansible
无代理的原因。无代理意味着您不需要在目标机器上安装任何额外的软件,就可以使用Ansible
。一个简单的SSH连接就能满足Ansible的需求。
大多数其他编排工具的主要缺点之一是,在调用任何类型的自动化之前, 都需要在目标系统上配置代理。现在, 有关这些目标系统的信息存储在inventory
文件中。如果您不创建新的inventory
文件,Ansible
将使用位于etc/Ansible/hosts
位置的默认库存文件。让我们看一个示例
Inventory
文件。它只是一个接一个地列出了许多服务器,是ini
格式的。您还可以将不同的服务器分组在一起,方法是在方括号内的组名下定义服务器,并在下面的行中定义属于该组的服务器列表。可以在单个Inventory
文件中定义多个组。
让我们仔细看看Inventory
文件。例如, 我有一个服务器列表,名称从1
到4
。但是, 我想在Ansible
中使用别名(如Web
服务器或数据库服务器)来引用这些服务器。我可以通过在行首添加每个服务器的别名,并将该服务器的地址分配给Ansible
,ansible_host
参数来实现这一点。ansible_host
是一个inventory
参数, 用于指定服务器的域名或IP
地址。
还有其他参数。
其中包括ansible_connection
,ansible_port
,ansible_user
,ansible_ssh_pass
。ansible_connection
: 定义了Ansible
连接到目标服务器的方式。这是到Linux
服务器的ssh
连接或者到Windows
服务器的winrm
。这就是我们定义要连接的目标主机是Linux
主机还是Windows
主机的方式。
您也可以将其设置为localhost
,以表示我们希望使用本地主机,而不连接到任何远程主机。如果您没有多个服务器可供使用, 则可以简单地从清单文件中的本地主机开始。ansible_port
:定义要连接的端口。默认情况下, 它被设置为SSH
的端口22
,但如果您需要更改, 您可以使用这个参数进行不同设置。ansible_user
: 定义用于进行远程连接的用户。默认情况下,对于Linux
计算机, 设置为root
。果需要更改此设置, 可以用这个参数。ansible_ssh_pass
: 定义了Linux
的ssh
密码。请注意, 以这种纯文本格式存储密码可能不是很理想。最佳实践是在服务器之间设置基于SSH
密钥的无密码身份验证,并且您绝对应该在生产或公司环境中这样做。 如果是windows
,使用ansible_password
。
但现在, 我们想从Ansible的基本知识开始,而不想过多地讨论安全性或其他主题。因此, 首先, 我们将从用户名和密码的基本设置开始。
-
inventory
实战
1)打开宿主机mac
上的terminal
,ssh
进入到ansiblecontroller
,然后通过vim
命令创建一个inventory.txt
文件,写入如下的配置。这里指定了target1
作为别名,可以在Ansible
中用别名来访问这台虚拟机;同时指定了ssh
连接的密码(通常公司的系统上不推荐使用这种方式,应该用ssh key
,实现无密码访问)
2)使用Ansible
使用ping
测试controller
到target1
是否能连通,同时带上inventory
配置文件ansible target1 -m ping -i inventory.txt
幸运的是,你可能会遇到下面这个错误:
target1 | FAILED! => { "msg": "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." }
解决方式有两种:- 从
ansible-controller
手动ssh
连接到ansible-target1
,然后手动接受fingerprint
- 在
ansible-controller
的配置文件/etc/ansible/ansible.cfg
,并且搜host key
,将host_key_checking
标记为False
,默认是true
。(不推荐这样干)# uncomment this to disable SSH key host checking #host_key_checking = False
- 从
-
接受
fingerprint
完成之后,继续使用ansible target1 -m ping -i inventory.txt
测试连通性
很幸运的是,又可能又会遇到下面这个错误:
一般是因为指定的inventory
文件路径不对,-i
读取的是当前所在路径下的inventory.txt
,也就是/etc/ansible/inventory.txt
,实际上我们创建的inventory.txt
是在用户目录。[osboxes@ansiblecontroller ansible]$ ansible target1 -m ping -i inventory.txt [WARNING]: Unable to parse /etc/ansible/inventory.txt as an inventory source [WARNING]: No inventory was parsed, only implicit localhost is available [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' [WARNING]: Could not match supplied host pattern, ignoring: target1
先
cd ~
,然后再跑上面的ansible
命令,看见下面类似的返回,就表示成功了[osboxes@ansiblecontroller ~]$ ansible target1 -m ping -i inventory.txt target1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
-
最后给一个完整的
inventory
例子,包含group
的用法:# Sample Inventory File # Web Servers web_node1 ansible_host=web01.xyz.com ansible_connection=winrm ansible_user=administrator ansible_password=Win$Pass web_node2 ansible_host=web02.xyz.com ansible_connection=winrm ansible_user=administrator ansible_password=Win$Pass web_node3 ansible_host=web03.xyz.com ansible_connection=winrm ansible_user=administrator ansible_password=Win$Pass # DB Servers sql_db1 ansible_host=sql01.xyz.com ansible_connection=ssh ansible_user=root ansible_ssh_pass=Lin$Pass sql_db2 ansible_host=sql02.xyz.com ansible_connection=ssh ansible_user=root ansible_ssh_pass=Lin$Pass [db_nodes] sql_db1 sql_db2 [web_nodes] web_node1 web_node2 web_node3 [boston_nodes] sql_db1 web_node1 [dallas_nodes] sql_db2 web_node2 web_node3
更多关于
Ansible
的文章,请参考我的Ansible
专栏:https://blog.csdn.net/u011069294/category_12331290.html