Linux自动化运维:ansible
是
ansible安装
在线安装
1 | yum -y install epel-release |
离线安装
现在有网的centos服务器下载,然后打包,A是有网的,B的无网络的。
以下操作是A服务器
1 | yum -y install epel-release # 下载epel仓库 |
打包
1 | tar zcvf ansible.tar.gz ~/ansible |
上传到服务器B,以下是B的操作
1 | tar zxvf ansible.tar.gz && cd ansible |
验证安装
1 | ansible --version |

主机清单配置
查看已配置的分组
1 | grep -vE '^#|^$' /etc/ansible/hosts |
主机分组
在/etc/ansible/hosts 文件中配置文件
1 | [web] |
更多请查看官网:How to build your inventory — Ansible Community Documentation
连接参数配置
这部分内容很重要,详细可以查看Connecting to hosts: behavioral inventory parameters,使用密码登录,当然可以使用免密登录,详细可以查看之前的博客配置ssh免密Linux安全:SSH原理 | 道坤 (daokun.eu.org)
参数 | 参数类型 | 参数说明 |
---|---|---|
ansible_host | 主机地址 | 远程主机ip |
ansible_port | 主机端口 | 设置SSH连接端口,默认22 |
ansible_user | 主机用户 | 默认SSH远程连接的用户身份 |
ansible_password | 用户密码 | 指定SSH远程主机密码 |
1 | [web] |
故障解决
连接故障
如果你是第一次连接远程主机,会出现如上报错,这是新机器的指纹确认问题。具体原因在我之前的博客SSH原理。解决办法有两个:
手动ssh连接远程主机,进行指纹确认即可
ansible配置文件中忽略指纹确认
1
2grep 'host_key_checking' /etc/ansible/ansible.cfg
host_key_checking = False
当我手动添加之后,可以看到kown_hosts文件含有192.168.0.101信息,这时候,使用ansible就正常了。
ansible缓存问题
ansible在对远程主机操作之前,默认会先通过setup模块获取机器的facts(静态属性),并且会生成缓存,便于加速远程主机的操作;但缓存也会导致一些奇怪的现象,比如客户端的机器信息更新了,服务端依旧使用的是旧数据,那就不准确了,因此可以删除缓存。详细可见缓存问题
1 | #清理ansible的缓存目录即可 |
连续的主机名
1 | [web] |
公共变量
局部变量
1 | [web:vars] |
全局变量
1 | [all:vars] |
局部变量的优先大于全局
ansible的执行模式
Ansible实现批量管理主机的模式主要有俩:
- 利用ansible命令实现批量管理(ad-hoc)模式
- 利用ansible剧本实现批量管理(playbook)模式
Ad-hoc和playbook的关系就好比shell命令与shell scripts的关系
Ansible的ad-hoc模式也就是ansible的命令行模式,该模式通常用来临时处理一些任务。例如
- 临时批量查看所有被管控机器的内存、负载、磁盘
- 临时批量分发某个特定文件
Ansible的playbook模式就是针对特定的具体较大的任务,事先写好执行剧本,然后在其他机器上批量执行相同的任务,属于定制化的批量执行任务,例如
- 一键安装Rsync
- 一键搭建LNMP集群等
ad-hoc模式
ansible ad-hoc命令用法
1 | ansible 主机(主机组) -m module(模块名) -a "action(执行的动作)" |
ad-hoc帮助用法
1 | ansible-doc -l |grep ^ping # 列出ping开头的模块 |
ansible核心内容(模块)
ansible正确玩法:ansible社区
各个颜色意义
绿色 | 黄色 | 紫色 | 红色 | 蓝色 |
---|---|---|---|---|
命令以用户期望的执行了,但是状态没有发生改变。 | 命令以用户期望的执行了,并且状态发生了改变。 | 警告信息,说明ansible提示你有更合适的用法。 | 命令错误,执行失败。 | 详细的执行过程。 |
以下模块默认使主机组web
ping测试连通性
1 | ansible web -m ping |

command 简单命令
command模块是ansible命令基本模块
使用command模块执行远程命令,命令不得用变量($HOME)
不得出现特殊符号
1
< 、>、|、;、& ,
否则无法识别,需要则使用shell模块实现。也就是无法使用复杂的linux命令
选项参数 选项说明 chdir 在执行命令前进入到指定目录 creates 定义一个文件是否存在,如果不存在则运行相应命令,存在则跳过执行 removes 定义一个文件是否存在,如果存在则运行相应命令,如果不存在则跳过执行
1 | ansible web -m command -a "free -m" # 远程查看主机内存 |


这个command模块不支持复杂的命令
shell模块(万能模块)
shell模块功能:在远程节点上执行命令(复杂的命令)
1 |
|

copy拷贝文件
copy模块是远程推送数据模块,只能把数据推送给远程主机节点,无法拉取数据到本地。

简单发送文件
1 | ansible web -m copy -a 'src=~/fast_github.sh dest=/opt/' |
1 | [root@master ~]# ls |
发送文件且指定文件属性
权限改为600、修改为www用户(要求目标机器存在该用户)
1 | # 创建www用户 |
发送文件且先做好备份
使用backup参数,防止覆盖远程文件,丢失备份,提前备份该目标机器的数据
1 | ansible web -m copy -a "src=/opt/fast_github.sh dest=/tmp/ owner=www group=www mode=600 backup=yes" |
指定数据写入到远程文件中
1 | ansible web -m copy -a "content='hello world' dest=/tmp/test.txt mode=600" |
像这样的覆盖操作,还是添加备份参数更合适
1 ansible web -m copy -a "content='hello world' dest=/tmp/test.txt mode=600 backup=yes"
复制文件夹,注意结尾斜杠
远程拷贝~/Python-3.7.5/下的所有内容
1 | #远程拷贝~/Python-3.7.5/下的所有内容 |
file文件操作模块
参数 | 描述 |
---|---|
path | 必须指定操作的文件或目录。在之前版本中使用dest或name也可。 |
state | 根据操作需求设置,例如directory、touch、link、hard、absent。 假设,我想要在远程主机上创建/testdir/a/b目录,那么我则需要设置path=/testdir/a/b,但是,我们和ansible无法从一个字符串就知道你要创建文件还是目录,所以,我们需要通过state参数进行说明,当我们想要创建的/testdir/a/b是一个目录时,需要将state的值设置为directory 当我们想要删除一个文件时(删除时不用区分目标是文件、目录、还是链接),则需要将state的值设置为absent |
src | 当state为link或hard时指定软硬链接的源文件。 |
force | 当state为link时,可以强制创建链接,即使源文件不存在或同名文件已存在。 |
owner | 设置被操作文件的属主用户。属主用户必须在远程主机中存在。 |
group | 设置被操作文件的属组。属组必须在远程主机中存在。 |
mode | 设置被操作文件的权限,如rw-r-x–,使用mode=650进行设置或特殊权限如suid(4700)。 |
recurse | 当操作目标为目录时设置为yes,递归修改目录中文件属性。 |
使用
复制文件
将家目录下的1.txt和2.txt复制到远程主机的家目录下
playbook
1 | --- |
运行
1 | ansible-playbook copy_files.yml |
参考资料: