Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。接下来我们接着上篇文章,继续为大家介绍。
阅读这篇文章之前,推荐阅读: 运维工作太忙?一文详解Ansible自动化运维,轻松提升工作效率(上)!
系统管理模块
1)mount模块


案例01-挂载案例
web01把 nfs共享的目录/data目录挂载到 web01的/upload_video 步骤01_web01上面创建挂载点/upload_video ansible web -m file -a 'path=/upload_video state=directory'步骤02_挂载nfs ansible web -m mount -a 'fstype=nfs src="172.16.1.31:/data" path=/upload_video state=mounted ' ansible web -a 'df -h' ansible web -a 'tail -2 /etc/fstab'
2)cron定时任务模块

案例01-添加自动同步时间的定时任务
#1. sync time lidao996 */2 * * * * /sbin/ntpdate ntp1.aliyun.com &>/dev/null 步骤01_备份数据 ansible all -a 'cp /var/spool/cron/root /tmp/' ansible all -a 'ls -l /tmp/root' ansible all -a 'crontab -r'步骤02_书写定时任务 ansible all -m cron -a 'name="sync time by lidao996 20221111" minute="*/2" job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state=present'
用户管理模块
1)user

案例01-创建用户lidao996
[root@m01 ~]# ansible web -m user -a 'name=lidao996'
案例02-创建虚拟用户tengine,指定uid为10086
useradd -u 10086 -s /sbin/nologin -M tengine
[root@m01 ~]# ansible web -m user -a 'name=tengine uid=10086 shell=/sbin/nologin create_home=no state=present'172.16.1.7 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": false,
"group": 10086,
"home": "/home/tengine",
"name": "tengine",
"shell": "/sbin/nologin",
"state": "present",
"system": false,
"uid": 10086}[root@m01 ~]# ansible web -a 'id tengine'172.16.1.7 | CHANGED | rc=0 >>uid=10086(tengine) gid=10086(tengine) groups=10086(tengine)[root@m01 ~]# ansible web -a 'grep tengine /etc/passwd'172.16.1.7 | CHANGED | rc=0 >>tengine:x:10086:10086::/home/tengine:/sbin/nologin
2)group模块

模块总结

Ansible模块实战-部署rsync服务端

##rsyncd.conf start####rsyncd 20221111fake super = yes uid = rsync gid = rsync use chroot = nomax connections = 200timeout = 300pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log ignore errors read only = falselist = false hosts allow = 172.16.1.0/24#hosts deny = 0.0.0.0/32auth users = rsync_backup secrets file = /etc/rsync.password[data]comment = "backup dir by oldboy lidao996"path = /data[backup]comment = "backup dir by oldboy lidao996"path = /backup[nfsbackup]comment = 'nfsbackup dir by lidao996'path = /nfsbackup
根据命令及对应操作选择ansible模块

根据选择的模块实现对应的功能
1)服务部署:yum安装或更新
ansible backup -m yum -a 'name=rsync state=lastest'
2)配置文件分发
mkdir -p /server/ans/pro-rsync 准备配置文件存放在 上面目录中 rsyncd.conf ansible backup -m copy -a 'src=/server/ans/pro-rsync/rsyncd.conf dest=/etc/rsyncd.conf backup=yes'
3)虚拟用户 rsync
ansible backup -m user -a 'name=rsync shell=/sbin/nologin create_home=no state=present'
4)密码文件和权限
创建文件 ansible backup -m file -a 'path=/etc/rsync.password mode=600 state=touch'增加 ansible backup -m lineinfile -a 'path=/etc/rsync.password line="rsync_backup:1"'
5)模块对应目录,改所有者
ansible backup -m file -a 'path=/data owner=rsync group=rsync state=directory'
6)重启服务
ansible backup -m systemd -a 'name=rsyncd enabled=yes state=started'
7)命令行测试
[root@m01 /server/ans/pro-rsync]# rsync -av /etc/hostname rsync_backup@172.16.1.31::data
8)指定hosts文件的位置
[root@m01 /server/ans/pro-rsync]# tree /server/ans/pro-rsync//server/ans/pro-rsync/├── hosts └── rsyncd.conf0 directories, 2 files[root@m01 /server/ans/pro-rsync]# ansible -i hosts all -m ping
Ansible-playbook(剧本)
ansible ad-hoc vs playbook区别

playbook vs shell脚本

Playbook剧本极速使用指南
剧本格式叫yaml格式yml
缩进,不要用tab键,空格

核心格式剧本中所有的内容要对齐
对齐的时候不能使用tab键
只能使用空格,2个空格
hosts用于指定在哪些主机执行指令
tasks: 用于对于这些主机,运行什么模块及选项
案例01-在所有机器的/tmp下面创建lidao.txt
[root@m01 /server/ans/playbook]# cat 01.touch.yml - hosts: all
vars:
filename: lidao.txt
tasks:
- name: touch file
shell: touch /tmp/{{ filename }}
cp /etc/ansible/hosts .
ansible-playbook -i hosts 01.touch.yml
[root@m01 /server/ans/playbook]# tree /server/ans/playbook//server/ans/playbook/├── 01.touch.yml
└── hosts0 directories, 2 files- hosts: all
tasks:
- name: touch file
shell: touch /tmp/lida.txt
案例02-添加定时同步时间的定时任务
原始命令行的ansible命令:
ansible all -m cron -a 'name="sync time by lidao996 20221111" minute="*/2" job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state=present'ansible -i hosts all -a 'crontab -l'
修改为剧本之后
#简单粗暴版本---- hosts: all tasks: - name: add cron sync time cron: name="sync time by lidao996 20221111" minute="*/2" job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state=present#格式优化后---- hosts: all tasks: - name: add cron sync time cron: name: "sync time by lidao996 20221111" minute: "*/2" job: "/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state: present
在剧本中使用模块和选项,选项最好是一行一个选项,选项后面跟着冒号,选项要对其与缩进。

[root@m01 /server/ans/playbook]# ansible -i hosts all -a 'crontab -l'172.16.1.7 | CHANGED | rc=0 >>#Ansible: sync time by lidao996 20221111*/2 * * * * /sbin/ntpdate ntp1.aliyun.com &>/dev/null172.16.1.31 | CHANGED | rc=0 >>#Ansible: sync time by lidao996 20221111*/2 * * * * /sbin/ntpdate ntp1.aliyun.com &>/dev/null172.16.1.41 | CHANGED | rc=0 >>#Ansible: sync time by lidao996 20221111*/2 * * * * /sbin/ntpdate ntp1.aliyun.com &>/dev/null172.16.1.51 | CHANGED | rc=0 >>#Ansible: sync time by lidao996 20221111*/2 * * * * /sbin/ntpdate ntp1.aliyun.com &>/dev/null
案例03-企业案例-批量下载安装zabbix-agent2-6.0客户端并启动
---- hosts: all tasks: - name: 1. download zabbix agent2 rpm get_url: ur : https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent2-6.0.0-1.el7.x86_64.rpm dest: /tmp/ validate_certs: no - name: 2. install zabbix agent2 rpm yu : name: /tmp/zabbix-agent2-6.0.0-1.el7.x86_64.rpm state: installed - name: 3. start zabbix agent2 service s stemd: name: zabbix-agent2 enabled: yes state: started
案例04-部署rsync服务端(剧本)
### 1) 服务部署:yum 安装或更新ansible backup -m yum -a 'name=rsync state=lastest'### 2) 配置文件分发mkdir -p /server/ans/pro-rsync 准备配置文件存放在 上面目录中 rsyncd.conf ansible backup -m copy -a 'src=/server/ans/pro-rsync/rsyncd.conf dest=/etc/rsyncd.conf backup=yes'### 3) 虚拟用户 rsyncansible backup -m user -a 'name=rsync shell=/sbin/nologin create_home=no state=present'### 4)密码文件和权限创建文件 ansible backup -m file -a 'path=/etc/rsync.password mode=600 state=touch'增加 ansible backup -m lineinfile -a 'path=/etc/rsync.password line="rsync_backup:1"'### 5)模块对应目录,改所有者ansible backup -m file -a 'path=/data owner=rsync group=rsync state=directory'### 6) 重启服务ansible backup -m systemd -a 'name=rsyncd enabled=yes state=started'
[root@m01 /server/ans/playbook]# ansible -i hosts backup -m ping 172.16.1.41 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"}
[root@m01 /server/ans/playbook]# cat 05-backup-resyncd.yml ---- hosts: backup tasks:# - name: 1) 服务部署:yum 安装或更新# yum: # name: rsync # state: latest - name: 2) 配置文件分发 copy: src: /server/ans/playbook/rsyncd.conf dest: /etc/rsyncd.conf backup: yes - name: 3) 虚拟用户 rsync user: name: rsync shell: /sbin/nologin create_home: no state: present - name: 4) 密码文件和权限 lineinfile: path: /etc/rsync.password mode: 0600 line: "rsync_backup:1" create: yes - name: 5) 模块对应目录,改所有者 file: path: /data/ owner: rsync group: rsync state: directory - name: 6) 重启服务 systemd: name: rsyncd enabled: yes state: started
案例05-部署nfs服务端全流程

Ansible变量系列

变量详解
1)vars、vars_files、group_vars
[root@m01 /server/ans/playbook]# cat 07.vars_dir.yml ---- hosts: all
vars:
dir_name: /oldboy_lidao
file_name: lidao996.icu
tasks:
- name: 01. mkdir
file:
path: "{{ dir_name }}"
state: directory - name: 02. touch file:
path: "{{ dir_name }}/{{ file_name }}"
state: touch
把变量存放到一个文件中. 剧本比较大的时候.
[root@m01 /server/ans/playbook]# cat 07.vars_dir.yml ---- hosts: all
vars:
dir_name: /oldboy_lidao
file_name: lidao996.icu
tasks:
- name: 01. mkdir
file:
path: "{{ dir_name }}"
state: directory - name: 02. touch file:
path: "{{ dir_name }}/{{ file_name }}"
state: touch
创建一个变量文件,给某个组共用
用法:需要创建一个group_vars目录. 目录下面创建以主机组命名的目录. 存放变量文件vars.yml group_vars/ 目录 lb/vars.yml #存放lb组的变量 web/vars.yml #存放web组的变量 data/vars.yml #存放xxx组的变量 all/vars.yml #所有主机共用的变量
案例01-根据不同的主机组创建对应的目录
group_vars/ 目录
web/vars.yml #存放web组的变量
data/vars.yml #存放xxx组的变量
all/vars.yml #所有主机共用的变量web服务器创建 /app/code/目录
dir_name: /app/code/data服务端创建 /data/目录
dir_name: /data/#参考:##变量文件内容[root@m01 /server/ans/playbook]# cat group_vars/data/vars.yml dir_name: /datav2/[root@m01 /server/ans/playbook]# cat group_vars/web/vars.yml dir_name: /app/code/[root@m01 /server/ans/playbook]# tree group_vars/group_vars/├── data
│ └── vars.yml
└── web
└── vars.yml3 directories, 3 files#剧本内容[root@m01 /server/ans/playbook]# cat 09.vars_group_vars_dir.yml- hosts: all
tasks:
- name: 根据主机创建不同的目录 file:
path: "{{ dir_name }}"
state: directory
案例02-使用group_vars的all组定义变量
[root@m01 /server/ans/playbook]# tree group_vars/group_vars/├── all│ └── vars.yml
├── data
│ └── vars.yml
└── web
└── vars.yml3 directories, 3 files[root@m01 /server/ans/playbook]# cat group_vars/all/vars.yml dir_name_code: /app/code/dir_name_data: /data/ [root@m01 /server/ans/playbook]# cat 09.vars_group_vars_dir.yml - hosts: all
tasks:
- name: 01 {{ dir_name_code }}
file:
path: "{{ dir_name_code }}"
state: directory - name: 02 {{ dir_name_data }}
file:
path: "{{ dir_name_data }}"
state: directory
剧本目录,目录结构[root@m01 /server/ans/playbook]# tree .├── 01.touch.yml ├── 02.add-cron.yml ├── 03.add-cron-you.yml ├── 04.install-zabbix-agent2.yml ├── 05-backup-resyncd.yml ├── 06-nfs-server.yml ├── 07.vars_dir.yml ├── 08.vars_files_dir.yml ├── 09.vars_group_vars_dir.yml ├── group_vars │ ├── all│ │ └── vars.yml │ ├── data │ │ └── vars.yml │ └── web │ └── vars.yml ├── hosts ├── rsyncd.conf └── vars.yml4 directories, 15 files
变量基础定义小结

2)ansible-facts变量
facts变量说明== : ansible内置变量,执行剧本,有个默认的任务(task),收集每个主机的基本信息。
#查看 ansible facts变量内容 ansible -i hosts web -m setup 常用fact变量 ansible_hostname #主机名 ansible_memtotal_mb #内存大小(总计) 单位mb ansible_processor_vcpus #cpu数量 ansible_default_ipv4.address #默认的网卡ip eth0ansible_distribution #系统发行版本名字 CentOS Ubuntu Debian ...ansible_processor_cores #核心总数ansible_date_time.date #当前时间 年-月-日
案例01-系统巡检-获取所有机器的基础信息保存到/tmp/主机名命名文件中
步骤:01.创建文件02.写入内容
[root@m01 /server/ans/playbook]# cat 10.vars_sys_info.yml ---- hosts: all
tasks:
- name: 创建文件并写入系统基本信息
lineinfile:
path: /tmp/{{ ansible_hostname }}
create: yes
line: "主机名: {{ ansible_hostname }}\n
ip地址: {{ ansible_default_ipv4.address }}\n
内存总计: {{ ansible_memtotal_mb }}"
- hosts: all
gather_facts: no vars:
dir_name: /oldboy_lidao
file_name: lidao996.icu
tasks:
- name: 01. mkdir
file:
path: "{{ dir_name }}"
state: directory - name: 02. touch file:
path: "{{ dir_name }}/{{ file_name }}"
state: touch
3)ansible-register变量
创建压缩包压缩包名字包含时间,tar打包压缩,date获取时间。
tar zcf /tmp/etc-`date +%F`.tar.gz /etc/
案例01-创建以主机名命名文件/opt/主机名
步骤:01.获取主机名:hostname02.创建文件,使用上一步的结果
register: 变量名字 #这个变量的内容,叫json格式.register: hostname #json格式,只想要输出标准输出 stdout standard output 标准输出.hostname.stdout #取出命令的结果 `hostname`[root@m01 /server/ans/playbook]# cat 12.vars_register.yml---- hosts: all
tasks:
- name: 01.获取主机名
shell: hostname
register: hostname - name: 输出变量内容
debug:
msg: "{{ hostname }}"
[root@m01 /server/ans/playbook]# cat 12.vars_register.yml ---- hosts: all
tasks:
- name: 01.获取主机名
shell: hostname
register: hostname - name: 输出变量内容
debug:
msg: "{{ hostname.stdout }}"
- name: 02. 创建文件 file:
path: /opt/{{ hostname.stdout }}
state: touch
register变量输出结果
{
"msg": {
"changed": true,
"cmd": "hostname",
"delta": "0:00:00.008150",
"end": "2022-04-14 12:32:14.587547",
"failed": false,
"rc": 0, #命令的返回值,0表示正确,非0错误.
"start": "2022-04-14 12:32:14.579397",
"stderr": "", #错误信息
"stderr_lines": [],
"stdout": "backup02", #这个最常用. 命令的结果,输出.
"stdout_lines": [
"backup02"
]
}}register: hostname
hostname.stdout #正常输出信息hostname.rc #取出返回值.hostname.stderr #取出错误信息.
Ansible-进阶-剧本调试方法

Debug模块

案例01-调试-nfs服务端部署剧本
[root@m01 /server/ans/playbook]# cat 13-debug-nfs-server.yml ---- hosts: db
tasks:
- name: 01. 部署nfs服务端软件
yum:
name: nfs-utils
state: installed
- name: 02. 修改配置文件
lineinfile:
path: /etc/exports
line: "/data 172.16.1.0/24(rw)"
state: present
backup: yes
- name: 03. 创建对应的目录,权限 file:
path: /data/
owner: nfsnobody
group: nfsnobody
state: directory
register: file_jieguo - name: 输出,显示这个过程
debug:
msg: "{{ file_jieguo }}"
- name: 04. 启动服务-rpc服务
systemd:
name: rpcbind
enabled: yes
state: started
- name: 05. 启动服务-nfs服务
systemd:
name: nfs
enabled: yes
state: started
tags标签
一般用于调试剧本,给剧本个每个task可以设置个标签
运行剧本的时候可以运行指定标签
运行剧本的时候排除某些标签
[root@m01 /server/ans/playbook]# cat 14-tags-nfs-server.yml ---- hosts: db tasks: - name: 01. 部署nfs服务端软件 yum: name: nfs-utils state: installed tags: - install - name: 02. 修改配置文件 lineinfile: path: /etc/exports line: "/data 172.16.1.0/24(rw)" state: present backup: yes tags: - conf - conf_file - name: 03. 创建对应的目录,权限 file: path: /data/ owner: nfsnobody group: nfsnobody state: directory tags: - conf - conf_dir - name: 04. 启动服务-rpc服务 systemd: name: rpcbind enabled: yes state: started tags: - start_srv - name: 05. 启动服务-nfs服务 systemd: name: nfs enabled: yes state: started tags: - start_srv
运行指定的标签
ansible-playbook -i hosts --tags conf 14-tags-nfs-server.yml ansible-playbook -i hosts --tags conf_file,conf_dir 14-tags-nfs-server.yml
运行剧本的时候排除指定的标签
ansible-playbook -i hosts --skip-tags install,conf_file 14-tags-nfs-server.yml
忽略错误
用于运行剧本的时候,强制让某个任务(模块)运行即使出错了,也不要中断我们的剧本。
[root@m01 /server/ans/playbook]# cat 15-ignore-nfs-server.yml ---- hosts: db tasks: - name: 01. 部署nfs服务端软件 yum: name: nfs-util state: installed ignore_errors: yes tags: - install - name: 02. 修改配置文件 lineinfile: path: /etc/exports line: "/data 172.16.1.0/24(rw)" state: present backup: yes tags: - conf - conf_file - name: 03. 创建对应的目录,权限 file: path: /data/ owner: nfsnobody group: nfsnobody state: directory tags: - conf - conf_dir - name: 04. 启动服务-rpc服务 systemd: name: rpcbind enabled: yes state: started tags: - start_srv - name: 05. 启动服务-nfs服务 systemd: name: nfs enabled: yes state: started tags: - start_srv
Ansible-进阶应用
include文件包含:把一个任务分成多个剧本来实现,书写个总剧本文件,通过include_tasks:引用子剧本文件。
子剧本文件中只需要些模块部分(task部分即可)

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69952968/viewspace-3100712/ ,如需转载,请注明出处,否则将追究法律责任。