为了练习方便,本次使用一台虚拟机,多个主机名模拟多台虚拟机操作1,省事省力,方便学习。
操作
# 若已经配置,则无须再次执行此处命令
[root@master ~]# ssh-keygen
[root@master ~]# cd .ssh/
[root@master .ssh]# cat id_rsa.pub >> authorized_keys
测试
ssh localhost
[root@master ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.176.200 master test1 test2 test3
Ansible 可同时操作属于一个组的多台主机,组和主机之间的关系通过 inventory 文件配置. 默认的文件路径为 /etc/ansible/hosts。简单理解
/etc/ansible/hosts
就是Inventory文件。目的就是存储主机与组之间的关系。
有点懵?主机我可能知道,但什么是组,靠什么定义组
主机: /etc/hosts 配置的主机名,通过DNS获取的域名,都可称为主机
组:一类主机的组合
[root@master ansible]# cat /etc/ansible/hosts
master #主机,此处和/etc/hosts内容对应
test1
[test] # 主机组,包含一系列主机,可以附加端口号的
test1:22
test2
[test_other] # test2 机属于 test组也属于test_other组
test2
test3
方括号
[]
中是组名,用于对系统进行分类,便于对不同系统进行个别的管理。一个主机可以属于多个组哦
如果有主机的SSH端口不是标准的22端口,可在主机名之后加上端口号,用冒号分隔。
端口号不是默认设置时,可明确的表示为:
master:5309
假设你有一些静态IP地址,希望设置一些别名,但不是在系统的 host 文件中设置,又或者你是通过隧道在连接,那么可以设置如下:
testhost ansible_ssh_host=192.168.0.200 ansible_ssh_port=22
变量:变量可分为系统变量2和自定义变量3
系统变量说明
ansible_ssh_host
将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port
ssh端口号.如果不是默认的端口号,通过此变量设置.
ansible_ssh_user
默认的 ssh 用户名
ansible_ssh_pass
ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
ansible_sudo_pass
sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)
ansible_sudo_exe (new in version 1.8)
sudo 命令路径(适用于1.8及以上版本)
ansible_connection
与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.
ansible_ssh_private_key_file
ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
ansible_shell_type
目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish'.
ansible_python_interpreter
目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python
不是 2.X 版本的 Python.我们不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).
与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....
主机变量:就是一个主机可携带其他参数,而这些参数可以给playbooks使用
组变量:一个组下的变量可供给这个组的全部成员使用,目的就是减少重复配置
[root@master ansible]# cat hosts
master
test1
test_local ansible_ssh_host=192.168.0.200
[test]
test1
test2
[test_other]
test2
test3
[test:vars] # 组变量标识:vars,要设置组变量这个标志是必须的
http_port=2222 # test组内的所有主机都可以拿到此变量
max_proc=20# test组内的所有主机都可以拿到此变量
[root@master ansible]# cat hosts
master
test1
test_local ansible_ssh_host=192.168.0.200
[test]
test1
test2
[test_other]
test2
test3
[test:vars]
http_port=2222
max_proc=20
# 在这里 test_all = test + test_other 是等于关系哦
[test_all:children] # test_all组包含 test组及test_other组的所有成员
test
test_other
不同于 inventory 文件
/etc/ansible/hosts
(INI 格式),这些独立(子)文件的格式为 YAML
操作
# 创建默认目录
[root@master ansible]# mkdir -p /etc/ansible/group_vars
[root@master ansible]# mkdir -p /etc/ansible/host_vars
# 主机变量,对应test1
[root@master host_vars]# cat /etc/ansible/host_vars/test1
---
ntp_server: 192.168.202.111
# 组变量,对应[test]组
[root@master group_vars]# cat /etc/ansible/group_vars/test
---
http_port: 22
database: localhost
还有更进一步的运用,你可以为一个主机
,或一个组
,创建一个目录
,目录名就是主机名或组名.目录中的可以创建多个文件, 文件中的变量都会被读取为主机或组的变量,支持版本
Ansible1.4+
# 主机变量,对应test1
[root@master host_vars]# cat /etc/ansible/host_vars/test1/config
---
ntp_server: 192.168.202.111
# 组变量,对应[test]组
[root@master group_vars]# cat /etc/ansible/group_vars/test/config
---
http_port: 22
database: localhost
Tip
: Ansible 1.2
及以上的版本中,group_vars/ 和 host_vars/ 目录可放在 inventory 目录下,或是 playbook 目录下. 如果两个目录下都存在,那么 playbook 目录下的配置会覆盖 inventory 目录的配置.
即一台虚拟机的一个ip地址对应多个hostname ↩︎
系统变量像前面的ansible_ssh_host
等ansible已经占有的变量 ↩︎
自定义变量就是自己定义的变量,并没有其他要求 ↩︎