在实际使用中并不需要对ansible配置进行修改,或者说只有需要的时候才修改ansible配置。
添加用户账号
说明:
1、 运维人员使用的登录账号;
2、 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放;
3、 该用户也被 ansible 使用,因为几乎所有的生产环境都是禁止 root 远程登录的(因此该 yun 用户也进行了 sudo 提权)。
1 # 使用一个专门的用户,避免直接使用root用户2 # 添加用户、指定家目录并指定用户密码3 # sudo提权4 # 让其它普通用户可以进入该目录查看信息5 useradd -u 1050 -d /app yun && echo '123456'
/usr/bin/passwd --stdin yun6 echo "yun ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers7 chmod 755 /app/基于密码连接「了解」
在实际生产环境中,建议使用基于秘钥连接而不是密码连接。
原因如下:
1、将密码直接写入文件中,有安全隐患;
2、生产环境的密码可能会定期更换,如果基于密码连接,那么我们也会频繁的维护,造成维护成本高;
3、基于秘钥连接,我们只需要做一次秘钥分发,后期连接无需任何修改。
清单配置
1 [yun@ansi-manager ansible_info]$ pwd 2 /app/ansible_info 3 [yun@ansi-manager ansible_info]$ cat hosts_pwd 4 # 未分组机器,放在所有组前面 5 # 默认端口22,可省略 6 # 方式1:主机 + 端口 + 密码 7 172.16.1.180 ansible_ssh_port=22 ansible_ssh_user=yun ansible_ssh_pass='123456' 8 9 # 方式2:主机 + 端口 + 密码10 [proxyservers]11 172.16.1.18[1:2] ansible_ssh_port=22 ansible_ssh_user=yun ansible_ssh_pass='123456'12 13 # 方式3:主机 + 端口 + 密码14 [webservers]15 172.16.1.18[3:5] ansible_ssh_port=22 ansible_ssh_user=yun16 [webservers:vars]17 ansible_ssh_pass='123456'测验连接
1 [yun@ansi-manager ansible_info]$ ansible 172.16.1.180 -m ping -i ./hosts_pwd # 普通用户执行2 172.16.1.180
FAILED! => {3 "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."4 }5 [yun@ansi-manager ansible_info]$ sudo ansible 172.16.1.180 -m ping -i ./hosts_pwd # 提权使用 root 用户执行6 172.16.1.180
FAILED! => {7 "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."8 }大概提示信息:因为启用了主机密钥检查,而 sshpass 不这一点。请将此主机「172.16.1.180」的指纹添加到你本机的known_hosts文件中以管理此主机。
跳过主机密钥检查,有两种方式:
方式1:修改 Linux 系统配置
1 [root@ansi-manager ssh]# vim /etc/ssh/ssh_config 2 # AddressFamily any3 # ConnectTimeout 04 # StrictHostKeyChecking ask # 将该配置的注释打开,并改为 StrictHostKeyChecking no 这样针对所有用户都不会在进行 「主机密钥检查」了5 # IdentityFile ~/.ssh/identity但是这个是 Linux 自带的配置,我们不能随意去更改。因此不建议如此操作。
方式2:修改 ansible 配置
1 [root@ansi-manager ansible]# pwd2 /etc/ansible3 [root@ansi-manager ansible]# vim ansible.cfg4 # uncomment this to disable SSH key host checking5 host_key_checking = False # 将该配置的注释去掉改配置仅对 root 用户生效,其他普通用户是不生效的。这里使用该方法。
再次连接测试
1 [yun@ansi-manager ansible_info]$ ansible 172.16.1.180 -m ping -i ./hosts_pwd # 普通用户还是不行 2 172.16.1.180
FAILED! => { 3 "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." 4 } 5 [yun@ansi-manager ansible_info]$ sudo ansible 172.16.1.180 -m ping -i ./hosts_pwd # 提权使用 root 用户执行 6 172.16.1.180
SUCCESS => { 7 "ansible_facts": { 8 "discovered_interpreter_python": "/usr/bin/python" 9 }, 10 "changed": false, 11 "ping": "pong"12 }13 [yun@ansi-manager ansible_info]$ sudo ansible proxyservers -m ping -i ./hosts_pwd # 正常14 [yun@ansi-manager ansible_info]$ sudo ansible webservers -m ping -i ./hosts_pwd # 正常基于秘钥连接「推荐」
在实际生产环境中,建议使用基于秘钥连接而不是密码连接。
原因如下:
1、将密码直接写入文件中,有安全隐患;
2、生产环境的密码可能会定期更换,如果基于密码连接,那么我们也会频繁的维护,造成维护成本高;
3、基于秘钥连接,我们只需要做一次秘钥分发,后期连接无需任何修改。
实现yun用户免秘钥登录
要求:根据规划实现 172.16.1.180 到 172.16.1.180、172.16.1.181、172.16.1.182、172.16.1.183、172.16.1.184、172.16.1.185 免秘钥登录
因此需要在 172.16.1.180 机器创建秘钥,然后分发到受控机器。
创建秘钥
1 [yun@ansi-manager ~]$ ssh-keygen -t rsa # 一路回车即可 注意使用的是 yun 用户2 # 生成之后会在用户的根目录生成一个 “.ssh”的文件夹3 [yun@ansi-manager ~]$ ll -d .ssh/4 drwx------ 2 yun yun 38 Jul 25 10:51 .ssh/5 [yun@ansi-manager ~]$ ll .ssh/6 total 87 -rw------- 1 yun yun 1675 Jul 25 10:51 id_rsa8 -rw-r--r-- 1 yun yun 398 Jul 25 10:51 id_rsa.pub分发密钥
1 [yun@ansi-manager ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.1802 [yun@ansi-manager ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.1813 [yun@ansi-manager ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.1824 [yun@ansi-manager ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.1835 [yun@ansi-manager ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.1846 [yun@ansi-manager ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.185测验免密登录是否成功
1 [yun@ansi-manager ~]$ ssh 172.16.1.180 # 等价于 ssh yun@172.16.1.1802 [yun@ansi-manager ~]$ ssh 172.16.1.1813 [yun@ansi-manager ~]$ ssh 172.16.1.1824 [yun@ansi-manager ~]$ ssh 172.16.1.1835 [yun@ansi-manager ~]$ ssh 172.16.1.1846 [yun@ansi-manager ~]$ ssh 172.16.1.185注意:必须保证每台机器都免密登录成功,因此需要每台机器都验证。
.ssh目录中的文件说明
1 [yun@ansi-manager .ssh]$ pwd 2 /app/.ssh 3 [yun@ansi-manager .ssh]$ ll 4 total 16 5 -rw------- 1 yun yun 398 Jul 25 11:01 authorized_keys 6 -rw------- 1 yun yun 1675 Jul 25 10:51 id_rsa 7 -rw-r--r-- 1 yun yun 398 Jul 25 10:51 id_rsa.pub 8 -rw-r--r-- 1 yun yun 1120 Jul 25 11:04 known_hosts 9 ########################################################################################10 authorized_keys :存放要远程免密登录机器的公钥,主要通过这个文件记录多台要远程登录机器的公钥11 id_rsa : 生成的私钥文件12 id_rsa.pub :生成的公钥文件13 know_hosts : 已知的主机公钥清单清单配置
1 [yun@ansi-manager ansible_info]$ pwd 2 /app/ansible_info 3 [yun@ansi-manager ansible_info]$ cat hosts_key 4 # 未分组机器,放在所有组前面 5 # 默认端口22,可省略 6 # 方式1、主机 + 端口 + 密钥 7 172.16.1.180:22 8 9 # 方式2:主机 + 端口 + 密钥10 [proxyservers]11 172.16.1.18[1:2]:2212 13 # 方式3:别名 + 主机 + 端口 + 密码14 [webservers]15 web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=2216 web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=2217 web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=22测验连接
测验一
1 [yun@ansi-manager ansible_info]$ ansible 172.16.1.180 -m ping -i ./hosts_key 2 172.16.1.180
SUCCESS => {3 "ansible_facts": {4 "discovered_interpreter_python": "/usr/bin/python"5 }, 6 "changed": false, 7 "ping": "pong"8 }测验二
1 [yun@ansi-manager ansible_info]$ ansible proxyservers -m ping -i ./hosts_key 2 172.16.1.181
SUCCESS => { 3 "ansible_facts": { 4 "discovered_interpreter_python": "/usr/bin/python" 5 }, 6 "changed": false, 7 "ping": "pong" 8 } 9 172.16.1.182
SUCCESS => {10 "ansible_facts": {11 "discovered_interpreter_python": "/usr/bin/python"12 }, 13 "changed": false, 14 "ping": "pong"15 }测验三
1 [yun@ansi-manager ansible_info]$ ansible webservers -m ping -i ./hosts_key 2 web03
SUCCESS => { 3 "ansible_facts": { 4 "discovered_interpreter_python": "/usr/bin/python" 5 }, 6 "changed": false, 7 "ping": "pong" 8 } 9 web01
SUCCESS => {10 "ansible_facts": {11 "discovered_interpreter_python": "/usr/bin/python"12 }, 13 "changed": false, 14 "ping": "pong"15 }16 web02
SUCCESS => {17 "ansible_facts": {18 "discovered_interpreter_python": "/usr/bin/python"19 }, 20 "changed": false, 21 "ping": "pong"22 }混合方式和主机组方式
清单配置
1 [yun@ansi-manager ansible_info]$ pwd 2 /app/ansible_info 3 [yun@ansi-manager ansible_info]$ cat hosts_group 4 # 未分组机器,放在所有组前面 5 # 默认端口22,可省略 6 # 方式1、主机 + 端口 + 密钥 7 172.16.1.180 8 9 # 方式一、主机组变量 + 主机 + 密码10 [proxyservers]11 172.16.1.18[1:2] ansible_ssh_port=22 ansible_ssh_user=yun ansible_ssh_pass='123456'12 13 # 方式二、主机组变量 + 主机 + 密钥14 [webservers]15 172.16.1.18[3:5]:2216 17 # 定义多组,多组汇总整合18 # website 组包括两个子组[proxyservers, webservers]19 [website:children]20 proxyservers21 webservers说明:定义多组使用没有问题。但是不能像上面一样既有密码配置,又有秘钥配置,这样会增加维护成本。这里为了演示因此用了密码和秘钥配置。
测验连接
测验一
1 # 如果 ~/.ssh/known_hosts 文件中没有添加受控机指纹,那么必须提权操作 2 [yun@ansi-manager ansible_info]$ sudo ansible proxyservers -m ping -i ./hosts_group --list-hosts 3 hosts (2): 4 172.16.1.181 5 172.16.1.182 6 [yun@ansi-manager ansible_info]$ sudo ansible proxyservers -m ping -i ./hosts_group 7 172.16.1.182
SUCCESS => { 8 "ansible_facts": { 9 "discovered_interpreter_python": "/usr/bin/python"10 }, 11 "changed": false, 12 "ping": "pong"13 }14 172.16.1.181
SUCCESS => {15 "ansible_facts": {16 "discovered_interpreter_python": "/usr/bin/python"17 }, 18 "changed": false, 19 "ping": "pong"20 }测验二
1 [yun@ansi-manager ansible_info]$ ansible webservers -m ping -i ./hosts_group --list-hosts2 hosts (3):3 172.16.1.1834 172.16.1.1845 172.16.1.1856 [yun@ansi-manager ansible_info]$ ansible webservers -m ping -i ./hosts_group 7 ………………测验三
1 [yun@ansi-manager ansible_info]$ ansible website -m ping -i ./hosts_group --list-hosts2 hosts (5):3 172.16.1.1814 172.16.1.1825 172.16.1.1836 172.16.1.1847 172.16.1.1858 [yun@ansi-manager ansible_info]$ ansible website -m ping -i ./hosts_group测验四
特殊组:all
1 [yun@ansi-manager ansible_info]$ ansible all -m ping -i ./hosts_group --list-hosts2 hosts (6):3 172.16.1.1804 172.16.1.1815 172.16.1.1826 172.16.1.1837 172.16.1.1848 172.16.1.1859 [yun@ansi-manager ansible_info]$ ansible all -m ping -i ./hosts_group