Ansible:自動化運維工具
你需要在一台機器上yum install 一個包,這時候有一個需求,比如現在有5台機同時需要裝apache這個包,那么100台呢,ssh上去就太慢了,這時候就借助到了ansible批量部署工具。
通過host inventory這個文件去管理需要批量部署的主機,它實現的就是ssh協議。
把公鑰拷給需批量部署的主機。
Core Modules模塊:核心模塊,比如說cp、yum這些命令在ansuble里模塊化了。
Custom Modules模塊:自定義模塊,但是得需要有編程語言技術。
Connection Plugins:連接插件。
playbooks:一個任務或條命令代表一個play,多個任務寫在一個文件里。
工作原理
ansible加載hosts文件,通過免秘鑰或配置文件參數來批量管理主機。
ansible優點:
上手簡單,無需安裝客戶端
ansible無需客戶端
配置簡單、擴展性強
支持API自定義模塊,可通過python擴展
冪等性:一種操作重復多次結果相同82分19
ansible安裝
yum install epel-release
yum install ansible
如遇ansible下載不成功,是yum倉庫的問題,把自己的移除,而后把C開頭的文件都移除來,而后yum clean all ,再去下載即可。
ansible配置客戶端
首先生成密鑰
ssh-keygen
而后進入.shh這個文件,里面的id_rsa.pub文件就是公鑰,id_rsa就是私鑰。
利用scp發送給客戶端
也可以
ssh-copy-id -i id_rsa.pub 客戶端ip
vim /etc/ansible/hosts
這個就是host inventory文件
在這個文件里需要定義組:格式如下:
[組名自定義]
客戶端ip ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=密碼(這是通過配置文件免密登錄)
ansible 組名 -m ping 這一步是ping組里所有機器,看是否ok(調用模塊命令)
顯示的changed:false是沒有做出改變的意思
如果ping失敗,請打開配置文件
修改#host_key_checking=False
把注釋打開即可。
ansible常用命令
列出當前的核心模塊
ansible-doc -l
查看此模塊用法
ansible-doc -s 模塊名
啟動並發線程數,減少壓力
ansible 組名 -f
測試通信
ansible all -m ping
在組里的機器去創建用戶
ansible 組名 –m user –a 'name=名字'
給組里的所有機器安裝這個軟件
ansible 組名 –m yum –a 'name=安裝包名字 state=present'
卸載組里所有機器的這個安裝包
ansible 組名 –m yum –a 'name=安裝包名字 state=absent'
重啟組里所有機器的這個安裝包
ansible 組名 –m service –a 'name=服務名字 state=restarted'
拷貝當前文件到組里的機器
ansible 組名 –m copy –a 'src=/root/psu.py dest=/tmp'
拷貝當前文件到組里的機器的任意一台
ansible 組里機器的ip –m copy –a 'src=/root/psu.py dest=/tmp'
直接執行命令
ansible 組名 –m command -a 'ls -ltr'
檢測劇本是否有語法錯誤
ansible-playbook --syntax-check 文件名.yml
模擬執行劇本
ansible-playbook -C 文件名.yml
palybooks核心部分
書寫格式
vim 名字.yml -[空格]hosts:[空格]組名 remote_user:[空格]用戶名 tasks: -[空格]name:[空格]yum install tree yum:[空格] name=tree state=present -[空格]name:[空格]changed service status service:[空格] name=httpd state=started ansible-playbook 名字.yml :調用yml文件
還可以賦予變量
vim 名字.yml -[空格]hosts:[空格]組名 remote_user:[空格]用戶名 vars: -[空格]packages:[空格]tree 把tree這個包名賦予給packages這個變量。就是tree=packages tasks: -[空格]name:[空格]yum install tree service:[空格] name={{ packages }} state=absent ansible-playbook 名字.yml :調用yml文件
還可以迭代:比如創建多個用戶
-[空格]hosts:[空格]組名 remote_user:[空格]用戶名 vars: -[空格]packages:[空格]tree 把tree這個包名賦予給packages這個變量。就是tree=packages tasks: -[空格]name:[空格]yum install tree service:[空格] name={{ packages }} state=absent -[空格]name:[空格]create many users user[空格]:[空格]name={{ item }} item是內置變量,可以直接使用 with_items: -[空格]用戶名 -[空格]應戶名 ansible-playbook 名字.yml :調用yml文件
還可以觸發器:
-[空格]hosts:[空格]組名 remote_user:[空格]用戶名 vars: -[空格]packages:[空格]tree 把tree這個包名賦予給packages這個變量。就是tree=packages tasks: -[空格]name:[空格]yum install tree service:[空格] name={{ packages }} state=absent -[空格]name:[空格]copy copy:[空格]src= 本機文件路徑 dest=目標文件路徑 notify: -[空格]service httpd restart(給觸發器起個名字) handlers: -[空格]name:這的名字一定要跟觸發器起的名字一樣 service:[空格]name=httpd state=restarted ansible-playbook 名字.yml :調用yml文件 多個觸發只需要在任務下緊跟notify:而后在handlers里同一添加要觸發的任務即可。
template模塊
比如我批量部署apache,我的需求是同時安裝apache,但他倆的配置文件不能一樣,比如里面的端口號不一樣。
vim 命名.yml文件
- hosts: testhost remote_user: root tasks: - name: copy differernt httpd.conf template: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
而后 改寫httpd的配置文件,把端口號設置成一個變量
Listen {{ port }}
vim /etc/ansible/hosts
把我們剛設置變量傳進去,添加至每台機器后
port=需求端口號
port=需求端口號
roles用法
把每一個play封裝到角色里,就是把目錄模塊化了。
第一層目錄可以自定義名字,第二層目錄必須交roles,而后roles里又包含兩個目錄,這兩個目錄也可以自定義名字,而后再在這兩個目錄里去定義目錄。
調用task目錄,適用於yum模塊,service模塊。
而后進入tasks目錄(第四級目錄)創建main.yml文件,必須叫這個。
而后進去直接寫任務即可。而后在roles同級目錄下,創建site.yml這個文件,而后寫入:
- hosts: 組名
remote_user: root
roles:
- 剛才編寫的第三級目錄名,就是你編寫那個第三級目錄,直接把目錄名寫到這即可。
調用files目錄,適用於copy模塊。
先把你要批量拷貝的文件放到files這個目錄里。而后編輯taks目錄的main.yml文件:
handlers跟vars目錄必須定義main.yml這個文件。
vars里的main.yml只需定義變量即可。
變量名 = 名字
handlers里的main.yml只需定義名字跟任務即可。notify要寫到tasks里的main.yml。
調用的時候調用site.yml這個文件即可。