ansible是新出現的自動化運維工具,基于Python開發,集合了衆多運維工具(puppet、chef、func、fabric)的優點,實作了批量系統配置、批量程式部署、批量運作指令等功能。
ansible是基于 paramiko 開發的,并且基于子產品化工作,本身沒有批量部署的能力。真正具有批量部署的是ansible所運作的子產品,ansible隻是提供一種架構。ansible不需要在遠端主機上安裝client/agents,因為它們是基于ssh來和遠端主機通訊的。ansible目前已經已經被紅帽官方收購,是自動化運維工具中大家認可度最高的,并且上手容易,學習簡單。
1、部署簡單,隻需在主要端部署Ansible環境,被控端無需做任何操作;
2、預設使用SSH協定對裝置進行管理;
3、有大量正常運維操作子產品,可實作日常絕大部分操作。
4、配置簡單、功能強大、擴充性強;
5、支援API及自定義子產品,可通過Python輕松擴充;
6、通過Playbooks來定制強大的配置、狀态管理;
7、輕量級,無需在用戶端安裝agent,更新時,隻需在操作機上進行一次更新即可;
8、提供一個功能強大、操作性強的Web管理界面和REST API接口——AWX平台。
這裡使用3台主機為例:ansible ,被管理的兩台主機
1、ansible的安裝
yum install epel-release -y
yum install ansible –y
2、配置ansible的主機清單
vim /etc/ansible/hosts
定義方式
[web] 主機組名:可以自己寫
192.168.191.132 管理的主機1
192.168.191.133 管理的主機2
3、ansible 主機能夠ssh無密連接配接要管理的主機
配置ansible使用公鑰驗證
雖然ansible支援其他主機認證方式,但是我們最常用的的還是基于秘鑰的認證:
(1)首先生成秘鑰
ssh-keygen -t rsa 後面直接回車
(2)然後向監控主機分發秘鑰:
即将公鑰複制到要監控的主機上
ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.191.132
ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.191.133
(3)在ansible上ssh連接配接測試
(1) ansible web -m ping
192.168.191.132 | SUCCESS => { “changed”: false,
“ping”: “pong” }
192.168.191.133 | SUCCESS => { "changed": false,
"ping": "pong" }
可以看出監控的兩台主機是連通的
(2)ansible all -m ping 測試所有的監控主機
ansible 主機組名 -m command -a "操作"
(1)ansible web -m comman -a "cat /etc/passwd"
-m 指定子產品 -a 指定指令
将監控的兩台主機的/etc/passwd 檔案内容顯示在ansible主機的螢幕上
(2)ansible web -m comman -a "ifconfig"
因為command子產品不支援管道,是以有了shell子產品,支援shell的各種功能
(1)[root@ansiable ~]# ansible web -m shell -a ‘cat /etc/passwd |grep “root”’
192.168.191.132 | SUCCESS | rc=0 >> root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
192.168.191.133 | SUCCESS | rc=0 >> root:x:0:0:root:/root:/bin/bash
copy
相關選項如下:
①backup:在覆寫之前,将源檔案備份,備份檔案包含時間資訊。有兩個選項:yes|no
②content:用于替代“src”,可以直接設定指定檔案的值
③dest:必選項。要将源檔案複制到的遠端主機的絕對路徑,如果源檔案是一個目錄,那麼該路徑也必須是個目錄
④directory_mode:遞歸設定目錄的權限,預設為系統預設權限
⑤force:如果目标主機包含該檔案,但内容不同,如果設定為yes,則強制覆寫,如果為no,則隻有當目标主機的目标位置不存在該檔案時,才複制。預設為yes
⑥others:所有的file子產品裡的選項都可以在這裡使用
⑦src:被複制到遠端主機的本地檔案,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,它将遞歸複制。在這種情況下,如果路徑使用“/”來結尾,則隻複制目錄裡的内容,如果沒有使用“/”來結尾,則包含目錄在内的整個内容全部複制,類似于rsync
(1)ansible web -m copy -a 'src=/root/a.sh dest=/app/a.sh '
源檔案是:/root/a.sh,複制到web組監控主機的 /app/a.sh
(2)ansible web -m copy -a "content='hello word' dest=/app/a.sh mode=644 backup=yes"
将hello word 内容推送到web主機組監控主機的/app/a.sh ,權限改為644 ,backup:當檔案内容發生變化會對原來的内容進行備份。
(3)ansible web -m copy -a "content='hi' dest=/app/a.sh mode=644 backup=yes" 如再次推送内容到啊a.sh 中
在app下用兩個檔案
a.sh 内容為最新推送的hi
a.sh.7560.2017-12-08@19:56:01~ 内容為以前的hello word
(1)ansible web -m file -a "path=/app/app state=directory" 在遠端建立目錄/app/app
(2)ansible web -m file -a "path=/app/app state=absent" 删除目錄/app/app
(3)state 有下面内容
directory:如果目錄不存在,就建立目錄
file:即使檔案不存在,也不會被建立
link:建立軟連結
hard:建立硬連結
touch:如果檔案不存在,則會建立一個新的檔案,如果檔案或目錄已存在,則更新其最後修改時間
absent:删除目錄、檔案或者取消連結檔案
(1)ansible web -m fetch -a 'src=/var/log/messages dest=/root/test'
将遠端主機的 /var/log/messages 拿來放在本機的root下
cd /root/test
ls
192.168.191.132 192.168.191.133
會自動建立兩個子檔案夾區分
cron 選項
day= #日應該運作的工作( 1-31, , /2, )
hour= # 小時 ( 0-23, , /2, )
minute= #分鐘( 0-59, , /2, )
month= # 月( 1-12, , /2, )
weekday # 周 ( 0-6 for Sunday-Saturday,, )
job= #指明運作的指令是什麼
name= #定時任務描述
reboot # 任務在重新開機時運作,不建議使用,建議使用special_time
special_time #特殊的時間範圍,參數:reboot(重新開機時),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小時)
state #指定狀态,present表示添加定時任務,也是預設設定,absent表示删除定時任務
user # 以哪個使用者的身份執行
(1)ansible web -m cron -a 'name="sync time from ntpserver" minute="/10" job="/sbin/ntpdate 172.17.0.1 &>/dev/null"
在遠端主機上每10分鐘同步一下伺服器時間
(2)ansible web -m shell -a “crontab -l” 檢視遠端主機的檔案中是否寫入成功
conf_file #設定遠端yum安裝時所依賴的配置檔案。如配置檔案沒有在預設的位置。
disable_gpg_check #是否禁止GPG checking,隻用于<code>present</code> or <code>latest</code>。
disablerepo #臨時禁止使用yum庫。 隻用于安裝或更新時。
enablerepo #臨時使用的yum庫。隻用于安裝或更新時。
name= #所安裝的包的名稱
state= #present安裝, latest安裝最新的, absent 解除安裝軟體。
update_cache #強制更新yum的緩存。
(1) ansible web -m yum -a 'name=htop state=present disable_gpg_check =yes'
在遠端安裝htop包
arguments #指令行提供額外的參數
enabled #設定開機啟動。
name= #服務名稱
runlevel #開機啟動的級别,一般不用指定。
state #started啟動服務, stopped停止服務, restarted重新開機服務, reloaded重載配置
(1)啟動nginx服務并設定範圍自啟動:
[root@ansiable ~]# ansible web -m service -a 'name=nginx state=started enabled=true'
使用者子產品,管理使用者帳号action: user
comment # 使用者的描述資訊
createhome # 是否建立家目錄
force # 在使用state=absent是, 行為與userdel –force一緻.
group # 指定基本組
groups # 指定附加組,如果指定為(groups=)表示删除所有組
home # 指定使用者家目錄
move_home # 如果設定為home=時, 試圖将使用者主目錄移動到指定的目錄
name # 指定使用者名
non_unique # 該選項允許改變非唯一的使用者ID值
password # 指定使用者密碼
remove # 在使用state=absent時, 行為是與userdel –remove一緻
shell # 指定預設shell
state # 設定帳号狀态,不指定為建立,指定值為absent表示删除
system # 當建立一個使用者,設定這個使用者是系統使用者。這個設定不能更改現有使用者
uid # 指定使用者的uid
(1)ansible web -m user -a 'name=tom comment="tom is cat" uid=1111 group=tom groups=wheel shell=/bin/zshell home=/home/tomhome'
action: group
gid # 設定組的GID号
name= # 管理組的名稱
state # 指定組狀态,預設為建立,設定值為absent為删除
system # 設定值為yes,表示為建立系統組
(1)建立名為tom的組
[root@Ansible ~]#ansible web -m group -a 'name=tom state=present'
(1)将本地的腳本在其他主機上運作
[root@Ansible ~]#vim test.sh
#/bin/bash
touch /tmp/test.sh.log
#建立/tmp/test.sh.log
echo “hello” >> /tmp/test.sh.log
(2)執行指令
ansible web -m script -a ‘/root/test.sh’
(3)檢視web主機組下主機的/tmp/test.sh.log
[root@Ansible ~]#ansible web -m shell -a ‘cat /tmp/test.sh.log’
setup子產品,主要用于擷取主機資訊,在playbooks裡經常會用到的一個參數gatherfacts就與該子產品相關。setup子產品下經常使用的一個參數是filter參數
(1)ansible web -m setup -a "filter='ansible_mb'" 檢視主機記憶體資訊
(2)ansible 192.168.191.132 -m setup -a "filter='ansible_eth[0-1]' " 檢視地接口為eth0-1的網卡資訊
(3)ansible web -m setup -a "filter='mem'* " 檢視記憶體多大
playbook是ansible用于配置,部署,和管理被控節點的劇本。
通過playbook的較長的描述,執行其中的一系列tasks,可以讓遠端主機達到預期的狀态。playbook就像Ansible控制器給被控節點列出的的一系列to-do-list,而被控節點必須要完成。
也可以這麼了解,playbook 字面意思,即劇本,現實中由演員按照劇本表演,在Ansible中,這次由計算機進行表演,由計算機安裝,部署應用,提供對外服務,以及組織計算機處理各種各樣的事情。
Hosts:主機清單,主機組
Tasks:任務清單
Variables
Templates:包含了模闆文法的文本檔案;
Handlers:由特定條件觸發的任務;
Hosts:運作指定任務的目标主機;
remoute_user: 在遠端主機上執行任務的使用者;
sudo_user:
tasks:任務清單
cd /etc/ansible
vim web1.yml
使用:ansible-playbook web1.yml
vim web2.yml
使用:ansible-playbook web2.yml
vim web3.yml
使用:ansible-playbook web3.yml -e rpmname=nginx
mv /root/nginx.conf /root/nginx.conf.j2 标記成模闆
在模闆中可以使用變量
ansible web -m setup -a "filter=vcpu" 擷取cpu顆數
(1)vim /root/nginx.conf.j2
worker_processes {{ ansible_processor_vcpus }}; 使用變量
listen {{ listenpport }};
(2)vim web.yml
使用:ansible-playbook web.yml
本文轉自 hawapple 51CTO部落格,原文連結:http://blog.51cto.com/guanm/2048854