前言:
?在日常使用Ansible自动化运维工具时,肯定都会配置管理端与被控端的无密码连接,,需要注意的是虽然ssh默认连接端口为22.但是在实际生产环境中,为了安全考虑,很有可能某些主机的ssh端口被更改了,所以就需要使用ansible_ssh_port=端口号 来指定某台主机的ssh端口或者用户名,指定之后ansible才可以正常的控制这些主机.
环境介绍:
管理主机 k8s_master1 192.168.1.18
被托管主机 k8s_node1 192.168.1.19
被托管主机 K8S_node2 192.168.1.20
操作系统 Centos 7.5
被托管主机k8s_node1配置:
1.查看被托管主机k8s_node1的ssh默认端口
[root@k8s_node1 ~]# ss -antulp |grep :22
tcp LISTEN 0 128 *:22 *:* users:(("sshd",pid=886,fd=3))
tcp LISTEN 0 128 :::22 :::* users:(("sshd",pid=886,fd=4))
2.修改被托管主机k8s_node1的ssh默认端口
[root@k8s_node1 ~]# vim /etc/ssh/sshd_config
...
17 Port 222 //默认端口为22,修改为222并取消注释
18 #AddressFamily any
...
3.重启被托管主机k8s_node1的sshd服务
[root@k8s_node1 ~]# systemctl restart sshd
[root@k8s_node1 ~]# ss -antulp | grep sshd
tcp LISTEN 0 128 *:222 *:* users:(("sshd",pid=1801,fd=3))
tcp LISTEN 0 128 :::222 :::* users:(("sshd",pid=1801,fd=4))
[root@k8s_node1 ~]# ss -antulp | grep :222
tcp LISTEN 0 128 *:222 *:* users:(("sshd",pid=1801,fd=3))
tcp LISTEN 0 128 :::222 :::* users:(("sshd",pid=1801,fd=4))
?可以看到被托管主机k8s_node1的ssh端口已经被修改为222了,现在使用ansible来控制。
管理主机k8s_master1测试:
[root@k8s_master1 ~]# cat /etc/ansible/hosts //查看ansible控制的主机列表
...
[k8s_node]
k8s_node1
k8s_node2
[root@k8s_master1 ~]# ansible k8s_node --list-hosts
hosts (2):
k8s_node1
k8s_node2
[root@k8s_master1 ~]# ansible k8s_node -m ping
k8s_node1 | UNREACHABLE! => {
"changed": false, ----》//可以看到k8s_node1端口修改后无法ping通
"msg": "Failed to connect to the host via ssh: ssh: connect to host k8s_node1 port 22: Connection refused",
"unreachable": true
}
k8s_node2 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
查看管理主机k8s_master1 默认配置文件:
[root@k8s_master1 ~]# cat /etc/ansible/ansible.cfg //以下配置中的参数都是默认的,如果不需要修改某项参数的话,就不需要管(不需要取消注释),默认就好。
...
14 inventory = /etc/ansible/hosts
15 library = /usr/share/my_modules/
20 forks = 5
22 sudo_user = root
26 remote_port = 22
71 host_key_checking = False
103 timeout = 20
111 log_path = /var/log/ansible.log
...
?可以看到/etc/ansible/ansible.cfg配置文件中指定inventory配置文件为/etc/ansible/hosts文件,并且第26行remote_port = 22表明ansible将使用ssh的默认端口22,假如在ansible控制的所有主机列表中某些主机的ssh端口都不一致怎么办呢?
--> 这时候我们就需要在/etc/ansible/ansible.cfg配置文件中指定inventory配置文件/etc/ansible/hosts文件中配置使用inventory变量了。
inventory
?inventory?于定义ansible要管理的主机列表,可以定义单个主机和主机组。上?的/etc/ansible/hosts就是默认的inventory。下?展?一些inventory常?的定义规则:
- ?ansible_ssh_host: ansible使?ssh要连接的主机。
- ?ansible_ssh_port : ssh的端?。默认为22。
- ?ansible_ssh_user: ssh登录的?户名。默认为root。
- ?ansible_ssh_pass : ssh登录远程?户时的认证密码。
- ?ansible_ssh_private_key_file: ssh登录远程?户时的认证私钥。(?)
- ?ansible_connection : 使?何种模式连接到远程主机。默认值为smart(智能),表?当本地ssh?持持久连接(controlpersist)时采?ssh连接,否则采?python的paramiko ssh连接。
- ?ansible_shell_type : 指定远程主机执?命令时的shell解析器,默认为sh(不是bash,它们是有区别的,也不是全路径)。
- ?ansible_python_interpreter: 远程主机上的python解释器路径。默认为/usr/bin/python。
- ?ansible_*_interpreter:使?什么解释器。例如,sh、bash、awk、sed、expect、ruby等等。
?以上inventory文件中可以使用的一些内置变量根据实战中实际情况按需使用即可!
?其中有?个参数可以在配置?件ansible.cf g中指定,但指定的指令不太?样,以下是对应的配置项:
- remote_port: 对应于ansible_ssh_port。
- remote_user: 对应于ansible_ssh_user。
- private_key_file: 对应于ansible_ssh_private_key_file。
- excutable: 对应于ansible_shell_type。但有?点不?样,excutable必须指定全路径,?后者只需指定basename。
配置管理主机k8s_master1 的hosts文件:
?使用ansible_ssh_port变量指定k8s_node1被托管主机的ssh端口为222。
[root@k8s_master1 ~]# vim /etc/ansible/hosts
...
[k8s_node]
k8s_node1 ansible_ssh_port=222 //使用ansible_ssh_port变量指定端口
k8s_node2
管理主机k8s_master1测试:
[root@k8s_master1 ~]# ansible k8s_node -m ping
k8s_node2 | SUCCESS => { ---》指定k8s_node1正确ssh端口后成功ping通
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
k8s_node1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
?可以看到在/etc/ansible/ansible.cfg配置文件中指定inventory配置文件/etc/ansible/hostsd 配置文件中定义使用ansible_ssh_port变量指定k8s_node1被托管主机ssh端口后,即可正常控制不同ssh端口的不同主机,并且不会影响正常控制其他ssh端口为默认端口22的主机。
拓展例子:
cat -n /etc/ansible/hosts
1 192.168.100.59:22
2 192.168.100.60 ansible_ssh_pass=123456 ansible_ssh_port=22
3 [nginx]
4 192.168.100.5[7:9]
5 [nginx:vars]
6 ansible_ssh_pass='123456'
7 [webservers:children]
8 nginx
?第??和第??单独定义主机,第??带上了连接被管节点的端?,第??带上了单独传递给ssh的参数,分别是ssh连接时的登录远程?户的密码参数和ssh的连接端?。
?第三?和第四?定义的是nginx主机组,该组中包含了192.168.100.57到59这3台主机。还?持字母的扩展,如"web[a-d]"。
?第五?和第六?定义了要传递给nginx主机组的变量。若定义为"[all:vars]"或"[*:vars]"则表?传递给所有主机的变量。
?第七和第??定义了?个新的主机组webservers,该组的组成员有nginx组。