您好,登錄后才能下訂單哦!
Ansible其實一個it運維自動化工具,主要是完成it基礎設施的配置應用的部署,可以對百十臺的主機,上千臺的主機進行管理,它一直強調的是:
簡單易用,所以我們就能很快的上手它,所以不需要好的基礎能力
簡單-----減少學習的成本:它使用易讀的描述語言部署的文件。
無需特殊編碼技能:也就是它不需求你會開發,你就能很快的上手使用。
任務按順序執行:ansible執行就是按你的任務從上到下依次去執行,所以很好去理解,很好的去寫這個配置文件。
強大-----協調應用程序生命周期,因為一個應用程序的生命周期分為多個階段,例如從代碼的拉取到構建,然后再到部署,然后再到測試,一個應用的周期大概是這樣的,ansible可以在這個應用周期中完成一系列任務
應用部署
配置管理
工作流程編排
我們可以通過剛才的那幾個階段去寫配置文件,這樣就能很清晰的看出這個應用程序到底要做哪些事,根據我們做那些事,我們再逐一的去分解
這也就是ansible的主要的功能
無代理----可預測,可靠和安全
無代理架構,也就是在一臺服務器上安裝ansible就可以了,而不需要在客戶端再安裝一個agent,
使用openssh通信,確保了安全性,
沒有代理維護成本
Ansible相對比同類的saltstack他們都是使用python去編寫的,在早些年saltstack市場占有率是遠超ansible,而近幾年市場占有率是遠超saltstack的,其實主要的原因呢,就是跟它這個設計模式有關系,因為ansible最初呢講究的就是無代理架構,而saltstack要在被管理端,要裝一個agent,裝一個很簡單,要考慮后期的維護,所以根據現在的市場需求,很多情況下,在某些機器上安裝一些復雜的agent和其他的一些工具,對于現在的企業it環境中,每個服務器上面都安裝了很多的agent,有可能自己研發了被監控端的agent,日志的agent,回頭再安裝一些其他的agent,要初始化要舒適化四五個agent,久而久之就會增加很多額外的負載,而且不易于我們后期對服務器的管理,所以根據這個現狀呢,ansible就用的it企業很多,而且ansible在它本身的這個配置下就是這么設計的,而且根據這種形態去擴展更多模塊和功能,而saltstack,雖然已經支持了這種無代理架構,但是它是后來支持的,有很多功能的還是難于ansible去使用的。
Ansible的架構
![]
Users就是我們這個管理員用戶,也就是我們,我們去批量管理主機,有兩種方式,一個是執行命令,例如查看磁盤空間
第二種方式呢,就是playbook去管理比較復雜的任務,例如一個應用的部署
這個ansible引擎有4部分,第一個就是inventory,這個就是管理我們主機的一個清單,你去管理誰,就是在這體現的,包括主機的ip地址,端口,賬戶密碼都是在這個inventory去輸寫的
第二個就是ansible的Api,它有api來供我們去調用,當我們去開發運維自動化平臺的時候,不用去造輪子,就可以直接使用ansible的api去使用來完成你的批量管理。
第三個就是模塊modules,ansible是一個自動化引擎,它很多的功能呢都是通過模塊去實現的,例如去創建一個用戶,那么它就有這個user這個賬戶,那么去管理一個服務,去啟動一個服務那么久有這個service,強調之初呢就是它有非常多的模塊。
第四個就是plugins,這個就是插件,這個相當于ansible來完成內部的一些操作,例如ansible怎么去管理這些主機,那么它就有這個contation的一個插件,通過這個插件呢去連接你這個主機,所以這個plugins是ansible的核心功能,而模塊是ansible核心之外的擴展功能。
而ploybook可以通過這些模塊去編寫應用的生命周期,它就相當于一個文本,我們要在里面輸寫我們要做哪些事
如果要實現一個CMDB的一個功能,配置中心管理數據庫,這個功能呢就記錄了你的it基礎設施中,一些主機的一些信息,通過這些信息呢,以供其他人去使用,供其他的項目去調用,有了ansible的話就能很快去獲取這些信息,因為ansible可以在你的目標主機上去獲取當前主機所有的一些硬件資源了,一些配置,各個信息都會幫你收集,只需要將你的數據收集到你的CMDB當中就可以了
而且ansible也有很多的模塊和插件來對接這個云平臺,不管是私有云還是公有云都會幫我們去做一些事,,這個就是一個ansible的一個架構
管理員通過操作ansible,ansible去調用一些模塊和插件來讀取,inventory的配置主機清單,去操作你操作的主機組。
Ansible的安裝
我們可以直接通過yum去安裝
[root@ansible ~]# yum -y install ansible
安裝之后就是配置ansible,這里就是配置ansible的主機清單,這里可以使用把密碼寫上去,也可以提前做好免交互登錄,就直接寫ip也可以
[root@ansible ~]# vim /etc/ansible/hosts
[webservers]
10.4.7.12 ansible_ssh_user=root ansible_ssh_pass=666666
10.4.7.21 ansible_ssh_user=root ansible_ssh_pass=666666
對我們執行的命令添加不需要指紋的交互
[root@ansible ~]# vim /etc/ansible/ansible.cfg
host_key_checking = False
查看我們多主機節點的磁盤狀態
[root@ansible ~]# ansible webservers -a "df -h"
10.4.7.12 | SUCCESS | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 50G 1.4G 49G 3% /
devtmpfs 858M 0 858M 0% /dev
tmpfs 870M 0 870M 0% /dev/shm
tmpfs 870M 8.4M 861M 1% /run
tmpfs 870M 0 870M 0% /sys/fs/cgroup
/dev/sda2 1014M 179M 836M 18% /boot
/dev/sda1 200M 12M 189M 6% /boot/efi
/dev/mapper/centos-home 73G 33M 72G 1% /data
tmpfs 174M 0 174M 0% /run/user/0
10.4.7.21 | SUCCESS | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 50G 1.4G 49G 3% /
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 8.4M 3.8G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda2 1014M 179M 836M 18% /boot
/dev/sda1 200M 12M 189M 6% /boot/efi
/dev/mapper/centos-home 73G 33M 72G 1% /data
tmpfs 779M 0 779M 0% /run/user/0
Ansible的使用要求
服務端的要求
Python2.6/2.7/3.x
Redhat,Debian,centos,os x等,不支持windows
因為ansible是python寫的所以要有python的環境,ansible是在15年的10月份被redhat收購的,默認centos已經將python安裝了
被管理端要求
Openssh,linux發行版一般也使用openssh,也需要python,會使用python的腳本,執行我們使用的模塊,最終封裝我們使用的腳本,在被管理端執行,結果返回給ansible
Python2.6/2.7/3.x
安裝ansible的方式支持yum,也是推薦的方式,像redhat核debian都支持他們本身的軟件包去安裝ansible
也可以通過pip去安裝,其實ansible也是python的一個模塊
也可以通過源碼包去安裝
? https://releases.ansible.com/ansible or https://github.com/ansible/ansible.git
ansible的配置文件
[root@ansible ~]# vim /etc/ansible/ansible.cfg
some basic default values...
#inventory = /etc/ansible/hosts
#library = /usr/share/my_modules/
#module_utils = /usr/share/my_module_utils/
#remote_tmp = ~/.ansible/tmp
#local_tmp = ~/.ansible/tmp
#forks = 5
#poll_interval = 15
#sudo_user = root
#ask_sudo_pass = True
#ask_pass = True
#transport = smart
#remote_port = 22
#module_lang = C
#module_set_locale = False
有這幾個重要的簡單說一下,inventory -/etc/ansible/hosts
這是被管理端的主機清單
Fork是ansible工作進程的并發數,它默認是5個,可以根據自己管理主機的數量調整這個,同時提高這個并發數也會對你的服務器的負載增加消耗
Sudo_user:就是提權,在linux下如果你是普通用戶,如果想root方式去執行操作時,那你是不是需要sudo,或者su -切到root用戶操作,那這就稱為提權。
Remote_port=22,操作目標主機的端口,ssh 默認22,這里也默認22
Host_key_checking=false 這個開啟的話就會實現我們第一次登錄一個主機時,可以免去敲yes/no,但是開啟這個也有不好的,就是當我們的服務端重裝系統了,那么這個地方就會失效報錯,當然也可以解決,把know_hosts下的歷史登錄記錄清除就可以,不過這個也不影響使用。
Log_path=/var/log/ansible.log 就是記錄日志的,記錄一些基本操作,可以開啟一下
Private_key_file=/root/.ssh/id_rsa,這是指定密鑰認證的私鑰,連接linux的認證方式就是基于密碼的認證,一個是基于密鑰對的認證,基于密鑰對的認證是相對于比較安全的,進行數字證書的效驗,基于ssh的容易被破解,但是滿足密碼的復雜性也很難破解。
inventory主機清單
[root@ansible ~]# vim /etc/ansible/hosts
像ansible在操作我們基礎設施主機的時候,都是通過這個/etc/ansible/hosts去操作的
這個配置中有屬于這種未分組的組,它會分配到auto的組中,也就是默認組,我們可以根據IP,或者主機名進行配置,
Ex 1: Ungrouped hosts, specify before any group headers.
green.example.com
blue.example.com
192.168.100.1
192.168.100.10
Ansible的執行命令的使用方法
[root@ansible ~]# ansible --help
Usage: ansible <host-pattern> [options]
主機的模式->選項,就是在你的主機清單中匹配
這個all就是匹配你所有的主機組,不加主機組也會匹配上
-m command可以省略,這是默認的
[root@ansible ~]# ansible all -a "free -m"
10.4.7.12 | SUCCESS | rc=0 >>
total used free shared buff/cache available
Mem: 1738 121 1475 8 141 1456
Swap: 3839 0 3839
10.4.7.21 | SUCCESS | rc=0 >>
total used free shared buff/cache available
Mem: 7785 162 7479 8 143 7403
Swap: 3839 0 3839
10.4.7.22 | SUCCESS | rc=0 >>
total used free shared buff/cache available
Mem: 7785 159 7482 8 144 7406
Swap: 0 0 0
也可以使用直接輸入ip同樣也可以查看到
[root@ansible ~]# ansible 10.4.7.12 -a "df -h"
10.4.7.12 | SUCCESS | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 50G 1.4G 49G 3% /
devtmpfs 858M 0 858M 0% /dev
tmpfs 870M 0 870M 0% /dev/shm
tmpfs 870M 8.4M 861M 1% /run
tmpfs 870M 0 870M 0% /sys/fs/cgroup
/dev/sda2 1014M 179M 836M 18% /boot
/dev/sda1 200M 12M 189M 6% /boot/efi
/dev/mapper/centos-home 73G 33M 72G 1% /data
tmpfs 174M 0 174M 0% /run/user/0
然后就是變量,能與用戶動態的交互,傳參,來讓ansible來做指定的事情,這樣就能更靈活一些。
Ansible的官方文檔是docs.ansible.com
一般經常用的ansible和ploybook,doc
其他的模塊也很多,暫時也用不上
比如變量的使用
[webservers]
10.4.7.21 ansible_ssh_user=root ansible_ssh_pass=666666 http_port=80
10.4.7.22 ansible_ssh_user=root ansible_ssh_pass=666666 http_port=80
[root@ansible ~]# ansible webservers -a "echo {{http_port}}"
10.4.7.22 | SUCCESS | rc=0 >>
80
10.4.7.21 | SUCCESS | rc=0 >>
80
組變量的使用,定義這個vars,使用的時候就會調用這個變量
[webservers:vars]
http_port=8080
server_name=www.devops.com
[root@ansible ~]# ansible webservers -a "echo {{http_port}}"
10.4.7.21 | SUCCESS | rc=0 >>
8080
10.4.7.22 | SUCCESS | rc=0 >>
8080
[root@ansible ~]# ansible webservers -a "echo {{server_name}}"
10.4.7.22 | SUCCESS | rc=0 >>
www.devops.com
10.4.7.21 | SUCCESS | rc=0 >>
www.devops.com
也可以單獨寫到/etc/ansible/group_vars/webservers.yml下,它默認會讀取你哪個組里面的變量,以yml的模式更方便
http_port: 8090
server_name: xiabanle
[root@ansible group_vars]# ansible webservers -a "echo {{http_port}}"
10.4.7.22 | SUCCESS | rc=0 >>
8090
10.4.7.21 | SUCCESS | rc=0 >>
8090
[root@ansible group_vars]# ansible webservers -a "echo {{server_name}}"
10.4.7.22 | SUCCESS | rc=0 >>
xiabanle
10.4.7.21 | SUCCESS | rc=0 >>
xiabanle
ad-hoc命令
使用shell模塊在主機組批量創建文件
[root@ansible ~]# ansible webservers -m shell -a "mkdir /opt/devops"
[WARNING]: Consider using file module with state=directory rather than running mkdir
10.4.7.21 | SUCCESS | rc=0 >>
10.4.7.22 | SUCCESS | rc=0 >>
[root@ansible ~]# ansible webservers -m shell -a "ls /opt/"
10.4.7.22 | SUCCESS | rc=0 >>
devops
test
10.4.7.21 | SUCCESS | rc=0 >>
devops
test
查看本次的操作設計到了哪些主機
[root@ansible ~]# ansible webservers --list-hosts
hosts (2):
10.4.7.21
10.4.7.22
查看輸出的命令遇到的詳細信息
[root@ansible ~]# ansible webservers -vvv -a "ls /opt/devops"
Ssh密鑰對的認證
先創建一對密鑰對
[root@ansible ~]# ssh-keygen
這個rsa.pub是公鑰,這個放在目標主機上,這個id_rsa是使用這個私鑰進行登錄認證的
[root@ansible .ssh]# ls
id_rsa id_rsa.pub known_hosts
怎么放過去,有兩種方式,第一種查看公鑰的內容,將它復制到目標主機認證key中
還有一種方式就是通過ssh-copy-id,這樣的話,就能直接傳到目標主機的authorized_keys中[root@ansible .ssh]# ssh-copy-id root@10.4.7.21
這個就是保存你ansible主機上的公鑰
[root@aaa ~]# cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRgvupMdkSCz2tP1WOig7h736iqHdFMWVdMoYnmgpe8EUp/Xmuwf66dVv/RrDvs6jyPtlnlQtBVtEYJCwsuumgLXcSp+XwyICLe5cetYGYRa3ByhIiJPxrfkLCnLGHAHKl0dBnxN2286Rsg1D1NgRLFGVS+MF1Hj6CPgHhLc+eTusDv4tZXCFGdJoyT99jJCAwpc1N/pbJhoS/t4g+fxZ7nCrRkLS49i8Mo7KuLjtfwlB4yDbh2bzdG60rzF71k8asJlBj3GcSmtEhqmw7xyv2qcqCq/CvpscUhJ4ZIrz4xs6Jq2IKBhgQiptCnDis15b6Cj6R3mY3XLf4sruX/hyh root@ansible
這樣就能實現免交互登錄了
這樣的話,hosts文件只需要將IP或者域名寫上就可以了
Ansible的常用模塊
執行shell命令(command和shell)
文件傳輸(copy和file)可以對文件拷貝和創建目錄
管理軟件包(yum)
用戶和組(user)
從源代碼管理系統部署(git)從git倉庫拉取源代碼
管理服務(service)
收集目標主機信息(setup)
Copy模塊將文件拷貝過去
[root@ansible ~]# ansible webservers -m copy -a "src=/root/Dockerfile dest=/tmp"
查看目標已有
[root@ansible ~]# ansible webservers -a "ls /tmp"
File模塊在管理端去創建文件
創建目錄state=directory
創建文件state=touch
刪除目錄/文件state=absent[root@ansible ~]# ansible webservers -m file -a "dest=/tmp/xiaoming state=file"
Yum模塊在被管理端安裝yum的包
Yum命令state=present
卸載命令 State=absent[root@ansible ~]# ansible webservers -m yum -a "name=vim state=present"
User模塊,創建用戶
[root@ansible ~]# ansible webservers -m user -a "name=foo password=66666"
刪除用戶 :state=absent
Service模塊我們啟動一個服務停止一個服務,
測試一個memcache來測試服務的啟動和停止
啟動state=started
停止state=stopped
開機啟動enabled=true
重啟state=restarted
啟動
[root@ansible ~]# ansible webservers -m yum -a "name=memcached state=present"
[root@ansible ~]# ansible webservers -m service -a "name=memcached "
[root@ansible ~]# ansible webservers -m shell -a "ps -ef |grep memcached"
停止[root@ansible ~]# ansible webservers -m service -a "name=memcached state=stopped"
給memcached加入開機啟動[root@ansible ~]# ansible webservers -m service -a "name=memcached enabled=true"
重啟就是restarted
Set up模塊是收集系統信息的
這個也會寫一些變量,當我們使用ploybook時當前的主機變量[root@ansible ~]# ansible webservers -m setup
可以過濾其中的一些信息來過濾一些我們想要的系統信息,比如獲得主機名
[root@ansible ~]# ansible webservers -m setup -a "filter=ansible_hostname"
10.4.7.21 | SUCCESS => {
"ansible_facts": {
"ansible_hostname": "k8s-node1"
},
"changed": false
}
10.4.7.12 | SUCCESS => {
"ansible_facts": {
"ansible_hostname": "k8s-master"
},
"changed": false
}
10.4.7.22 | SUCCESS => {
"ansible_facts": {
"ansible_hostname": "k8s-node2"
},
"changed": false
}
查看內存使用情況[root@ansible ~]# ansible webservers -m setup -a "filter=ansible_*_mb"
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。