ansible批量管理
ansible優勢
1.ansible無需單獨安裝客戶端,也不需要啟動任何服務
2.ansible是python中的一套完整的自動化執行任務模塊
3.ansible playbook(劇本),采用yaml配置,對于自動化任務執行一目了然
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
最后一行
創建一個主機清單,名稱為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 +主機清單+指定模塊的參數+模塊名稱+執行命令的參數+命令
ansible oldboy -m command hostname -I
-m ---指定模塊的參數
-a ---模塊中的命令或參數
命令行中查詢模塊的參數
ansible-doc -s +模塊名稱
官網查詢模塊的應用
https://docs.ansible.com
網站中主要的單詞
src source源
dest 目標
content 文件內容
state 狀態
1、command模塊
執行命令的模塊
默認的模塊:只能執行簡單的命令。不支持特殊符號
2、shell模塊
萬能模塊 支持特殊符號及正則表達式
可以執行命名或腳本
3、copy模塊
推送文件的模塊
src= 源 推送數據的全路徑
dest= 目標 推送數據的目標路徑
owner= 指定推送文件的所有者信息
group= 指定推送文件的用戶組信息
mode= 指定推送文件的權限信息
backup= 對傳送過去的數據進行備份
content= 批量在服務端文件內添加內容 先清空再增加 與src二選一
force=yes 強制覆蓋 (默認為yes)
force=no 對端不存在該文件時才覆蓋
4、script模塊
先把腳本傳送到遠端再執行
5、yum模塊
安裝模塊
name 指定要安裝的軟件包名稱
state 要執行的yum動作 installed&present 安裝軟件包 lastet更新軟件包
6、file模塊
文件模塊
path 指定遠程主機目錄或文件信息
recurse 遞歸授權
state directory 在遠端創建目錄
state touch 在遠端創建文件
state absent 刪除文件或目錄
state link&hard 創建軟連接或硬鏈接文件
mode 設置文件或目錄權限
owner 設置文件或目錄屬主信息
group 設置文件或目錄屬組信息
6、service模塊
開啟 關閉 重啟服務模塊
name 指定服務名稱
state started 啟動服務
state stoped 停止服務
state restarte 重啟服務
state reload 平滑重啟
enabled:yes 讓服務開機自啟 no 默認disable
7、group模塊
組模塊
name 指定創建的組名
gid 指定組的gid
state absent 移除遠端主機的組
state present 創建遠端的組
8、user模塊
用戶模塊
name 創建的用戶名
uid 指定創建用戶的uid
gid 指定創建用戶的gid
group 指定用戶組名稱
groups 指定附加組名稱
password 給用戶添加密碼
shell 指定用戶登錄shell
create_home 是否創建家目錄
9、mount模塊
掛載模塊
src 目標路徑
path 掛載路徑
fstype 掛載類型
opts 掛載方式
state present 僅將掛載信息寫入fstab
state mounted 掛載并將信息寫入fstab
state umount 取消掛載
state absent 取消掛載并清除fstab內的掛載
10、cron模塊
定時任務模塊
minute=* hoour=* day=* month=* weekday=*
job 要執行的動作
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 創建用戶指定uid和gid 1111,不創建家目錄也不允許登陸
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: ---指定工作內容
注:比- hosts還縮進兩個空格
- name: ---指定要做的事兒的名字
注:比tasks還縮進兩個空格
cron: ---模塊名稱
注:比- name還縮進兩個空格
命令行執行定時任務
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.再添加一個定時任務
[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.把此定時任務刪除:
[09:55 root@m01 ~]# ansible all -m cron -a 'name="guoav-date" state=absent'
查看一下
[09:56 root@m01 ~]# ansible all -a 'crontab -l'
5.再添加一個定時任務
[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.給定時任務添加注釋:
[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服務開啟
[10:12 root@nfs01 ~]# systemctl is-active rpcbind
active
[10:13 root@nfs01 ~]# systemctl is-active nfs
active
2.將/nfs共享目錄掛載到web01服務端上
[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'
查看命令行的返回值是否執行成功
asnible的變量
一、實現變量調用的方法:
1.在nfs01 backup 創建/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.查看追加過去的內容:
最后的一行是stdout_lines: [u172.16.1.31] 是我們要的內容
image
4.ansible的調試
需要用到叫register的內容
把/etc/打包備份到/backup/ip地址命名目錄/etc-時間.tar.gz
(因為時間關系這里就打包/etc下的profile和hosts了)
ip是每臺機器的內網ip
時間是當天的日期:年-月-日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 }}/
三、內置變量
查看主機名:
[12:35 root@m01 /etc/ansible]# vim vars2.yml
---
- hosts: all
tasks:
- name: 內置變量
debug: msg={{ ansible_hostname }}
四、查看所有內置變量
用ansible_facts 內容太多可以篩選
[12:35 root@m01 /etc/ansible]# vim vars2.yml
---
- hosts: all
tasks:
- name: 內置變量
debug: msg={{ ansible_facts }}
循環的使用
---
- 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')