运维自动化—ansible的使用
一、ansible的介紹
ansible是新出現的自動化運維工具,基于Python開發,集合了眾多運維工具(puppet、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。
ansible是基于 paramiko 開發的,并且基于模塊化工作,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。ansible不需要在遠程主機上安裝client/agents,因為它們是基于ssh來和遠程主機通訊的。ansible目前已經已經被紅帽官方收購,是自動化運維工具中大家認可度最高的,并且上手容易,學習簡單。
二、ansible特點
1、部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作;
2、默認使用SSH協議對設備進行管理;
3、有大量常規運維操作模塊,可實現日常絕大部分操作。
4、配置簡單、功能強大、擴展性強;
5、支持API及自定義模塊,可通過Python輕松擴展;
6、通過Playbooks來定制強大的配置、狀態管理;
7、輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;
8、提供一個功能強大、操作性強的Web管理界面和REST API接口——AWX平臺。
三、ansible的使用
這里使用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連接測試
四、ansible常用的模塊
1、測試主機的連通性
(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 測試所有的監控主機
2、command:在遠程主機執行命令;不支持|管道命令
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"
3、shell模塊
因為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
operator:x:11:0:operator:/root:/sbin/nologin
4、copy:復制文件到遠程主機,可以改權限等
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
5、file 設置文件屬性
(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:刪除目錄、文件或者取消鏈接文件
6、fetch從遠程某主機獲取文件到本地:
(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?
會自動創建兩個子文件夾區分
7、cron 管理cron計劃任務
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” 查看遠程主機的文件中是否寫入成功
8、yum安裝軟件
conf_file #設定遠程yum安裝時所依賴的配置文件。如配置文件沒有在默認的位置。
disable_gpg_check #是否禁止GPG checking,只用于present?or?latest。
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包
9、service: 服務程序管理
arguments #命令行提供額外的參數
enabled #設置開機啟動。
name= #服務名稱
runlevel #開機啟動的級別,一般不用指定。
state #started啟動服務, stopped停止服務, restarted重啟服務, reloaded重載配置
(1)啟動nginx服務并設置范圍自啟動:
[root@ansiable ~]# ansible web -m service -a 'name=nginx state=started enabled=true'
10、user模塊管理
用戶模塊,管理用戶帳號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'
11、group用戶組模塊
action: group
gid # 設置組的GID號
name= # 管理組的名稱
state # 指定組狀態,默認為創建,設置值為absent為刪除
system # 設置值為yes,表示為創建系統組
(1)創建名為tom的組
[root@Ansible ~]#ansible web -m group -a 'name=tom state=present'
12、script在指定節點運行服務端的腳本
(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’
13、steup模塊
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'* " 查看內存多大
五、Ansible playbook簡介與使用
playbook是ansible用于配置,部署,和管理被控節點的劇本。
通過playbook的詳細描述,執行其中的一系列tasks,可以讓遠端主機達到預期的狀態。playbook就像Ansible控制器給被控節點列出的的一系列to-do-list,而被控節點必須要完成。
也可以這么理解,playbook 字面意思,即劇本,現實中由演員按照劇本表演,在Ansible中,這次由計算機進行表演,由計算機安裝,部署應用,提供對外服務,以及組織計算機處理各種各樣的事情。
1、Playbook的核心元素:
Hosts:主機清單,主機組
Tasks:任務列表
Variables
Templates:包含了模板語法的文本文件;
Handlers:由特定條件觸發的任務;
2、Playbooks配置文件的基礎組件:
Hosts:運行指定任務的目標主機;
remoute_user: 在遠程主機上執行任務的用戶;
sudo_user:
tasks:任務列表
3、例子1:安裝redies,并啟動服務
cd /etc/ansible?
vim web1.yml
使用:ansible-playbook web1.yml
4、例子2:安裝,推送文件,啟動服務
cd /etc/ansible?
vim web2.yml
使用:ansible-playbook web2.yml
5、例子3:定義變量
vim web3.yml
- - - - hosts: webremote_user: roottasks:- name: yum install {{ rpmname }}yum: name={{ rpmname }} state=latest- name: mkdir logcommand: mkdir /usr/share/nginx/logs- name: copy {{ rpmname }}.confcopy: src=/root/{{ rpmname }}.conf dest=/etc/{{ rpmname }}/{{ rpmname }}.confnotify: restarttags: reload{{ rpmname }}- name: start serviceservice: name={{ rpmname }} state=startedhandlers:- name: restartservice: name={{ rpmname }} state=restarted使用:ansible-playbook web3.yml -e rpmname=nginx
6、例子4:模板
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
- - - - hosts: webremote_user: rootvars:- rpmname: nginxlistenport: 8888tasks:- name: yum install {{ rpmname }}yum: name={{ rpmname }} state=latest- name: mkdir logcommand: mkdir /usr/share/nginx/logs- name: copy {{ rpmname }}.conftemplate: src=/root/{{ rpmname }}.conf.j2 dest=/etc/{{ rpmname }}/{{ rpmname }}.confnotify: restarttags: reload{{ rpmname }}- name: start serviceservice: name={{ rpmname }} state=startedhandlers:- name: restartservice: name={{ rpmname }} state=restarted使用:ansible-playbook web.yml
本文轉自 hawapple 51CTO博客,原文鏈接:http://blog.51cto.com/guanm/2048854
總結
以上是生活随笔為你收集整理的运维自动化—ansible的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx反向代理https站点
- 下一篇: Leetcode 137. Single