ansible批量管理服務

ansible批量管理

ansible優勢

1.ansible無需單獨安裝客戶端,也不需要啟動任何服務
2.ansible是python中的一套完整的自動化執行任務模塊
3.ansible playbook(劇本),采用yaml配置,對于自動化任務執行一目了然
4.ansible模塊較多,對于自動化的場景比較豐富

image.png

管理機安裝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"

image
image

二、變量注冊

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.追加到文件中

image

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 }}/

三、內置變量

image
查看主機名:
[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')

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容