ansible批量管理
ansible優(yōu)勢
1.ansible無需單獨安裝客戶端,也不需要啟動任何服務(wù)
2.ansible是python中的一套完整的自動化執(zhí)行任務(wù)模塊
3.ansible playbook(劇本)感混,采用yaml配置,對于自動化任務(wù)執(zhí)行一目了然
4.ansible模塊較多吧史,對于自動化的場景比較豐富
管理機安裝ansible
yum install -y ansible
1、查看ansible下的配置文件
[ root@m01 ~]# rpm -ql ansible|grep -v /usr/
/etc/ansible
/etc/ansible/ansible.cfg
/etc/ansible/hosts
/etc/ansible/roles
2、編輯主機配置清單
vim /etc/ansible/hosts
最后一行
創(chuàng)建一個主機清單纯出,名稱為oldboy
[oldboy]
172.16.1.31
172.16.1.41
172.16.1.7
3昼窗、使用ping檢查
ansible oldboy -m ping
oldboy ---是主機清單的名稱
-m ---表示使用什么模塊
[root@m01 ~]# ansible oldboy -m ping
172.16.1.41 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong" \\pong表示通了
}
172.16.1.31 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong" \\pong表示通了
}
172.16.1.7 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong" \\pong表示通了
}
ansible模塊
格式:ansible +主機清單+指定模塊的參數(shù)+模塊名稱+執(zhí)行命令的參數(shù)+命令
ansible oldboy -m command hostname -I
-m ---指定模塊的參數(shù)
-a ---模塊中的命令或參數(shù)
命令行中查詢模塊的參數(shù)
ansible-doc -s +模塊名稱
官網(wǎng)查詢模塊的應(yīng)用
https://docs.ansible.com
網(wǎng)站中主要的單詞
src source源
dest 目標(biāo)
content 文件內(nèi)容
state 狀態(tài)
1是趴、command模塊
執(zhí)行命令的模塊
默認(rèn)的模塊:只能執(zhí)行簡單的命令。不支持特殊符號
2澄惊、shell模塊
萬能模塊 支持特殊符號及正則表達(dá)式
可以執(zhí)行命名或腳本
3唆途、copy模塊
推送文件的模塊
src= 源 推送數(shù)據(jù)的全路徑
dest= 目標(biāo) 推送數(shù)據(jù)的目標(biāo)路徑
owner= 指定推送文件的所有者信息
group= 指定推送文件的用戶組信息
mode= 指定推送文件的權(quán)限信息
backup= 對傳送過去的數(shù)據(jù)進行備份
content= 批量在服務(wù)端文件內(nèi)添加內(nèi)容 先清空再增加 與src二選一
force=yes 強制覆蓋 (默認(rèn)為yes)
force=no 對端不存在該文件時才覆蓋
4富雅、script模塊
先把腳本傳送到遠(yuǎn)端再執(zhí)行
5、yum模塊
安裝模塊
name 指定要安裝的軟件包名稱
state 要執(zhí)行的yum動作 installed&present 安裝軟件包 lastet更新軟件包
6肛搬、file模塊
文件模塊
path 指定遠(yuǎn)程主機目錄或文件信息
recurse 遞歸授權(quán)
state directory 在遠(yuǎn)端創(chuàng)建目錄
state touch 在遠(yuǎn)端創(chuàng)建文件
state absent 刪除文件或目錄
state link&hard 創(chuàng)建軟連接或硬鏈接文件
mode 設(shè)置文件或目錄權(quán)限
owner 設(shè)置文件或目錄屬主信息
group 設(shè)置文件或目錄屬組信息
6没佑、service模塊
開啟 關(guān)閉 重啟服務(wù)模塊
name 指定服務(wù)名稱
state started 啟動服務(wù)
state stoped 停止服務(wù)
state restarte 重啟服務(wù)
state reload 平滑重啟
enabled:yes 讓服務(wù)開機自啟 no 默認(rèn)disable
7、group模塊
組模塊
name 指定創(chuàng)建的組名
gid 指定組的gid
state absent 移除遠(yuǎn)端主機的組
state present 創(chuàng)建遠(yuǎn)端的組
8温赔、user模塊
用戶模塊
name 創(chuàng)建的用戶名
uid 指定創(chuàng)建用戶的uid
gid 指定創(chuàng)建用戶的gid
group 指定用戶組名稱
groups 指定附加組名稱
password 給用戶添加密碼
shell 指定用戶登錄shell
create_home 是否創(chuàng)建家目錄
9蛤奢、mount模塊
掛載模塊
src 目標(biāo)路徑
path 掛載路徑
fstype 掛載類型
opts 掛載方式
state present 僅將掛載信息寫入fstab
state mounted 掛載并將信息寫入fstab
state umount 取消掛載
state absent 取消掛載并清除fstab內(nèi)的掛載
10、cron模塊
定時任務(wù)模塊
minute=* hoour=* day=* month=* weekday=*
job 要執(zhí)行的動作
minute=* 分
hour=* 時
day=* 日
month=* 月
weekday=* 周
ansible各模塊使用案例
模塊案例
推送 ansible all -m copy -a 'src=/etc/hostname dest=/tmp/'
查看 ansible all -a 'cat /tmp/hostname'
copy模塊
推送文件模塊
[root@m01 ~]# ansible all -m copy -a 'src=/etc/hostname dest=/tmp/'
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "f434396716e2c9aed47cfde87c491cce5a2c08fa",
"dest": "/tmp/hostname",
"gid": 0,
"group": "root",
"md5sum": "318d7defb693a2eb0d4f1a7a96575a57",
"mode": "0644",
"owner": "root",
"size": 4,
"src": "/root/.ansible/tmp/ansible-tmp-1559017854.64-224769717508792/source",
"state": "file",
"uid": 0
}
...省略
[root@m01 ~]# ansible all -a 'cat /tmp/hostname'
172.16.1.31 | CHANGED | rc=0 >>
m01
172.16.1.41 | CHANGED | rc=0 >>
m01
172.16.1.7 | CHANGED | rc=0 >>
m01
[root@m01 ~]# ansible all -m copy -a 'src=/etc/hosts dest=/tmp/hostname backup=yes'
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"backup_file": "/tmp/hostname.8691.2019-05-28@12:41:13~",
"changed": true,
"checksum": "d2c63329a65fa8c2a390e468cf037e28e6796f0f",
"dest": "/tmp/hostname",
"gid": 0,
script 模塊
[root@m01 ~]# #ansible all -m script -a "/server/scripts/yum.sh"
[root@m01 ~]# ansible all -a 'rpm -qa ipvsadm'
[WARNING]: Consider using the yum, dnf or zypper module rather than running 'rpm'. If you need to use command because
yum, dnf or zypper is insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in
ansible.cfg to get rid of this message.
172.16.1.41 | CHANGED | rc=0 >>
ipvsadm-1.27-7.el7.x86_64
172.16.1.7 | CHANGED | rc=0 >>
ipvsadm-1.27-7.el7.x86_64
yum模塊
ansible all -m yum -a 'name=sl state=present'
使用yum模塊的格式為:‘name=命令 state=present或者install(表示動作)’
file模塊
[root@m01 ~]# #ansible all -m file -a 'path=/tmp/a/b/c/d/e/f/g state=directory '
[root@m01 ~]# #ansible all -m file -a 'path=/tmp/a/b/c/d/e/f/g/oldboy.txt state=touch '
[root@m01 ~]# ansible all -a 'tree /tmp/ '
user模塊
caiav 創(chuàng)建用戶指定uid和gid 1111让腹,不創(chuàng)建家目錄也不允許登陸
groupadd -g 1111 caiav
useradd -u 1111 -g caiav -s /sbin/nologin -M caiav
ansible all -m group -a 'name=caiav gid=1111 state=present'
ansible all -m user -a 'name=caiav uid=1111 group=caiav shell=/sbin/nologin create_home=no '
cron模塊
[root@m01 /etc/ansible]# vim cron.yml
---
- hosts: all
tasks:
- name: chuangjian dingshirenwu
cron:
name: sync time V2
minute: "*/10"
job: /sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
state: present
- hosts: all ---指定主機清單
注:開頭縮進兩個空格
tasks: ---指定工作內(nèi)容
注:比- hosts還縮進兩個空格
- name: ---指定要做的事兒的名字
注:比tasks還縮進兩個空格
cron: ---模塊名稱
注:比- name還縮進兩個空格
命令行執(zhí)行定時任務(wù)
1.檢查是否安裝ntpdate
[09:32 root@m01 ~]# ansible all -a 'rpm -qa ntpdate'
2.每5分鐘同步一次時間:
[09:34 root@m01 ~]# ansible all -m cron -a 'name="sync time" minute="*/5" job="/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1"'
3.再添加一個定時任務(wù)
[09:55 root@m01 ~]# ansible all -m cron -a 'name="guoav-date" minute="*/30" job="/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1"'
4.把此定時任務(wù)刪除:
[09:55 root@m01 ~]# ansible all -m cron -a 'name="guoav-date" state=absent'
查看一下
[09:56 root@m01 ~]# ansible all -a 'crontab -l'
5.再添加一個定時任務(wù)
[09:57 root@m01 ~]# ansible all -m cron -a 'name="guoav-date" minute="*/30" job="/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1"'
6.給定時任務(wù)添加注釋:
[10:00 root@m01 ~]# ansible all -m cron -a 'name="guoav-date" minute="*/30" job="/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1" disabled=yes'
查看一下
[10:00 root@m01 ~]# ansible all -a 'crontab -l'
172.16.1.31 | CHANGED | rc=0 >>
#Ansible: guoav-date
#*/30 * * * * /sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
7.取消注釋:
[10:02 root@m01 ~]# ansible all -m cron -a 'name="guoav-date" minute="*/30" job="/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1" disabled=no'
查看一下
[10:02 root@m01 ~]# ansible all -a 'crontab -l'
172.16.1.7 | CHANGED | rc=0 >>
#Ansible: guoav-date
*/30 * * * * /sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
mount掛載模塊
1.首先保證nfs01客戶端的nfs服務(wù)開啟
[10:12 root@nfs01 ~]# systemctl is-active rpcbind
active
[10:13 root@nfs01 ~]# systemctl is-active nfs
active
2.將/nfs共享目錄掛載到web01服務(wù)端上
[10:09 root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/nfs 172.16.1.0/24
/upload 172.16.1.0/24
[10:09 root@web01 ~]# mount -t nfs 172.16.1.31:/nfs/ /mnt/
[10:09 root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 1.7G 18G 9% /
devtmpfs 476M 0 476M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 197M 105M 93M 54% /boot
tmpfs 98M 0 98M 0% /run/user/0
172.16.1.31:/nfs 19G 1.7G 18G 9% /mnt
測試完把/mnt卸載掉:
umount /mnt
3.用ansible將/nfs掛載到web01上的/upload
1.查看掛載信息
2.掛載 state=mounted
3.查看
[10:27 root@m01 ~]# ansible 172.16.1.7 -a 'showmount -e 172.16.1.31'
172.16.1.7 | CHANGED | rc=0 >>
Export list for 172.16.1.31:
/nfs 172.16.1.0/24
/upload 172.16.1.0/24
[10:26 root@m01 ~]# ansible 172.16.1.7 -m mount -a 'fstype=nfs src=172.16.1.31:/nfs path=/upload state=mounted'
172.16.1.7 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dump": "0",
"fstab": "/etc/fstab",
"fstype": "nfs",
"name": "/upload",
"opts": "defaults",
"passno": "0",
"src": "172.16.1.31:/nfs"
}
[10:26 root@m01 ~]# ansible 172.16.1.7 -a 'df -h'
172.16.1.7 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
....
172.16.1.31:/nfs 19G 1.7G 18G 9% /upload
4.不掛載远剩,只添加到fstab文件
state=present
[10:46 root@m01 ~]# ansible 172.16.1.7 -m mount -a 'fstype=nfs src=172.16.1.31:/date path=/tmp state=present'
5.卸載,會刪除/etc/fstab
state=absent
[11:04 root@m01 ~]# ansible 172.16.1.7 -m mount -a ' src=172.16.1.31:/nfs path=/upload state=absent'
查看命令行的返回值是否執(zhí)行成功
asnible的變量
一、實現(xiàn)變量調(diào)用的方法:
1.在nfs01 backup 創(chuàng)建/backup/lidao的目錄 骇窍,把 /etc/目錄打包壓縮到/backup/lidao目錄下面 etc.tar.gz 瓜晤,目錄名存放在變量中
image
[09:55 root@m01 /etc/ansible]# vim vars.yml
---
- hosts: all
vars:
dir1: /backup/lidao
tasks:
- name: mkdir
file:
path: "{{ dir1 }}"
state: directory
- name: tar /etc
archive:
path: /etc
dest: "{{ dir1 }}/etc.tar.gz"
imageimage
二、變量注冊
1.注冊變量信息
[11:31 root@m01 /etc/ansible]# vim vars1.yml
---
- hosts: all
tasks:
- name: ip
shell: hostname -I|awk '{print $NF}'
register: ipaddr
- name: print ip
shell: echo {{ ipaddr.stdout }} >>/tmp/ip.txt
2.追加到文件中
3.查看追加過去的內(nèi)容:
最后的一行是stdout_lines: [u172.16.1.31] 是我們要的內(nèi)容
image
4.ansible的調(diào)試
需要用到叫register的內(nèi)容
把/etc/打包備份到/backup/ip地址命名目錄/etc-時間.tar.gz
(因為時間關(guān)系這里就打包/etc下的profile和hosts了)
ip是每臺機器的內(nèi)網(wǎng)ip
時間是當(dāng)天的日期:年-月-日image
[12:10 root@m01 /etc/ansible]# vim vars.yml
---
- hosts: all
tasks:
- name: ip
shell: hostname -I|awk '{print $NF}'
register: ipaddr
- name: date
shell: date +%F
register: time
- name: mkdir dir
file:
path: /backup/{{ ipaddr.stdout }}
state: directory
- name: tar /etc/profie && /etc/hosts
archive:
path: /etc
dest: /backup/{{ ipaddr.stdout }}/etc-{{ time.stdout }}.tar.gz
- name: mkdir xf-dir
file:
path: /backup/{{ ipaddr.stdout }}/tc-{{ time.stdout }}
state: directory
- name: tar xf
unarchive:
src: /backup/{{ ipaddr.stdout }}/etc-{{ time.stdout }}.tar.gz
copy: no
dest: /backup/{{ ipaddr.stdout }}/
三腹纳、內(nèi)置變量
查看主機名:
[12:35 root@m01 /etc/ansible]# vim vars2.yml
---
- hosts: all
tasks:
- name: 內(nèi)置變量
debug: msg={{ ansible_hostname }}
四痢掠、查看所有內(nèi)置變量
用ansible_facts 內(nèi)容太多可以篩選
[12:35 root@m01 /etc/ansible]# vim vars2.yml
---
- hosts: all
tasks:
- name: 內(nèi)置變量
debug: msg={{ ansible_facts }}
循環(huán)的使用
---
- hosts: all
remote_user: root
tasks:
- name: Installed Pkg
yum: name={{ item }} state=present
with_items:
- wget
- tree
- lrzsz
判斷的使用
[root@m01 ~]# vim 05.var.yaml
---
- hosts: all
tasks:
- name: yum
yum:
name: tree
state: installed
when: (ansible_hostname == 'nfs01')