# 1.Ansible 快速入门
# 1.1 什么是 Ansible
Ansible 是一个 IT 自动化的配置管理工具,自动化主要体现在 Ansible 集成了丰富模块,以及强大的功能组件,可以通过一个命令行完成一系列的操作。进而能减少我们重复性的工作,以提高工作的效率。

# 1.2 Ansible 主要功能
- 批量执行远程命令,可以对 N 多台主机同时进行命令的执行。
- 批量配置软件服务,可以进行自动化的方式配置和管理服务。
- 实现软件开发功能, jumpserver 底层使用 ansible 来实现的自动化管理。
- 编排高级的 IT 任务, Ansible 的 Playbook 是一门编程语言,可以用来描绘一套 IT 架构。
# 1.3 Ansible 的特点
- 容易学习:无代理,不像 salt 既要学客户端与服务端,还需要学习客户端与服务端中间通讯协议;
- 操作灵活: Ansible 有较多的模块,提供了丰富的功能、playbook 则提供类似于编程语言的复杂功能;
- 简单易用:体现在 Ansible 一个命令可以完成很多事情;
- 安全可靠:因为 Ansible 使用了 SSH 协议进行通讯,既稳定也安全;
- 移植性高:可以将写好的 playbook 拷贝至任意机器进行执行;
- 幂等性:一个任务执行 1 遍和执行 n 遍效果一样,不会因为重复执行带来意外情况;
# 1.4 Ansible 基础架构
Ansible 架构中的控制节点、被控制节点、 inventroy、ad-hoc、playbook、Connection Protocol 是什么?

# 2.Ansible 安装与配置
# 2.1 rpm 安装
#1. 下载 epel 源 | |
[root@manager ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo | |
[root@manager ~]# yum install ansible -y | |
#2. 查看版本 | |
[root@manager ~]# ansible --version | |
#3. 测试是否可用 | |
[root@manager ~]# ansible localhost -m ping | |
localhost | SUCCESS => { | |
"changed": false, | |
"ping": "pong" | |
} |
# 2.2 pip 安装
#1.pip 安装 | |
[root@manager ~]# yum install python3 python3-devel python3-pip -y | |
[root@manager ~]# pip3 install --upgrade pip -i https://pypi.douban.com/simple/ | |
[root@manager ~]# pip3 install ansible -i https://pypi.douban.com/simple/ | |
[root@manager ~]# /usr/local/bin/ansible --version | |
#2. 查看版本 | |
[root@manager ~]# ansible --version | |
#3. 测试是否可用 | |
[root@manager ~]# ansible localhost -m ping | |
localhost | SUCCESS => { | |
"changed": false, | |
"ping": "pong" | |
} |
# 3.Ansible 配置
# 3.1 Ansible 配置路径
[root@web01 ~]# rpm -qc ansible | |
/etc/ansible/ansible.cfg #主配置文件,配置 ansible 工作特性 | |
/etc/ansible/hosts #配置主机清单文件 | |
/etc/ansible/roles/ #存放 ansible 角色的目录 |
# 3.2 Ansible 主配置文件
ansible 的主配置文件存在 /etc/anible/ansible.cfg ,其中大部分的配置内容无需进行修改;
#inventory = /etc/ansible/hosts # 主机列表配置文件 | |
#inventory = ./hosts # 路径重新定义 | |
#library = /usr/share/my_modules/ #库文件存放目录 | |
#module_utils = /usr/share/my_module_utils/ #模块件存放目录 | |
#remote_tmp = ~/.ansible/tmp #临时 py 文件存放在远程主机目录 | |
#local_tmp = ~/.ansible/tmp #本机的临时执行目录 | |
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml | |
#forks = 5 # 默认并发数 | |
#roles_path = /etc/ansible/roles #角色存储路径 | |
#sudo_user = root #默认 sudo 用户 | |
#ask_sudo_pass = True #每次执行是否询问 sudo 的 ssh 密码 | |
#ask_pass = True #每次执行是否询问 ssh 密码 | |
#remote_port = 22 #远程主机端口 | |
#host_key_checking = False #检查对应服务器的 host_key,建议取消 | |
#log_path = /var/log/ansible.log #ansible 日志,建议启用 |
# 3.3 Ansible 配置优先级
Ansible 的配置文件可以存放在任何位置,但配置文件有读取顺序,查找顺序如下:
- 1、最先查找 $ANSIBLE_CONFIG 变量
- 2、其次查找当前目录下 ansible.cfg
- 3、然后查找用户家目录下的 .ansible.cfg
- 4、最后查找 /etc/ansible/ansible.cfg
通过命令行操作演示,验证结论:
第一步读取:ANSIBLE_CONFIG
[root@manager ~]# export ANSIBLE_CONFIG=/tmp/ansible.cfg | |
[root@manager ~]# touch /tmp/ansible.cfg | |
[root@manager ~]# ansible --version | |
[root@web01 ~]# ansible --version | |
ansible 2.9.27 | |
config file = /tmp/ansible.cfg | |
[root@manager ~]# unset ANSIBLE_CONFIG # 取消 |
第二步读取:当前项目目录下的 ansible.cfg
[root@manager ~]# mkdir project1 | |
[root@manager ~]# cd project1/ | |
[root@manager project1]# touch ansible.cfg | |
[root@manager project1]# ansible --version | |
ansible 2.9.27 | |
config file = /root/project1/ansible.cfg |
第三步读取:当前用户家目录下的 .ansible.cfg
[root@manager ~]# touch ~/.ansible.cfg | |
[root@manager ~]# ansible --version | |
ansible 2.9.27 | |
config file = /root/.ansible.cfg |
第四步读取: /etc/ansible/ansible.cfg
[root@manager project1]# rm -f ~/.ansible.cfg | |
[root@manager ~]# ansible --version | |
ansible 2.9.27 | |
config file = /etc/ansible/ansible.cfg |
# 4.Ansible Inventory
# 4.1 Inventory 是什么
- Inventory 文件主要用来填写被管理主机以及主机组信息;
- 默认 Inventory 文件为 /etc/ansible/hosts ;
- 当然也可以自定义一个文件,当执行 ansible 命令时使用 -i 选项指定 Inventory 文件位置;
[root@manager ~]# cat /etc/ansible/hosts | |
[webservers] | |
172.16.1.7 | |
172.16.1.8 | |
172.16.1.9 | |
[dbservers] | |
172.16.1.51 | |
172.16.1.41 | |
db[01:08].ixuyong.cn | |
[testservers] | |
test[01:99]-node.ixuyong.cn | |
[root@manager ~]# ansible dbservers --list-hosts | |
hosts (10): | |
172.16.1.51 | |
172.16.1.41 | |
db01.ixuyong.cn | |
db02.ixuyong.cn | |
db03.ixuyong.cn | |
db04.ixuyong.cn | |
db05.ixuyong.cn | |
db06.ixuyong.cn | |
db07.ixuyong.cn | |
db08.ixuyong.cn |
# 4.2 Inventory 密码连接方式
1. 指定主机 IP,指定主机端口,指定主机用户名、密码;
[root@manager ~]# cat /etc/ansible/hosts | |
[webservers] | |
172.16.1.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='talent' | |
172.16.1.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='talent' | |
[dbservers] | |
172.16.1.51 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='talent' | |
172.16.1.41 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='talent' | |
[root@manager ~]# ansible webservers -m ping | |
172.16.1.7 | SUCCESS => { | |
"ansible_facts": { | |
"discovered_interpreter_python": "/usr/bin/python" | |
}, | |
"changed": false, | |
"ping": "pong" | |
} | |
172.16.1.8 | SUCCESS => { | |
"ansible_facts": { | |
"discovered_interpreter_python": "/usr/bin/python" | |
}, | |
"changed": false, | |
"ping": "pong" | |
} |
2. 通过变量方式定义密码;
[root@manager ~]# cat /etc/ansible/hosts | |
[webservers] | |
172.16.1.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='talent' | |
172.16.1.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='talent' | |
[dbservers] | |
172.16.1.51 | |
172.16.1.41 | |
[dbservers:vars] | |
ansible_ssh_port=22 | |
ansible_ssh_user=root | |
ansible_ssh_pass='talent' | |
[root@manager ~]# ansible dbservers -m ping | |
172.16.1.41 | SUCCESS => { | |
"ansible_facts": { | |
"discovered_interpreter_python": "/usr/bin/python" | |
}, | |
"changed": false, | |
"ping": "pong" | |
} | |
172.16.1.51 | SUCCESS => { | |
"ansible_facts": { | |
"discovered_interpreter_python": "/usr/bin/python" | |
}, | |
"changed": false, | |
"ping": "pong" | |
} |
# 4.3 Inventory 秘钥连接方式
1. 创建秘钥对,然后下发秘钥;
[root@manager ~]# ssh-keygen | |
[root@manager ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7 | |
[root@manager ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.8 | |
[root@manager ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41 | |
[root@manager ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.51 |
2. 测试连通性
[root@manager ~]# cat /etc/ansible/hosts | |
[webservers] | |
172.16.1.7 | |
172.16.1.8 | |
[dbservers] | |
172.16.1.51 | |
172.16.1.41 | |
[root@manager ~]# ansible all -m ping | |
172.16.1.41 | SUCCESS => { | |
"ansible_facts": { | |
"discovered_interpreter_python": "/usr/bin/python" | |
}, | |
"changed": false, | |
"ping": "pong" | |
} | |
172.16.1.7 | SUCCESS => { | |
"ansible_facts": { | |
"discovered_interpreter_python": "/usr/bin/python" | |
}, | |
"changed": false, | |
"ping": "pong" | |
} | |
172.16.1.51 | SUCCESS => { | |
"ansible_facts": { | |
"discovered_interpreter_python": "/usr/bin/python" | |
}, | |
"changed": false, | |
"ping": "pong" | |
} | |
172.16.1.8 | SUCCESS => { | |
"ansible_facts": { | |
"discovered_interpreter_python": "/usr/bin/python" | |
}, | |
"changed": false, | |
"ping": "pong" | |
} |
# 4.4 Inventory 主机匹配方式
ansible 的 host-pattern 主机匹配使用说明;
#1. 指定操作所有的组 | |
ansible all -m ping | |
#2. 通配符 | |
ansible "*" -m ping | |
ansible web* -m ping | |
#3. 与:在 webservers 组;并且在 dbsservers 中的主机; | |
ansible "webservers:&dbservers" -m ping | |
#4. 或:在 webservers 组,或者在 appservers 中的主机; | |
ansible "webservers:appservers" -m ping | |
#5. 非:在 webservers 组,但不在 apps 组中的主机 | |
ansible 'webservers:!apps' -m ping | |
#6. 正则表达式; | |
ansible "~(web|db).*\.oldxu\.com" -m ping |
# 4.5 普通用户管理被控端
场景说明: ansible 使用 xuyong 普通用户统一管理所有的被控端节点
1. 首先控制端,被控端,都需要有 olxu 用户
[root@manager ~]# useradd xuyong | |
[root@manager ~]# echo "talent" | passwd --stdin xuyong |
2. 将控制端 xuyong 用户的公钥推送到被控端 xuyong 用户下,使普通用户能进行免密码登录
[root@manager ~]# su xuyong | |
[xuyong@manager root]$ ssh-keygen | |
[xuyong@manager root]$ ssh-copy-id -i ~/.ssh/id_rsa.pub xuyong@172.16.1.7 | |
[xuyong@manager root]$ ssh-copy-id -i ~/.ssh/id_rsa.pub xuyong@172.16.1.8 |
3. 所有主机的 xuyong 用户都必须添加 sudo 权限。
[root@web01 ~]# vim /etc/sudoers | |
xuyong ALL=(ALL) NOPASSWD: ALL | |
# 检查语法 | |
[root@web01 ~]# visudo -csf /etc/sudoers | |
/etc/sudoers: parsed OK |
4. 修改控制端 /etc/ansible/ansible.cfg 主配置文件,配置普通用户提权
[root@manager ~]# vim /etc/ansible/ansible.cfg | |
[privilege_escalation] | |
become=True | |
become_method=sudo | |
become_user=root | |
become_ask_pass=False |
5. 使用 xuyong 用户测试是否能执行任务
[xuyong@manager root]$ ansible webservers -m shell -a "mkdir /opt/test" | |
[WARNING]: Consider using the file module with state=directory rather than running 'mkdir'. If you need to use command because | |
file 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.7 | CHANGED | rc=0 >> | |
172.16.1.8 | CHANGED | rc=0 >> | |
[root@web01 ~]# ll /opt/ | |
drwxr-xr-x 2 root root 6 Oct 22 20:56 test | |
[root@web02 ~]# ll /opt/ | |
drwxr-xr-x 2 root root 6 Oct 22 20:56 test |
# 5.Ansible ad-hoc
# 5.1 ad-hoc 是什么
ad-hoc 简而言之就是 “临时命令”,执行完即结束,并不会保存;
- 应用场景 1:查看多台节点的进程是否存在;
- 应用场景 2:拷贝指定的文件至本地;
# 5.2 ad-hoc 命令使用
命令示例: ansible 'groups' -m command -a 'df -h' ,含义如下图所示;

# 5.3 ad-hoc 执行过程
- 1. 加载自己的配置文件,默认 /etc/ansible/ansible.cfg ;
- 2. 查找对应的主机配置文件,找到要执行的主机或者组;
- 3. 加载自己对应的模块文件,如 command ;
- 4. 通过 ansible 将模块或命令生成对应的临时 py 文件,并将该文件传输至远程服务器对应执行用户 $HOME/.ansible/tmp/ansible-tmp-number/xxx.py;
- 5. 执行用户家目录的 py 文件;
- 6. 给文件 +x 执行;
- 7. 执行并返回结果;
- 8. 删除临时 py 文件, sleep 0 退出
# 5.4 ad-hoc 执行状态
使用 ad-hoc 执行一次远程命令,注意观察返回结果的颜色;
- 绿色:代表被管理端主机没有被修改
- 黄色:代表被管理端主机发现变更
- 红色:代表出现了故障,注意查看提示
# 6.Ansible 常用模块
ansible 有着诸多的模块,虽然模块众多,但最为常用的模块也就 20-30 个左右;
[root@manager ~]# ansible-doc yum |
# 6.1 command 模块
功能:在远程主机执行 Shell 命令;此为默认模块,可忽略 -m 选项;
注意:shell 支持 | 管道符号,command 不支持管道命令 |
| 参数 | 选项 | 含义 |
|---|---|---|
| chdir | chdir /opt | 执行 ansible 时,切换到指定的目录 |
| creates | creates /data/file | 如果文件存在,则跳过执行 |
| removes | removes /data/file | 如果文件存在,则执行 |
1.chdir 切换目录执行 Shell 命令;
[root@manager project]# ansible webservers -m command -a "creates=/tmp/log ifconfig ens192" |
2.creates 如果 /data/file 文件存在,则不执行,如果不存在,就不执行;
[root@manager ~]# ansible webservers -m command -a 'creates=/data/file ifconfig ens192' |
- removes 如果 /data/file 文件存在,则执行;
[root@manager ~]# ansible webservers -m command -a 'removes=/data/file ifconfig ens192' |
# 6.2 shell 模块
功能:在远程主机执行 Shell 命令,执行管道等特殊符号的操作;
| 参数 | 选项 | 含义 |
|---|---|---|
| chdir | chdir /opt | 执行 ansible 时,切换到指定的目录 |
| creates | creates /data/file | 如果文件存在,则跳过执行 |
| removes | removes /data/file | 如果文件存在,则执行 |
1. 使用 Shell 命令过滤被控端主机的 IP 地址;
[root@manager ~]# ansible webservers -m shell -a "ifconfig ens192 | awk 'NR==2'" | |
192.168.1.8 | CHANGED | rc=0 >> | |
inet 192.168.1.8 netmask 255.255.255.0 broadcast 192.168.1.255 | |
192.168.1.7 | CHANGED | rc=0 >> | |
inet 192.168.1.7 netmask 255.255.255.0 broadcast 192.168.1.255 |
# 6.3 yum 模块
功能:管理各个操作系统的软件包;
| 参数 | 选项 | 含义 |
|---|---|---|
| name | httpd、nginx、 ... | 指定安装软件包名或软件包 URL |
| state | present (安装)-(default)、absent (删除)、latest (最新版) | 指定 yum 对应的方法 |
| enablerepo | epel、base、... | 允许从哪些仓库获取软件 |
| disablerepo | epel、base、... | 禁止从哪些仓库获取软件 |
| exclude | kernel、... | 排除某些软件包 |
| download_only | yes、no | 仅下载软件包,不安装 |
1. 安装当前最新的 Apache 软件,如果存在则不安装
[root@manger ~]# ansible webservers -m yum -a "name=httpd state=present" |
2. 安装当前最新的 Apache 软件,通过 epel 仓库安装
[root@manger ~]# ansible webservers -m yum -a "name=httpd state=present enablerepo=epel" |
3. 通过公网 URL 安装 rpm 软件
[root@manger ~]# ansible webservers -m yum -a "name=https://xx.rpm state=present" |
4. 安装最新版本的 Apache 软件,如果存在则更新 Apache
[root@manger ~]# ansible webservers -m yum -a "name=httpd state=latest" |
5. 更新所有的软件包,但排除和 kernel 相关的
[root@manger ~]# ansible webservers -m yum -a "name=* state=latest exclude=kernel" |
6. 删除 Apache 软件
[root@manger ~]# ansible webservers -m yum -a "name=httpd state=absent" |
# 6.4 copy 模块
功能:从 ansible 服务端主控端复制文件到远程主机;
| 参数 | 选项 | 含义 |
|---|---|---|
| src | 复制本地目录下的文件至远程服务器 | |
| dest | 文件复制到远程的绝对路径 | |
| owner | root(Defaults) | 文件复制到远程并设定属主 |
| group | root(Defaults) | 文件复制到远程并设定属组 |
| mode | file=644,directory=755 | 文件复制到远程并设定权限 |
| backup | yes | 备份被修改前的配置文件 |
| content | 新建文件并给文件添加内容 |
1. 将本地的 httpd.conf 文件 Listen 端口修改为 8080 ,推送至远程服务器
[root@manger ~]# ansible webservers -m copy -a "src=./httpd.conf dest=/etc/httpd/conf/httpd.conf | |
owner=root group=root mode=644" |
2. 将本地的 httpd.conf 文件 Listen 端口修改为 9090 ,推送至远程服务器,然后检查远端是否存在上一次的备份文件
[root@manger ~]# ansible webservers -m copy -a "src=./httpd.conf dest=/etc/httpd/conf/httpd.conf | |
owner=root group=root mode=644 backup=yes" |
3. 往远程的主机文件中写入内容,如果文件不存在则创建
[root@manger ~]# ansible webservers -m copy -a 'content="oldxu.net123" dest=/etc/rsync.pass owner=root group=root mode="0600" backup=yes |
4. 验证 sudo 配置是否正确(adhoc 测试失败)
[root@manager project]# cat sudoers.yaml | |
- hosts: webservers | |
tasks: | |
- name: Copy a "sudoers" file on the remote machine for editing | |
copy: | |
src: ./sudoers | |
dest: /etc/sudoers | |
validate: /usr/sbin/visudo -csf %s | |
[root@manager project]# ansible-playbook sudoers.yaml |
# 6.5 systemd 模块
功能:管理服务启动与停止,与 service 模块用法一致;
| 参数 | 选项 | 含义 |
|---|---|---|
| name | httpd、nginx、... | 定义要启动服务的名称 |
| state | started、stopped、restarted、reloaded | 指定服务状态 |
| enabled | yes、no | 允许服务开机自启或禁止服务开机自启 |
1. 启动 Httpd 服务
[root@manger ~]# ansible webservers -m systemd -a "name=httpd state=started" |
2. 重载 Httpd 服务
[root@manger ~]# ansible webservers -m systemd -a "name=httpd state=reloaded" |
3. 重启 Httpd 服务
[root@manger ~]# ansible webservers -m systemd -a "name=httpd state=restarted" |
4. 停止 Httpd 服务
[root@manger ~]# ansible webservers -m systemd -a "name=httpd state==stopped" |
5. 启动 Httpd 服务,并加入开机自启
[root@manger ~]# ansible webservers -m systemd -a "name=httpd state=started enabled=yes" |
# 6.6 file 模块
功能:为被控端创建文件或目录,设定权限属性;
| 参数 | 选项 | 含义 |
|---|---|---|
| path | 指定远程服务器的路径 | |
| recurse | 递归方式 (可以是递归授权) | |
| state | touch、directory、link、absent | 类型 |
| owner | root(Defaults) | 文件复制到远程并设定属主 |
| group | root(Defaults) | 文件复制到远程并设定属组 |
| mode | file=644,directory=755 | 文件复制到远程并设定权限 |
1. 创建一个 /data 目录,授权为 www 身份,递归授权目录
[root@manger ~]# ansible webservers -m file -a 'path=/data owner=www group=www mode="0755" state=directory recurse=yes' |
2. 在 /data 目录中创建一个文件
[root@manger ~]# ansible webservers -m file -a 'path=/data/books owner=www group=www mode="0644" state=touch' |
# 6.7 group 模块
功能:管理被控端用户组;
| 参数 | 选项 | 含义 |
|---|---|---|
| name | 指定创建的组名 | |
| gid | 为组设置可选 gid | |
| state | present(Default)、absent | 是否将组创建在远程主机上 |
| system | yes、no(Default) | 是否创建系统组 |
1. 创建 www 基本组,指定 uid 为 666
[root@manger ~]# ansible webservers -m group -a 'name=www gid=666 state=present' |
2. 创建 www 系统组
[root@manger ~]# ansible webservers -m group -a 'name=mysqldb system=yes state=present' |
3. 删除 mysqldb 基本组
[root@manger ~]# ansible webservers -m group -a "name=mysqldb state=absent" |
# 6.8 user 模块
功能:管理被控端用户;
| 参数 | 选项 | 含义 |
|---|---|---|
| name | 创建或删除的用户名 | |
| uid | 指定 uid | |
| group | 为用户设置指定基本组 | |
| groups | 为用户设置附加组 | |
| append | yes | 追加 |
| shell | present(Default)、absent | 为用户设置登陆时的 Shell |
| create_home | yes(Default)、no | 为用户创建主目录 |
| state | present(Default)、absent | 用户是否应该存在 |
| remove | yes、no(Default) | 删除与用户关联的目录,只有当 state=absent 时生效 |
| generate_ssh_key | yes、no(Default) | 为相关用户生成 ssh 密钥。不会覆盖现有的 ssh 密钥 |
| ssh_key_bits | 2048 | 创建用户 ssh 密钥中位数 |
| ssh_key_file | .ssh/id_rsa(Default) | 可以实现 ssh 密钥改名,或变更存放 ssh 密钥位置 |
| password | 设定对应的密码,必须是加密后的字符串才行,否则不生效 |
1. 创建 www 用户,指定 uid 666,基本组 www
[root@manager project]# ansible webservers -m user -a 'name=www uid=666 group=www shell=/sbin/nologin create_home=no' |
2. 创建 db 用户,基本组是 root,附加组,adm,sys
[root@manager project]# ansible webservers -m user -a 'name=db group=root groups=adm,sys append=yes shell=/bin/bash create_home=yes' |
3. 创建一个 devops 用户,密码 talent,需要正常登录系统;
[root@manager project]# ansible webservers -m user -a 'name=devops password=$6$salt$MUVhjPhKyI2uE9sPg7185PcBQFlDwLGPbVTx.CsD6GXQbRGsUfmjsSfb9e9ej2.vLgmBI5CtgFq1plbD0a6tM. shell=/bin/bash create_home=yes' |
4. 创建一个 dev 用户,并为其生成对应的秘钥
[root@manager project]# ansible webservers -m user -a 'name=dev generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=~/.ssh/id_rsa' |
5. 移除 db 用户
[root@manager ~]# ansible webservers -m user -a "name=db remove=yes state=absent" |
# 6.9 mount 模块
功能:管理被控端设备挂载;
| 参数 | 选项 | 含义 |
|---|---|---|
| src | 源设备的路径 | |
| path | 挂载至本地的路径 | |
| fstype | xfs、nfs ... | 文件系统类型 |
| opts | ydefaults、ro ... | 挂载的参数 |
| state | present(永久挂载,不会立即生效)、absent(卸载临时挂载 + 永久挂载)、mounted(临时挂载)、unmounted(临时卸载) | 挂载的状态 |
1. 将 172.16.1.7 的 /data 目录挂载到 172.16.1.8 /opt 目录;
[root@manager ~]# ansible 172.16.1.8 -m mount -a 'src=172.16.1.7:/data path=/opt fstype=nfs opts=defaults state=mounted' |
2. 临时卸载 nfs 的挂载,但不清理 /etc/fstab
[root@manager ~]# ansible webservers -m mount -a "src=172.16.1.61:/ops path=/opt fstype=nfs opts=defaults state=unmounted" |
3. 永久卸载 nfs 挂载,同时清理 /etc/fstab
[root@manager ~]# ansible webservers -m mount -a "src=172.16.1.61:/ops path=/opt fstype=nfs opts=defaults state=absent" |
# 6.10 cron 模块
功能:管理被控端计划任务;
| 参数 | 选项 | 含义 |
|---|---|---|
| name | 定时任务基本描述 | |
| job | 定时任务要执行的命令 | |
| minute | (Default)、0-59 | 分 |
| hour | (Default)、0-23 | 时 |
| day | (Default)、1-31 | 日 |
| month | (Default)、1-12 | 月 |
| weekday | (Default)、0-6 | 周 |
1. 每天凌晨 3 点执行 /bin/bash/scripts/client_push_data_server.sh &>/dev/null
[root@manager ~]# ansible webservers -m cron -a 'name="backups app data scripts" hour=03 minute=00 job="/bin/bash /scripts/client_push_data_server.sh &>/dev/null"' |
2. 添加定时任务, 每天的凌晨 2 点和凌晨 5 点执行一次 ls
[root@manager ~]# ansible webserver -m cron -a "name='cron02' minute=0 hour=2,5 job='ls >/dev/null'" |
3. 删除 backups app data script 执行;
[root@manager ~]# ansible webservers -m cron -a 'name="backups app data scripts" hour=03 minute=00 job="/bin/bash /scripts/client_push_data_server.sh &>/dev/null" state=absent' |
4. 注释 backups app data script 执行;
[root@manager ~]# ansible webservers -m cron -a 'name="backups app data scripts" hour=03 minute=00 job="/bin/bash /scripts/client_push_data_server.sh &>/dev/null" disabled=yes' |
# 6.11 get_url 模块
功能:通过互联网下载软件至被控端本地;
| 参数 | 选项 | 含义 |
|---|---|---|
| url | HTTP, HTTPS ... | 资源文件在互联网上的具体位置 |
| dest | 文件下载位置的绝对路径 | |
| mode | 文件下载后的权限 | |
| checksum | md5、sha256 | 对下载的资源进行校验 |
| timeout | 10(Default) | URL 请求超时时间 |
1. 下载一个资源到本地 /tmp 目录;
[root@manager ~]# ansible webservers -m get_url -a 'url=http://fj.ixuyong.cn/config_vpn_new.zip dest=/tmp mode=0666' |
2. 对下载的资源做验证:
[root@manager ~]# md5sum /tmp/config_vpn_new.zip | |
7107b0e2e01facb067842a6c4c7ffa31 /tmp/config_vpn_new.zip | |
[root@manager ~]# ansible webservers -m get_url -a 'url=http://fj.ixuyong.cn/config_vpn_new.zip dest=/opt mode=0666 checksum=md5:7107b0e2e01facb067842a6c4c7ffa31' |
# 6.12 archive 模块
功能:打包与压缩;
| 参数 | 选项 | 含义 |
|---|---|---|
| path | 要压缩的文件或目录 | |
| dest | 压缩后的文件 | |
| format | bz2、gz、tar、xz、zip | 指定打包压缩的类型 |
1. 将被控端 /var/log 目录压缩为 tar 格式,并存储至 /opt 目录下;
[root@manager ~]# ansible webservers -m archive -a 'path=/var/log dest=/opt/log.tar.gz format=gz' |
# 6.13 unarchive 模块
功能:解包与解压缩;
| 参数 | 选项 | 含义 |
|---|---|---|
| src | 要解压的软件包路径 | |
| dest | 解压到目标位置 | |
| remote_src | yes、no(default) | yes:要解压的包在被控端、no:要解压的包在控制端 |
1. 解压控制端的压缩包至被控端;
[root@manager ~]# ansible webservers -m unarchive -a 'src=/root/php.zip dest=/tmp/' |
2. 解压被制端的压缩包至被控端;
[root@manager ~]# ansible webservers -m unarchive -a 'src=/log.tar.gz dest=/tmp/ remote_src=yes' |
# 6.14 selinux 模块
功能:管理 SELINUX 防火墙;
| 参数 | 选项 | 含义 |
|---|---|---|
| state | enforcing、permissive、disabled | Selinux 模式 |
1. 设置 selinux 为 enforcing
[root@manager ~]# ansible webservers -m selinux -a "state=enforcing" |
2. 设置 selinux 为 disabled
[root@manager ~]# ansible webservers -m selinux -a "state=disabled" |
# 6.15 firewalld 模块
功能:管理 firewalld 防火墙;
| 参数 | 选项 | 含义 |
|---|---|---|
| service | HTTP, HTTPS ... | 添加或删除 firewalld 中的服务名称 |
| port | 80、443 ... | 添加或删除 firewalld 中的端口范围 |
| masquerade | yes、no | 启用或禁止防火墙的地址伪装 |
| immediate | yes、no(Default) | 防火墙规则当前是否立即生效 |
| permanent | yes、no | 防火墙规则当前是否重启后也生效 |
| state | enabled、disabled | 启用或禁用当前配置的规则 |
| rich_rule | 在防火墙中添加或删除富规则 | |
| source | 添加或删除防火墙源 IP 网络 | |
| zone | public(Default)、home ... | 指定防火墙区域 |
1. 放行 http 服务流量,设定临时与永久生效;
[root@manager ~]# ansible webservers -m firewalld -a "service=http immediate=yes permanent=yes | |
state=enabled" |
2. 放行 tcp/8080-8090 端口,设定临时与永久生效;
[root@manager ~]# ansible webservers -m firewalld -a "port=8080-8090/tcp immediate=yes permanent=yes | |
state=enabled" |
# 6.16 Iptables 模块
功能:iptables 防火墙模块
| 参数 | 选项 | 含义 |
|---|---|---|
| table | 表 | |
| chain | 链 | |
| source | 来源 IP | |
| destination | 目标 IP | |
| destination_port | 目标端口 | |
| protocol | tcp | 协议 |
| jump | DROP、ACCEPT | 动作 |
| action | insert(插入)、append(追加) | 如何添加规则 |
1. 来源 IP 是 192.168.1.1 目标地址 1.1.1.1 目标端口 80 协议 tcp 则拒绝; 规则要写入第一行;
[root@manager ~]# ansible webservers -m iptables -a 'table=filter chain=INPUT source=192.168.1.1/32 destination=1.1.1.1 destination_port=80 protocol=tcp jump=DROP action=insert' |
2.DNAT: 如果请求 1.1.1:80 端口,则 DNAT 到 2.2.2.2:8800;
[root@manager ~]# ansible webservers -m iptables -a 'table=nat chain=PREROUTING protocol=tcp destination=1.1.1.1 destination_port=80 jump=DNAT to_destination="2.2.2.2:8800"' |
3.DNAT: 如果请求 1.1.1:81 端口,则 DNAT 到 3.3.3.3:8800;
[root@manager ~]# ansible webservers -m iptables -a 'table=nat chain=PREROUTING protocol=tcp destination=1.1.1.1 destination_port=81 jump=DNAT to_destination="3.3.3.3:8800" action=insert' |
4.SNAT: 源地址 172.16.2.0,SNAT 指定从 6.6.6.6 出去;
[root@manager ~]# ansible webservers -m iptables -a 'table=nat chain=POSTROUTING source=172.16.2.0/24 jump=SNAT to_source=6.6.6.6' |
5.SNAT: 源地址 172.16.3.0,SNAT 指定从 7.7.7.7 出去;
[root@manager ~]# ansible webservers -m iptables -a 'table=nat chain=POSTROUTING source=172.16.3.0/24 jump=SNAT to_source=7.7.7.7 action=insert' |
# 6.17 yum_repository 模块
功能:建立 yum 仓库
| 参数 | 选项 | 含义 |
|---|---|---|
| name | 名称,文件名称 | |
| description | 描述,必填 | |
| baseurl | 仓库的地址 | |
| gpgcheck | yes,no | 验证开启 |
| gpgkey |
1. 配置 Nginx yum 仓库
[root@manager ~]# ansible webservers -m yum_repository -a 'name=ansible_nginx description=nginx_yum baseurl="http://nginx.org/packages/centos/$releasever/$basearch/" gpgcheck=yes gpgkey="https://nginx.org/keys/nginx_signing.key"' |
# 6.18 hostname 模块
功能:管理被控端主机名称;
1. 设置主机名称为 ansible-hostname
[root@manager ~]# ansible webservers -m hostname -a 'name=ansible-hostname' |
# 6.19 sysctl 模块
功能:修改内核参数模块;
| 参数 | 选项 | 含义 |
|---|---|---|
| name | 内核参数名称 | |
| value | 内核参数值 | |
| state | present | 状态 |
1. 开启 forward 转发
[root@manager ~]# ansible webservers -m sysctl -a 'name=net.ipv4.ip_forward value=1 state=present' |
# 6.20 lineinfile 模块
功能:修改或删除文件内容,与系统中的 sed 命令类似;
| 参数 | 选项 | 含义 |
|---|---|---|
| path | 指定要操作的文件 | |
| regexp | 使用正则表达式匹配对应的行 | |
| line | 修改为新的内容 | |
| insertafter | 将文本插入到 “指定的行” 之后 | |
| insertbefore | 将文本插入到 “指定的行” 之前 | |
| state | absent、present(Defaults) | 删除对应的文本时,需要 state=absent |
| backrefs | yes、no | 1. 支持后向引用、2. 当未匹配到内容则不操作文件 |
| backup | 是否在修改文件之前对文件进行备份 | |
| create | 当要操作的文件并不存在时,是否创建对应的文件 |
1. 将 SELINUX 修改为 disabled 状态;
[root@manager ~]# ansible webservers -m lineinfile -a 'path=/etc/selinux/config regexp='^SELINUX=' | |
line=SELINUX=disabled' |
2. 替换 httpd.conf 文件中, ^Listen 为 Linsten 8080;
[root@manager ~]# ansible webservers -m lineinfile -a 'path=/etc/httpd/conf/httpd.conf regexp="^Listen" line="Listen 8080"' |
3. 删除 /etc/sudoers 文件中 % wheel 开头的行;
[root@manager ~]# ansible webservers -m lineinfile -a 'path=/etc/sudoers regexp='^%wheel' state=absent' |
4. 替换 /etc/hosts 文件中以 12.0.0.1 的行为 127.0.0.1 ansible.ixuyong.com
[root@manager ~]# ansible webservers -m lineinfile -a 'path=/etc/hosts regex='^127\.0\.0\.1' line="127.0.0.1 ansible.ixuyong.com"' |
5. 给主机增加一个网关;
[root@manager ~]# ansible webservers -m lineinfile -a 'path=/etc/sysconfig/network-scripts/ifcfg-eth1 line="GATEWAY=172.16.1.200"' |
6. 给主机增加一个网关,但需要增加到 ONBOOT 下面;
[root@manager ~]# ansible webservers -m lineinfile -a 'path=/etc/sysconfig/network-scripts/ifcfg-eth1 insertafter="ONBOOT=yes" line="GATEWAY=172.16.1.200"' |
7. 给主机增加一个网关,但需要增加到 ONBOOT 上面;
[root@manager ~]# ansible webservers -m lineinfile -a 'path=/etc/sysconfig/network-scripts/ifcfg-eth1 insertbefore="ONBOOT=yes" line="test=172.16.1.200"' |
