一、Inventory介绍

  在Ansible中描述主机的默认方法是将它们列在一个文本文件中,这个文本文件叫作inventory文件。Ansible Inventory 是包含静态 Inventory 和动态 Inventory 两部分的,静态 Inventory 指的是在文件中指定的主机和组,动态 Inventory 指通过外部脚本获取主机列表,并按照 ansible 所要求的格式返回给 ansilbe 命令的。这部分一般会结合 CMDB 资管系统、云计算平台等获取主机信息。此博文主要介绍静态Inventory的配置定义方法。默认的文件路径为 /etc/ansible/hosts。除默认文件外,你还可以同时使用多个 inventory 文件。如果需要使用非默认的Inventory文件,在执行Ansible命令时使用-i参数指定Inventory文件。

二、定义方法

1、基于密码管理

[root@test1 ansible]# vim /etc/ansible/hosts
[test]
test1 ansible_ssh_host=192.168.0.124 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=“123456”
test2 ansible_ssh_host=192.168.0.125 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=“123456”
test3 ansible_ssh_host=192.168.0.126 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=“123456”

2、基于密钥管理

1)、首先生成公钥

[root@test1 ansible]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:e4/VuQ4P5Ux2Ej55r/Mx7pJEueQsvGiHTV6lupobyjE root@test1
The key’s randomart image is:
±–[RSA 2048]----+
| |
| |
| o |
| = + |
| S . = % o|
| . + # *.|
| E…B X *o.|
| . +=oX *ooo|
| o.+=.o.B=.|
±—[SHA256]-----+

2)、将公钥上传到被管理主机

[root@test1 ansible]# ssh-copy-id 192.168.0.124
[root@test1 ansible]# ssh-copy-id 192.168.0.125
[root@test1 ansible]# ssh-copy-id 192.168.0.126
上传公钥到被管理机时需要输入被管理机的账户密码

3)、配置基于密钥管理的inventory文件

[root@test1 ansible]# vim host3

[test]
192.168.0.12[4:6]
#如上方式配置等同于
192.168.0.124
192.168.0.125
192.168.0.126

4)、验证

[root@test1 ansible]# ansible -i /etc/ansible/host3 test -m shell -a “df -hT”
192.168.0.126 | CHANGED | rc=0 >>
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 xfs 38G 4.2G 34G 11% /
devtmpfs devtmpfs 471M 0 471M 0% /dev
tmpfs tmpfs 487M 0 487M 0% /dev/shm
tmpfs tmpfs 487M 51M 436M 11% /run
tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 xfs 297M 147M 151M 50% /boot
tmpfs tmpfs 98M 0 98M 0% /run/user/0
192.168.0.125 | CHANGED | rc=0 >>
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 xfs 38G 4.2G 34G 11% /
devtmpfs devtmpfs 471M 0 471M 0% /dev
tmpfs tmpfs 487M 0 487M 0% /dev/shm
tmpfs tmpfs 487M 45M 442M 10% /run
tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 xfs 297M 147M 151M 50% /boot
tmpfs tmpfs 98M 0 98M 0% /run/user/0
192.168.0.124 | CHANGED | rc=0 >>
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 xfs 38G 4.4G 34G 12% /
devtmpfs devtmpfs 471M 0 471M 0% /dev
tmpfs tmpfs 487M 124K 487M 1% /dev/shm
tmpfs tmpfs 487M 8.1M 479M 2% /run
tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 xfs 297M 147M 151M 50% /boot
tmpfs tmpfs 98M 0 98M 0% /run/user/0

三、Inventory行为参数说明

参数

默认值

参数说明

ansible_ssh_host

主机名

ssh目标主机名或者IP

ansible_ssh_port ssh

22

ssh目标端口

ansible_ssh_user

root

ssh登录使用的用户名

ansible_ssh_pass

none

ssh认证使用的密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)

ansible_sudo_pass sudo

none

sudo密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)

ansible_sudo_exe

/usr/bin

sudo 命令路径(适用于1.8及以上版本)

ansible_connection

smart

与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 ‘smart’,‘smart’ 方式会根据是否支持 ControlPersist, 来判断’ssh’ 方式是否可行.

ansible_ssh_private_key_file

none

ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.

ansible_shell_type

sh

目标系统的shell类型.默认情况下,命令的执行使用 ‘sh’ 语法,可设置为 ‘csh’ 或 ‘fish’.

ansible_python_interpreter

/usr/bin

目标主机的 python 路径。适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 *BSD, 或者 /usr/bin/python 不是 2.X 版本的 Python。我们不使用 “/usr/bin/env” 机制,因为这要求远程用户的路径设置正确,且要求 “python” 可执行程序名不可为 python以外的名字(实际有可能名为python26)。

ansible_*_interpreter

none

类似ansible_python_interpreter配置的其他语言版

四、配置技巧

1、分组配置

方括号[]中是组名,用于对系统进行分类,便于对不同系统进行个别的管理。下面则属于其组的主机,可以是IP或主机名(需要能被DNS解析成IP)。

2、组嵌套

可以把一个组作为另一个组的子成员,以及分配变量给整个组使用。这些变量可以给 /usr/bin/ansible-playbook 使用,但不能给 /usr/bin/ansible 使用。

3、主机和端口连写

如果有主机的SSH端口不是默认的22端口,可以在主机名后面用冒号分隔,指定一个端口。

[DBs]
192.168.0.127:2222

4、设置别名

假设你有一些静态IP地址,希望设置一些别名,但不是在系统的 host 文件中设置,又或者你是通过隧道在连接,那么可以设置如下:

[dbs]
test2 ansible_ssh_host=192.168.0.125 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=“123456”

5、IP连写

当主机为连续地址时支持IP或者字符连写,前提是其他参数一致或者使用密钥登录。

[apps]
192.168.0.12[4:6] ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=“123456”