Ansible批量部署工具


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這個文件即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM