前言:
在日常使用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组。