# 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 不支持管道命令 |

参数选项含义
chdirchdir /opt执行 ansible 时,切换到指定的目录
createscreates /data/file如果文件存在,则跳过执行
removesremoves /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'
  1. removes 如果 /data/file 文件存在,则执行;
[root@manager ~]# ansible webservers -m command -a 'removes=/data/file ifconfig ens192'
# 6.2 shell 模块

功能:在远程主机执行 Shell 命令,执行管道等特殊符号的操作;

参数选项含义
chdirchdir /opt执行 ansible 时,切换到指定的目录
createscreates /data/file如果文件存在,则跳过执行
removesremoves /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 模块

功能:管理各个操作系统的软件包;

参数选项含义
namehttpd、nginx、 ...指定安装软件包名或软件包 URL
statepresent (安装)-(default)、absent (删除)、latest (最新版)指定 yum 对应的方法
enablerepoepel、base、...允许从哪些仓库获取软件
disablerepoepel、base、...禁止从哪些仓库获取软件
excludekernel、...排除某些软件包
download_onlyyes、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文件复制到远程的绝对路径
ownerroot(Defaults)文件复制到远程并设定属主
grouproot(Defaults)文件复制到远程并设定属组
modefile=644,directory=755文件复制到远程并设定权限
backupyes备份被修改前的配置文件
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 模块用法一致;

参数选项含义
namehttpd、nginx、...定义要启动服务的名称
statestarted、stopped、restarted、reloaded指定服务状态
enabledyes、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递归方式 (可以是递归授权)
statetouch、directory、link、absent类型
ownerroot(Defaults)文件复制到远程并设定属主
grouproot(Defaults)文件复制到远程并设定属组
modefile=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
statepresent(Default)、absent是否将组创建在远程主机上
systemyes、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为用户设置附加组
appendyes追加
shellpresent(Default)、absent为用户设置登陆时的 Shell
create_homeyes(Default)、no为用户创建主目录
statepresent(Default)、absent用户是否应该存在
removeyes、no(Default)删除与用户关联的目录,只有当 state=absent 时生效
generate_ssh_keyyes、no(Default)为相关用户生成 ssh 密钥。不会覆盖现有的 ssh 密钥
ssh_key_bits2048创建用户 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挂载至本地的路径
fstypexfs、nfs ...文件系统类型
optsydefaults、ro ...挂载的参数
statepresent(永久挂载,不会立即生效)、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 模块

功能:通过互联网下载软件至被控端本地;

参数选项含义
urlHTTP, HTTPS ...资源文件在互联网上的具体位置
dest文件下载位置的绝对路径
mode文件下载后的权限
checksummd5、sha256对下载的资源进行校验
timeout10(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压缩后的文件
formatbz2、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_srcyes、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 防火墙;

参数选项含义
stateenforcing、permissive、disabledSelinux 模式

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 防火墙;

参数选项含义
serviceHTTP, HTTPS ...添加或删除 firewalld 中的服务名称
port80、443 ...添加或删除 firewalld 中的端口范围
masqueradeyes、no启用或禁止防火墙的地址伪装
immediateyes、no(Default)防火墙规则当前是否立即生效
permanentyes、no防火墙规则当前是否重启后也生效
stateenabled、disabled启用或禁用当前配置的规则
rich_rule在防火墙中添加或删除富规则
source添加或删除防火墙源 IP 网络
zonepublic(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目标端口
protocoltcp协议
jumpDROP、ACCEPT动作
actioninsert(插入)、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仓库的地址
gpgcheckyes,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内核参数值
statepresent状态

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将文本插入到 “指定的行” 之前
stateabsent、present(Defaults)删除对应的文本时,需要 state=absent
backrefsyes、no1. 支持后向引用、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"'
此文章已被阅读次数:正在加载...更新于

请我喝[茶]~( ̄▽ ̄)~*

Xu Yong 微信支付

微信支付

Xu Yong 支付宝

支付宝