目录
ansible 简介
ansible 是什么?
ansible 特点
ansible 架构图
ansible 任务执行
ansible 任务执行模式
ansible 执行流程
ansible 命令执行过程
ansible 配置详解
ansible 安装方式
使用 yum 安装
本地yum仓库安装方式:
ansible 程序结构
ansible配置文件查找顺序
ansible配置文件
ansuble主机清单
ansible 配置公私钥
ansible 常用命令
ansible 命令详解
ansible-doc 命令
ansible 常用模块
1)主机连通性测试
2)command 模块
3)shell 模块
4)copy 模块
5)file 模块
6)fetch 模块
7)cron 模块
8)yum 模块
9)service 模块
10)user 模块
11)group 模块
12)script 模块
13)setup 模块
ansible 是什么?
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远
程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。
ansible 特点
1.部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
2.默认使用SSH协议对设备进行管理;
3.有大量常规运维操作模块,可实现日常绝大部分操作;
4.配置简单、功能强大、扩展性强;
5.支持API及自定义模块,可通过Python轻松扩展;
6.通过Playbooks来定制强大的配置、状态管理;
7.轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
8.提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。
上图中我们看到的主要模块如下:
Ansible:Ansible核心程序。
HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。
CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
ConnectionPlugins:连接插件,Ansible和Host通信使用
ansible 任务执行模式
Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhoc和playbook:
ad-hoc模式(点对点模式)
使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。
playbook模式(剧本模式)
是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。
ansible 执行流程
简单理解就是Ansible在运行时, 首先读取ansible.cfg中的配置, 根据规则获取Inventory中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。
ansible 命令执行过程
1.加载自己的配置文件,默认/etc/ansible/ansible.cfg;
2.查找对应的主机配置文件,找到要执行的主机或者组;
3.加载自己对应的模块文件,如 command;
4.通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
5.对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
6.给文件 +x 执行权限;
7.执行并返回结果;
8.删除临时py文件,sleep 0退出;
ansible 安装方式
ansible安装常用两种方式,yum安装、本地yum仓库安装方式
1、采用互联网yum仓库的安装方式:
[root@ansible ~]# yum install epel-release -y #清除yum缓存
[root@ansible ~]# yum -y install ansible #安装Ansible
[root@ansible ~]# ansible --version #可以查看到此信息,说明安装成功
ansible 2.4.2.0
config file = /etc/ansible/ansible.cfg
.............................
2.本地yum仓库安装方式:
本地yum仓库安装,请下载我提供的本地yum仓库,提取码:h2bu
[root@ansible yum.repos.d]# mount /dev/cdrom /media #挂载我提供的ISO文件
mount: /dev/sr0 写保护,将以只读方式挂载
[root@ansible yum.repos.d]# cat /etc/yum.repos.d/a.repo
#删除或移动原有yum配置文件,并编写本地yum文件:
[fd]
baseurl=file:///media
gpgcheck=0
[root@ansible yum.repos.d]# yum clean all #清除yum缓存
[[email protected]]# yum -y install ansible #安装Ansible
[root@ansible yum.repos.d]# ansible --version #可以查看到此信息,说明安装成功
ansible 2.3.1.0
config file = /etc/ansible/ansible.cfg
.....................
ansible 程序结构
通过使用rpm -ql ansible指令可以查看ansible安装的所有文件位置!
安装目录如下(yum安装):
配置文件目录:/etc/ansible/
执行文件目录:/usr/bin/
Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/
Help文档目录:/usr/share/doc/ansible-X.X.X/
Man文档目录:/usr/share/man/man1/
ansible配置文件查找顺序
ansible与我们其他的服务在这一点上有很大不同,这里的配置文件查找是从多个地方找的,顺序如下:
1.检查环境变量ANSIBLE_CONFIG指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg);
2.~/.ansible.cfg,检查当前目录下的ansible.cfg配置文件;
3./etc/ansible.cfg检查etc目录的配置文件。
ansible配置文件
ansible 的配置文件为/etc/ansible/ansible.cfg,ansible 有许多参数,下面我们列出一些常见的参数:
1.inventory = /etc/ansible/hosts #这个参数表示资源清单inventory文件的位置
2.library = /usr/share/ansible #指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
3.forks = 5 #并发连接数,默认为5
4.sudo_user = root #设置默认执行命令的用户
5.remote_port = 22 #指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全
6.host_key_checking = False #设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例
7.timeout = 60 #设置SSH连接的超时时间,单位为秒
8.log_path = /var/log/ansible.log #指定一个存储ansible日志的文件(默认不记录日志)
ansuble主机清单
在配置文件中,我们提到了资源清单,这个清单就是我们的主机清单,里面保存的是一些 ansible 需要连接管理的主机列表。我们可以来看看他的定义方式:
ansible主机清单设置
编辑/etc/ansible/hosts:
[root@CentOS7-master ~]# vim /etc/ansible/hosts #定义方式:
###1、直接指明主机地址或主机名:
green.example.com
blue.example.com
192.168.100.1
92.168.100.10
###2、定义一个主机组[组名]把地址或主机名加进去
[webservers]
192.168.1.100
192.168.1.110
#组成员可以使用通配符来匹配,如下 192.168.1.[1:6] #表示匹配从192.168.1.1——192.168.1.6的主机
配置ansible使用公钥验证
配置这个的原因是为了方便ansible可以实现无秘访问控制其他机器,是实现自动化的前提。这一步可以再配置好ansible.cfg文件以及hosts主机清单后执行。
1、首先生成秘钥
1.##执行下条指令后一路回车即可!
2.[root@CentOS7-master ~]# ssh-keygen -t rsa
2、然后向主机分发秘钥:
1.##所有添加到主机清单中的IP地址或者主机名,全部都要用下条指令执行一遍。
2.[root@CentOS7-master ~]# ssh-copy-id root@主机名或IP地址
3、如果出现以下情况:
1.ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
2.-bash: ssh-copy-id: command not found
3.#请尝试:
4.yum -y install openssh-clientsansible
ansible命令集
/usr/bin/ansible # Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
/usr/bin/ansible-doc # ansible 模块功能查看工具
/usr/bin/ansible-galaxy # 下载/上传优秀代码或Roles模块 的官网平台,基于网络的
/usr/bin/ansible-playbook # ansible 定制自动化的任务集编排工具
/usr/bin/ansible-pull # ansible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维的架构能力要求较高)
/usr/bin/ansible-vault # ansible 文件加密工具
/usr/bin/ansible-console # ansible基于Linux Consoble界面可与用户交互的命令执行工具
ansible命令详解
###命令格式:
ansible [-f forks] [-m module_name] [-a args]
###我们可以通过 ansible -h查看帮助
###本段中所有以“**”开头的参数,均表示是重要的
[root@CentOS7-master ~]# ansible -h
Usage: ansible [options] Options:
** -a MODULE_ARGS, --args=MODULE_ARGS
模块的参数,如果执行默认COMMAND的模块,即是命令参数,如:“date”,“pwd”等等 module arguments 模块参数
-k, --ask-pass
ask for SSH password 登录密码,提示输入SSH密码而不是假设基于密钥的验证
--ask-su-pass
ask for su password su切换密码
-K, --ask-sudo-pass
ask for sudo password 提示密码使用sudo,sudo表示提权操作
--ask-vault-pass
ask for vault password
-B SECONDS, --background=SECONDS
run asynchronously, failing after X seconds (default=N/A)后台运行超时时间
** -C, --check
don‘t make any changes; instead, try to predict some of the changes that may occur #只是测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化
-c CONNECTION, --connection=CONNECTION
connection type to use (default=smart) #连接类型使用
** -f FORKS, --forks=FORKS
specify number of parallel processes to use (default=5) #并行任务数。NUM被指定为一个整数,默认是5
-h, --help
show this help message and exit 打开帮助文档API
** -i INVENTORY, --inventory-file=INVENTORY
specify inventory host file (default=/etc/ansible/hosts) #指定库存主机文件的路径,默认为/etc/ansible/hosts
** --list-hosts
outputs a list of matching hosts; does not execute anything else
** -m MODULE_NAME, --module-name=MODULE_NAME
module name to execute (default=command) #执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数
-M MODULE_PATH, --module-path=MODULE_PATH
specify path(s) to module library (default=/usr/share/ansible/) #要执行的模块的路径,默认为/usr/share/ansible/
-o, --one-line
condense output #压缩输出,摘要输出.尝试一切都在一行上输出。
-P POLL_INTERVAL, --poll=POLL_INTERVAL
set the poll interval if using -B (default=15) #调查背景工作每隔数秒。需要- b
--private-key=PRIVATE_KEY_FILE
use this file to authenticate the connection #私钥路径,使用这个文件来验证连接
** -S, --su
run operations with su #用 su 命令
** -R SU_USER, --su-user=SU_USER
run operations with su as this user (default=root) #指定SU的用户,默认是root用户
** -s, --sudo
run operations with sudo (nopasswd)
** -U SUDO_USER, --sudo-user=SUDO_USER
desired sudo user (default=root)(deprecated, use become) #sudo到哪个用户,默认为 root
** -T TIMEOUT, --timeout=TIMEOUT
override the SSH timeout in seconds (default=10) #指定SSH默认超时时间, 默认是10S
-t TREE, --tree=TREE
log output to this directory #将日志内容保存在该输出目录,结果保存在一个文件中在每台主机上。
** -u REMOTE_USER, --user=REMOTE_USER
connect as this user (default=root) #远程用户, 默认是root用户
--vault-password-file=VAULT_PASSWORD_FILE
vault password file
** -v, --verbose
verbose mode (-vvv for more, -vvvv to enable 详细信息connection debugging)
--version
show program's version number and exit #输出ansible的版本
ansible-doc指令是用来查看ansible所支持的模块的文件信息的,并且支持shell!
查看 ansible-doc 的使用说明:
###一般用法:(也是常用的用法)
ansible-doc -l 获取模块信息
ansible-doc -s MOD_NAME 获取指定模块的使用帮助
###ansible-doc
[root@CentOS7-master ~]# ansible-doc -h
Usage: ansible-doc [options][module...]
Options:
-h, --help show this help message and exit # 显示命令参数API文档
-l, --list List available modules #列出可用的模块
-M MODULE_PATH, --module-path=MODULE_PATH #指定模块的路径specify path(s) to module library (default=None)
-s, --snippet Show playbook snippet for specified module(s) #显示playbook制定模块的用法
--version show program's version number and exit # 显示ansible-doc的版本号查看模块
实例:
[root@CentOS7-master ~]# ansible-doc -l|grep mysql
mysql_db Add or remove MySQL databases from a remote host.
mysql_replication Manage MySQL replication
mysql_user Adds or removes a user from a MySQL database.
mysql_variables Manage MySQL global variables
[root@CentOS7-master ~]#
[root@CentOS7-master ~]# ansible-doc -l mysql_replication
a10_server Manage A10 Networks AX/SoftAX/Thunder/vThunder devic...
a10_service_group Manage A10 Networks devices' service groups
......
......
......
quantum_router_interface Attach/Detach a subnet's interface to a router
quantum_subnet Add/remove subnet from a network
(END)
1、主机连通性测试:
[root@192 ~]# vim /etc/ansible/hosts
[root@192 ~]# ansible all -m ping
192.168.1.15 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.1.16 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.1.58 | SUCCESS => {
"changed": false,
"ping": "pong"
}
若出现以下结果,则说明未配置主机列表,则需要在/etc/ansible/hosts 中添加主机列表:
[root@CentOS7-master ~]# ansible all -m ping
[WARNING]: provided hosts list is empty, only localhost is available
[WARNING]: No hosts matched, nothing to do
2、command:在远程主机执行命令;不支持|管道命令
命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行。它不会通过shell进行处理,比如$HOME和操作如”小于”<“,”>”, “|”, “;”,”&”‘ 工作(需要使用(shell)模块实现这些功能)。
action: command
chdir #在执行命令之前,先切换到该目录
creates #一个文件名,当这个文件存在,则该命令不执行,可以用来做判断
executable #切换shell来执行命令,需要使用命令的绝对路径
free_form #要执行的Linux指令,一般使用ansible的-a参数代替。
removes #一个文件名,这个文件不存在,则该命令不执行,与creates相反的判断
[root@192 ~]# ansible all -m command -a 'ifconfig'
192.168.1.16 | SUCCESS | rc=0 >>
ens33: flags=4163 mtu 1500
inet 192.168.1.16 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::1c70:26ce:d630:1c70 prefixlen 64 scopeid 0x20
inet6 fe80::7a5:d6dd:d259:98cc prefixlen 64 scopeid 0x20
inet6 fe80::a75f:22e9:ba54:957c prefixlen 64 scopeid 0x20
ether 00:0c:29:00:12:b6 txqueuelen 1000 (Ethernet)
RX packets 176801 bytes 260182761 (248.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 45214 bytes 2820390 (2.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1 (Local Loopback)
RX packets 72 bytes 6248 (6.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 72 bytes 6248 (6.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099 mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:27:e4:27 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
192.168.1.58 | SUCCESS | rc=0 >>
ens33: flags=4163 mtu 1500
inet 192.168.1.58 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::1c70:26ce:d630:1c70 prefixlen 64 scopeid 0x20
inet6 fe80::a75f:22e9:ba54:957c prefixlen 64 scopeid 0x20
ether 00:0c:29:f3:bf:73 txqueuelen 1000 (Ethernet)
RX packets 29563 bytes 42812015 (40.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 10409 bytes 678597 (662.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1 (Local Loopback)
RX packets 72 bytes 6248 (6.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 72 bytes 6248 (6.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099 mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:27:e4:27 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
192.168.1.15 | SUCCESS | rc=0 >>
ens33: flags=4163 mtu 1500
inet 192.168.1.15 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::1c70:26ce:d630:1c70 prefixlen 64 scopeid 0x20
ether 00:0c:29:94:2e:ad txqueuelen 1000 (Ethernet)
RX packets 79414 bytes 116338650 (110.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 23480 bytes 1482711 (1.4 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1 (Local Loopback)
RX packets 72 bytes 6248 (6.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 72 bytes 6248 (6.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099 mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:27:e4:27 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@192 ~]# ansible all -m command -a 'chdir=/tmp ls'
192.168.1.15 | SUCCESS | rc=0 >>
ansible_ThpveH
ssh-5Dkf5SfH483W
systemd-private-fcf7660f6b89485c8f53e9a1d6335e8e-colord.service-FnABAJ
systemd-private-fcf7660f6b89485c8f53e9a1d6335e8e-cups.service-R8E6Lk
systemd-private-fcf7660f6b89485c8f53e9a1d6335e8e-rtkit-daemon.service-eDXa14
systemd-private-fcf7660f6b89485c8f53e9a1d6335e8e-vmtoolsd.service-Ey2wRr
tracker-extract-files.0
yum_save_tx.2020-05-16.14-45.02hesw.yumtx
192.168.1.16 | SUCCESS | rc=0 >>
ansible_0BtWXz
ssh-0E7PYJySzJrT
systemd-private-2a894815fa9d44f5bb25661470b6c09a-colord.service-Zwmd5C
systemd-private-2a894815fa9d44f5bb25661470b6c09a-cups.service-SNyI2N
systemd-private-2a894815fa9d44f5bb25661470b6c09a-rtkit-daemon.service-IkFVVA
systemd-private-2a894815fa9d44f5bb25661470b6c09a-vmtoolsd.service-b3aoIs
tracker-extract-files.0
yum_save_tx.2020-05-16.14-47.A8PvSD.yumtx
192.168.1.58 | SUCCESS | rc=0 >>
ansible_rjGktI
pip-DzTkR1-unpack
ssh-xSOLKOVlzvDA
systemd-private-462818de87eb4b57acae84cb355a89e0-colord.service-1dU7Ho
systemd-private-462818de87eb4b57acae84cb355a89e0-cups.service-i6Vr0D
systemd-private-462818de87eb4b57acae84cb355a89e0-rtkit-daemon.service-fJyqk7
systemd-private-462818de87eb4b57acae84cb355a89e0-vmtoolsd.service-8STrTN
tracker-extract-files.0
3、shell模块
shell模块在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等 :
[root@192 ~]# ansible all -m shell -a 'cat /etc/passwd |grep "root"'
192.168.1.58 | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
192.168.1.15 | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
192.168.1.16 | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
4、copy:复制文件到远程主机,可以改权限等
用法:
(1) 复制文件
-a "src= dest= "
(2) 给定内容生成文件
-a "content= dest= "
相关选项如下:
backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no
content:用于替代“src”,可以直接设定指定文件的值
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
directory_mode:递归设定目录的权限,默认为系统默认权限
force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
others:所有的file模块里的选项都可以在这里使用
src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync
[root@192 ~]# ansible all -m copy -a 'content="hello\nworld" dest=/tmp/test.ansible mode=666'
192.168.1.16 | SUCCESS => {
"changed": true,
"checksum": "7db827c10afc1719863502cf95397731b23b8bae",
"dest": "/tmp/test.ansible",
"gid": 0,
"group": "root",
"md5sum": "9195d0beb2a889e1be05ed6bb1954837",
"mode": "0666",
"owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 11,
"src": "/root/.ansible/tmp/ansible-tmp-1589620966.54-208964354657486/source",
"state": "file",
"uid": 0
}
192.168.1.15 | SUCCESS => {
"changed": true,
"checksum": "7db827c10afc1719863502cf95397731b23b8bae",
"dest": "/tmp/test.ansible",
"gid": 0,
"group": "root",
"md5sum": "9195d0beb2a889e1be05ed6bb1954837",
"mode": "0666",
"owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 11,
"src": "/root/.ansible/tmp/ansible-tmp-1589620966.5-180390952309590/source",
"state": "file",
"uid": 0
}
192.168.1.58 | SUCCESS => {
"changed": true,
"checksum": "7db827c10afc1719863502cf95397731b23b8bae",
"dest": "/tmp/test.ansible",
"gid": 0,
"group": "root",
"md5sum": "9195d0beb2a889e1be05ed6bb1954837",
"mode": "0666",
"owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 11,
"src": "/root/.ansible/tmp/ansible-tmp-1589620966.55-103378698389009/source",
"state": "file",
"uid": 0
}
5、file 设置文件属性:
创建目录:-a "path= state=directory"
创建链接文件:-a "path= src= state=link"
删除文件:-a "path= state=absent"
force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:定义文件/目录的属组 mode:定义文件/目录的权限
owner:定义文件/目录的属主 path:必选项,定义文件/目录的路径
recurse:递归设置文件的属性,只对目录有效 src:被链接的源文件路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
[root@192 ~]# ansible all -m file -a 'path=/tmp/test state=directory' 192.168.1.16 | SUCCESS => {
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/tmp/test",
"secontext": "unconfined_u:object_r:user_tmp_t:s0",
"size": 6,
"state": "directory",
"uid": 0
}
192.168.1.58 | SUCCESS => {
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/tmp/test",
"secontext": "unconfined_u:object_r:user_tmp_t:s0",
"size": 6,
"state": "directory",
"uid": 0
}
192.168.1.15 | SUCCESS => {
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/tmp/test",
"secontext": "unconfined_u:object_r:user_tmp_t:s0",
"size": 6,
"state": "directory",
"uid": 0
}
[root@192 ~]# ansible all -m file -a 'path=/data/aa state=touch'
192.168.1.15 | SUCCESS => {
"changed": true,
"dest": "/data/aa",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"secontext": "unconfined_u:object_r:default_t:s0",
"size": 0,
"state": "file",
"uid": 0
}
192.168.1.16 | SUCCESS => {
"changed": true,
"dest": "/data/aa",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"secontext": "unconfined_u:object_r:default_t:s0",
"size": 0,
"state": "file",
"uid": 0
}
192.168.1.58 | SUCCESS => {
"changed": true,
"dest": "/data/aa",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"secontext": "unconfined_u:object_r:default_t:s0",
"size": 0,
"state": "file",
"uid": 0
}
[root@192 ~]# ansible all -m file -a 'path=/data/aa state=file'
192.168.1.15 | SUCCESS => {
"changed": false,
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"path": "/data/aa",
"secontext": "unconfined_u:object_r:default_t:s0",
"size": 0,
"state": "file",
"uid": 0
}
192.168.1.16 | SUCCESS => {
"changed": false,
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"path": "/data/aa",
"secontext": "unconfined_u:object_r:default_t:s0",
"size": 0,
"state": "file",
"uid": 0
}
192.168.1.58 | SUCCESS => {
"changed": false,
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"path": "/data/aa",
"secontext": "unconfined_u:object_r:default_t:s0",
"size": 0,
"state": "file",
"uid": 0
}
6、fetch从远程某主机获取文件到本地:
dest:用来存放文件的目录,例如存放目录为backup,源文件名称为/etc/profile在主机pythonserver中,那么保存为/backup/pythonserver/etc/profile;
Src:在远程拉取的文件,并且必须是一个file,不能是目录。
[root@192 ~]# ansible all -m fetch -a 'src=/var/log/messages dest=/root'
192.168.1.58 | SUCCESS => {
"changed": true,
"checksum": "fa3be01a67361d5334b0e2883ddf74dfb3f47078",
"dest": "/root/192.168.1.58/var/log/messages",
"md5sum": "cfa3033c94a15c1884e2c1146154480b",
"remote_checksum": "fa3be01a67361d5334b0e2883ddf74dfb3f47078",
"remote_md5sum": null
}
192.168.1.16 | SUCCESS => {
"changed": true,
"checksum": "7f8a407f98e363c35b382aefafd2c7c3a3bbc95d",
"dest": "/root/192.168.1.16/var/log/messages",
"md5sum": "e865d61eb844a52e901162103da2212e",
"remote_checksum": "7f8a407f98e363c35b382aefafd2c7c3a3bbc95d",
"remote_md5sum": null
}
192.168.1.15 | SUCCESS => {
"changed": true,
"checksum": "c5df85683f660be8e9e0d33acf1e7a1ba42c1be8",
"dest": "/root/192.168.1.15/var/log/messages",
"md5sum": "d11697018d7123e8fabb20335f9ab581",
"remote_checksum": "c5df85683f660be8e9e0d33acf1e7a1ba42c1be8",
"remote_md5sum": null
}
7、cron管理cron计划任务
ansible all -m cron -a “ ”: 设置管理节点生成定时任务
action: cron backup= #如果设置,创建一个crontab备份 [yes|no]
cron_file= #如果指定, 使用这个文件cron.d,而不是单个用户
crontab
day= #日应该运行的工作( 1-31, *, */2, )
hour= #小时 ( 0-23, *, */2, )
minute= #分钟( 0-59, *, */2, )
month= #月( 1-12, *, /2, )
weekday #周 ( 0-6 for Sunday-Saturday,, )
job= #指明运行的命令是什么
name= #定时任务描述
reboot #任务在重启时运行,不建议使用,建议使用special_time
special_time #特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)
state #指定状态,present表示添加定时任务,也是默认设置,absent表示删除定时任务
user #以哪个用户的身份执行
ansible webservers -m cron -a 'name="sync time from ntpserver" minute="*/10" job="/sbin/ntpdate asia.pool.ntp.org &>/dev/null" '
8、yum安装软件
conf_file #设定远程yum安装时所依赖的配置文件。如配置文件没有在默认的位置。
disable_gpg_check #是否禁止GPG checking,只用于‘present’ or `latest’。
disablerepo #临时禁止使用yum库。 只用于安装或更新时。
enablerepo #临时使用的yum库。只用于安装或更新时。
#下面带“**”的都是重点的
** name= #所安装的包的名称
** state=present|latest|absent #present安装,latest安装最新的,absent 卸载软件。
** update_cache #强制更新yum的缓存。
[root@192 ~]# ansible 192.168.1.15 -m yum -a 'name=httpd state=present'
192.168.1.15 | SUCCESS => {
"changed": false,
"msg": "",
"rc": 0,
"results": [
"httpd-2.4.6-93.el7.centos.x86_64 providing httpd is already installed"
]
}
9、service: 服务程序管理
arguments #命令行提供额外的参数
enabled=true|false #设置开机启动。
name= #服务名称
runlevel #开机启动的级别,一般不用指定。
sleep #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。
state= #started启动服务, stopped停止服务, restarted重启服务, reloaded重载配置
ansible 192.168.1.15 -m service -a 'name=httpd state=restarted enabled=true'
10、user模块管理
用户模块,管理用户帐号 action: user
comment #用户的描述信息
createhome #是否创建家目录
force #在使用state=absent是, 行为与userdel –force一致.
group #指定基本组
groups #指定附加组,如果指定为(groups=)表示删除所有组
home #指定用户家目录
move_home #如果设置为home=时, 试图将用户主目录移动到指定的目录
name #指定用户名
non_unique #该选项允许改变非唯一的用户ID值
password #指定用户密码
remove #在使用state=absent时, 行为是与userdel –remove一致
shell #指定默认shell
state #设置帐号状态,不指定为创建,指定值为absent表示删除
system #当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid #指定用户的uid
update_password #更新用户密码
#创建一个name为tom,uid为1006,shell为、bin/zshell,home为/home/tomhome的用户
[root@192 ~]# ansible 192.168.1.16 -m user -a 'name=tom comment="tom is tom" uid=1066 shell=/bin/zshell home=/home/tomhome'
192.168.1.16 | SUCCESS => {
"changed": true,
"comment": "tom is tom",
"createhome": true,
"group": 1066,
"home": "/home/tomhome",
"name": "tom",
"shell": "/bin/zshell",
"state": "present",
"system": false,
"uid": 1066
}
11、group
用户组模块,添加或删除组:action: group
gid # 设置组的GID号
name= # 管理组的名称
state # 指定组状态,默认为创建,设置值为absent为删除
system # 设置值为yes,表示为创建系统组
[root@192 ~]# ansible 192.168.1.16 -m group -a 'name=tom state=present'
192.168.1.16 | SUCCESS => {
"changed": false,
"gid": 1066,
"name": "tom",
"state": "present",
"system": false
}
12、script在指定节点运行服务端的脚本
[root@CentOS7-master ~]# vim test.sh
#/bin/bash
#创建/tmp/test.sh.log
touch /tmp/test.sh.log
#将date命令结果输出到/tmp/test.sh.log
echo “hello” >> /tmp/test.sh.log
所有主机执行/root/test.sh脚本
[root@192 ~]# ansible all -m script -a '/root/test.sh'
192.168.1.58 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.1.58 closed.\r\n",
"stdout": "",
"stdout_lines": []
}
192.168.1.16 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.1.16 closed.\r\n",
"stdout": "",
"stdout_lines": []
}
192.168.1.15 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.1.15 closed.\r\n",
"stdout": "",
"stdout_lines": []
}
13、setup模块
facts组件是ansible用于采集被管机器设备信息的一个功能,我们可以使用setup模块查机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。
facts就是变量,内建变量 。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件。
setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。
setup模块下经常使用的一个参数是filter参数,具体使用示例如下(由于输出结果较多,这里只列命令不写结果):
ansible 192.168.1.15 -m setup -a 'filter=ansible*mb' //查看主机内存信息
ansible 192.168.1.15 -m setup -a 'filter=ansible_ens3[2-3]' //查看地接口为eth0-2的网卡信息
ansible all -m setup --tree /tmp/facts //将所有主机的信息输入到/tmp/facts目录下,每台主机的信息输入到主机名文件中(/etc/ansible/hosts里的主机名)