Ansible的指定用戶與密碼登陸、免密登陸、指定ssh端口以及主機清單Inventory配置python
在實際使用中並不須要對ansible配置進行修改,或者說只有須要的時候才修改ansible配置。web
說明:vim
一、 運維人員使用的登陸帳號;安全
二、 全部的業務都放在 /app/ 下「yun用戶的家目錄」,避免業務數據亂放;app
三、 該用戶也被 ansible 使用,由於幾乎全部的生產環境都是禁止 root 遠程登陸的(所以該 yun 用戶也進行了 sudo 提權)。運維
1 # 使用一個專門的用戶,避免直接使用root用戶 2 # 添加用戶、指定家目錄並指定用戶密碼 3 # sudo提權 4 # 讓其它普通用戶能夠進入該目錄查看信息 5 useradd -u 1050 -d /app yun && echo '123456' | /usr/bin/passwd --stdin yun 6 echo "yun ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers 7 chmod 755 /app/
在實際生產環境中,建議使用基於祕鑰鏈接而不是密碼鏈接。ssh
緣由以下:ide
一、將密碼直接寫入文件中,有安全隱患;測試
二、生產環境的密碼可能會按期更換,若是基於密碼鏈接,那麼咱們也會頻繁的維護,形成維護成本高;this
三、基於祕鑰鏈接,咱們只須要作一次祕鑰分發,後期鏈接無需任何修改。
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=yun 16 [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 any 3 # ConnectTimeout 0 4 # StrictHostKeyChecking ask # 將該配置的註釋打開,並改成 StrictHostKeyChecking no 這樣針對全部用戶都不會在進行 「主機密鑰檢查」了 5 # IdentityFile ~/.ssh/identity
可是這個是 Linux 自帶的配置,咱們不能隨意去更改。所以不建議如此操做。
方式2:修改 ansible 配置
1 [root@ansi-manager ansible]# pwd 2 /etc/ansible 3 [root@ansi-manager ansible]# vim ansible.cfg 4 # uncomment this to disable SSH key host checking 5 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 # 正常
在實際生產環境中,建議使用基於祕鑰鏈接而不是密碼鏈接。
緣由以下:
一、將密碼直接寫入文件中,有安全隱患;
二、生產環境的密碼可能會按期更換,若是基於密碼鏈接,那麼咱們也會頻繁的維護,形成維護成本高;
三、基於祕鑰鏈接,咱們只須要作一次祕鑰分發,後期鏈接無需任何修改。
要求:根據規劃實現 172.16.1.180 到 172.16.1.180、172.16.1.18一、172.16.1.18二、172.16.1.18三、172.16.1.18四、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 8 7 -rw------- 1 yun yun 1675 Jul 25 10:51 id_rsa 8 -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.180 2 [yun@ansi-manager ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.181 3 [yun@ansi-manager ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.182 4 [yun@ansi-manager ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.183 5 [yun@ansi-manager ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.184 6 [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.180 2 [yun@ansi-manager ~]$ ssh 172.16.1.181 3 [yun@ansi-manager ~]$ ssh 172.16.1.182 4 [yun@ansi-manager ~]$ ssh 172.16.1.183 5 [yun@ansi-manager ~]$ ssh 172.16.1.184 6 [yun@ansi-manager ~]$ ssh 172.16.1.185
注意:必須保證每臺機器都免密登陸成功,所以須要每臺機器都驗證。
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 # 方式一、主機 + 端口 + 密鑰 7 172.16.1.180:22 8 9 # 方式2:主機 + 端口 + 密鑰 10 [proxyservers] 11 172.16.1.18[1:2]:22 12 13 # 方式3:別名 + 主機 + 端口 + 密碼 14 [webservers] 15 web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=22 16 web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=22 17 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 # 方式一、主機 + 端口 + 密鑰 7 172.16.1.180 8 9 # 方式1、主機組變量 + 主機 + 密碼 10 [proxyservers] 11 172.16.1.18[1:2] ansible_ssh_port=22 ansible_ssh_user=yun ansible_ssh_pass='123456' 12 13 # 方式2、主機組變量 + 主機 + 密鑰 14 [webservers] 15 172.16.1.18[3:5]:22 16 17 # 定義多組,多組彙總整合 18 # website 組包括兩個子組[proxyservers, webservers] 19 [website:children] 20 proxyservers 21 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-hosts 2 hosts (3): 3 172.16.1.183 4 172.16.1.184 5 172.16.1.185 6 [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-hosts 2 hosts (5): 3 172.16.1.181 4 172.16.1.182 5 172.16.1.183 6 172.16.1.184 7 172.16.1.185 8 [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-hosts 2 hosts (6): 3 172.16.1.180 4 172.16.1.181 5 172.16.1.182 6 172.16.1.183 7 172.16.1.184 8 172.16.1.185 9 [yun@ansi-manager ansible_info]$ ansible all -m ping -i ./hosts_group
———END———
若是以爲不錯就關注下唄 (-^O^-) !