Ansible介绍
Ansible是自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能,本身没有批量部署能力,真正具有批量部署的是Ansible所运行的模块,Ansible只是提供一种框架
Ansible不需要在远程主机上安装Client/Agents,因为它们是基于SSH来和远程主机通讯的,Ansible目前已经已经被红帽官方收购
Ansible架构

- Ansible:核心程序
- Core Modules:Ansible自带的模块
- Custom Modules:核心模块功能不足时,用户可以添加扩展模块
- Plugins:完成模块功能的补充,通过插件来实现记录日志,发送邮件或其他功能
- Playbooks:剧本,YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能
- Connectior Plugins:负责和被监控端实现通信,默认是使用SSH
- Host Inventory:记录由Ansible管理的主机信息,包括端口、密码、IP等
Ansible特点
- 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作
- 默认使用SSH协议对设备进行管理
- 有大量常规运维操作模块,可实现日常绝大部分操作
- 配置简单、功能强大、扩展性强
- 支持API及自定义模块,可通过Python轻松扩展
- 通过Playbooks来定制强大的配置、状态管理
- 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可
- 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台
- 具有幂等性,一种操作重复多次执行结果相同
Ansible命令执行过程
- 加载自己的配置文件,默认
/etc/ansible/ansible.cfg - 查找对应的主机配置文件,找到要执行的主机或者组
- 加载自己对应的模块文件,如command
- 通过Ansible将模块或命令生成对应的临时Python文件(Python脚本),并将该文件传输至远程服务器
- 对应执行远程服务器用户的家目录的
.ansible/tmp/XXX/XXX.PY文件 - 远程服务器给文件 +x 执行权限
- 远程服务器执行并返回结果
- 远程服务器删除临时Python文件,
sleep 0退出
安装部署Ansible
- 安装Ansible
[root@server1 ~]# yum install epel-release.noarch -y[root@server1 ~]# yum install -y ansible
- 配置免密登录
[root@server1 ~]# ssh-keygen# 一直按回车[root@server1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.31.20# 输入登录root@192.168.31.20的密码[root@server1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.31.30# 输入登录root@192.168.31.20的密码# 尝试是否可以免密登录[root@server1 ~]# ssh root@192.168.31.20[root@server1 ~]# ssh root@192.168.31.30
- 配置主机清单文件
/etc/ansible/hosts,将192.168.31.20和192.168.31.30加入到主机清单中
[root@server1 ~]# vim /etc/ansible/hosts# 在最后一行添加如下内容[linuxservers]192.168.31.20192.168.31.30
Ansible常用命令
ansible:临时命令执行工具,常用于执行临时命令# 参数说明-a MODULE_ARGS:指定模块的参数-m MODULE_NAME:指定模块-C:坚持执行结果-e EXTRA_VARS:指明变量名-f FORKS:指定并发进程数-i INVENTORY:指定主机清单文件--syntax-check:检查执行命令是否存在语法错误
ansible-doc:常用于模块功能的查询ansible-playbook:用于执行剧本
常见配置文件
/etc/ansible/ansible.cfg:主配置文件/etc/ansible/hosts:主机清单文件/etc/ansible/roles:角色目录
[defaults]# some basic default values...#inventory = /etc/ansible/hosts # 定义主机清单文件#library = /usr/share/my_modules/ # 库文件的存放位置#module_utils = /usr/share/my_module_utils/#remote_tmp = ~/.ansible/tmp #生成的临时py文件在远程主机的目录#local_tmp = ~/.ansible/tmp #生成的临时py文件在本地主机的目录#plugin_filters_cfg = /etc/ansible/plugin_filters.yml#forks = 5 # 默认的并发数#poll_interval = 15 # 默认的线程池#sudo_user = root # 默认的sudo用户#ask_sudo_pass = True#ask_pass = True#transport = smart#remote_port = 22#module_lang = C#module_set_locale = False
常用模块
ansible-doc -s 模块名 # 查看模块帮助ansible-doc -l # 查询ansible所有的模块
官方文档:Ansible Documentation — Ansible Documentation
Ansible的执行状态
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
粉色:警告信息
蓝色:显示ansible命令执行的过程
ping
[root@server1 ~]# ansible -m ping linuxservers

group
参数名称
gid # 设置组的GID号name # 管理组的名称state # 指定组状态,默认为创建,设置值为absent为删除system # 设置值为yes,表示为创建系统组
- 添加系统组,指定gid与名称
[root@server1 ~]# ansible -m group -a "name=zhangsan gid=111 system=yes" linuxservers

- 删除组
[root@server1 ~]# ansible -m group -a "name=zhangsan gid=111 state=absent" linuxservers

user
参数名称
comment # 用户的描述信息createhom # 是否创建家目录force # 在使用'state=absent'时,行为与`userdel --force'一致.group # 指定基本组groups # 指定附加组,如果指定为('groups=')表示删除所有组home # 指定用户家目录name # 指定用户名password # 指定用户密码remove # 在使用 `state=absent'时, 行为是与 `userdel --remove'一致.shell # 指定默认shellstate # 设置帐号状态,不指定为创建,指定值为absent表示删除system # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户uid # 指定用户的uidupdate_password # 更新用户密码expires # 指明密码的过期时间
- 添加系统用户,指定uid、家目录、主组及注释
[root@server1 ~]# ansible -m user -a "system=yes name=zhangsan home=/home/zhangsan uid=111 group=zhangsan comment='hello zhangsan'" linuxservers
如果不先新建指定的主组,那么就会报错,报错如下所示,为红色:

如果新建过了指定的主组,就会成功添加

[root@server2 ~]# cat /etc/passwd | grep zhangsanzhangsan:x:111:111:hello zhangsan:/home/zhangsan:/bin/bash[root@server3 ~]# cat /etc/passwd | grep zhangsanzhangsan:x:111:111:hello zhangsan:/home/zhangsan:/bin/bash
- 删除用户及家目录
[root@server1 ~]# ansible -m user -a "name=zhangsan state=absent remove=yes" linuxservers
command
不需要-m指定模块,以及默认指定为command
不支持管道符,变量以及重定向等操作
[root@server1 ~]# ansible -a "echo 'hello world'" linuxservers

shell
参数说明
free_form # 指定需要远程执行的命令,但是并没有具体的一个参数名叫free_formchdir # 指定一个目录,在执行对应的命令之前,会先进入到 chdir 参数指定的目录中。creates # 使用此参数指定远程主机一个文件,当指定的文件存在时,就不执行对应命令removes # 使用此参数指定远程主机一个文件,当指定的文件不存在时,就不执行对应命令executable # 指定某种类型的 shell 去执行对应的命令,默认为/bin/sh
- 与 command 模块不同的是,shell 模块在远程主机中执行命令时,会经过远程主机上的
/bin/sh程序处理,支持重定向等操作
[root@server1 ~]# ansible -m shell -a "echo 'hello world' > 1.txt" linuxservers[root@server2 ~]# cat 1.txthello world[root@server3 ~]# cat 1.txthello world
shell虽说是万能的模块但是某些复杂的操作也会使shell模块失效,这个时候就需要将操作写入到脚本中,使用scripts模块
script
参数说明
free_form # 指定需要远程执行的命令,但是并没有具体的一个参数名叫free_formchdir # 指定一个目录,在执行对应的命令之前,会先进入到 chdir 参数指定的目录中。creates # 使用此参数指定远程主机一个文件,当指定的文件存在时,就不执行对应命令removes # 使用此参数指定远程主机一个文件,当指定的文件不存在时,就不执行对应命令
192.168.31.30的root目录下有1.txt,192.168.31.20的root目录下没有1.txt
[root@server1 ~]# vim test.sh#!/bin/bashecho "hello linux" > 1.txt[root@server2 ~]# cat 1.txthello world[root@server2 ~]# rm -f 1.txt[root@server3 ~]# cat 1.txthello world[root@server1 ~]# ansible -m script -a "test.sh chdir=/root creates=1.txt" linuxservers

[root@server2 ~]# cat 1.txthello linux[root@server3 ~]# cat 1.txthello world
copy
参数说明
backup # 在覆盖之前,将源文件备份,备份文件包含时间信息。content # 用于替代“src”,可以直接设定指定文件的值dest # 必选项,要将源文件复制到的远程主机的绝对路径src # 被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制directory_mode # 递归设定目录的权限,默认为系统默认权限force # 强制覆盖目的文件内容,默认为yesothers # 所有的file模块里的选项都可以在这里使用
基本语句
ansible -m copy -a "src=/本地文件 dest=/远程文件" linuxservers
- 在创建文件时修改文件的属主和属组信息
[root@server1 ~]# ansible -m copy -a "src=/root/test.sh dest=/root/test1 owner=user01 group=usergroup" linuxservers[root@server2 ~]# ll | grep test1-rw-r--r-- 1 user01 usergroup 39 3月 3 23:31 test1[root@server3 ~]# ll | grep test1-rw-r--r-- 1 user01 usergroup 39 3月 3 23:31 test1
- 在传输文件时修改文件的权限信息,并且备份远程主机文件
[root@server2 ~]# ll | grep test1-rw-r--r-- 1 root root 0 3月 3 23:38 test1[root@server1 ~]# ansible -m copy -a "src=/root/test.sh dest=/root/test1.sh backup=yes mode=1777" 192.168.31.20[root@server2 ~]# ll | grep test1-rwxrwxrwt 1 root root 39 3月 3 23:38 test1-rw-r--r-- 1 root root 0 3月 3 23:38 test1.9221.2022-03-03@23:38:20~

- 创建一个文件并直接编辑文件
[root@server1 ~]# ansible -m copy -a "content='hello world' dest=/root/test1 backup=yes" 192.168.31.30[root@server3 ~]# cat test1hello world
file
参数说明
name #force # 需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|nogroup # 定义文件/目录的属组mode # 定义文件/目录的权限owner # 定义文件/目录的属主path # 必选项,定义文件/目录的路径recurse # 递归设置文件的属性,只对目录有效src # 被链接的源文件路径,只应用于state=link的情况dest # 被链接到的路径,只应用于state=link的情况state= # 后面可加下面的参数absent # 删除文件directory # 如果目录不存在,就创建目录file # 验证文件是否存在,即使文件不存在,也不会被创建link # 创建软链接hard # 创建硬链接touch # 如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其后修改时间
- 创建目录:名称为test,属主属组都为root,权限为644
ansible -m file -a "path=/tmp/dir1 owner=root group=root mode=644 state=directory" linuxservers
- 创建文件
ansible -m file -a "path=/tmp/file1 owner=root group=root mode=644 state=file" linuxservers
- 删除文件
ansible -m file -a "path=/tmp/file1 state=absent" linuxservers
- 创建软链接文件
ansible -m file -a "src=/root/test1 dest=/root/test2 state=link" linuxservers
- 创建硬链接文件
ansible -m file -a "src=/root/test1 dest=/root/test3 state=hard" linuxservers
yum
参数说明
conf_file # 设定远程yum安装时所依赖的配置文件,如果配置文件没有在默认的位置disable_gpg_check # 是否禁止GPG checking,只用于'present' or 'latest'disablerepo # 临时禁止使用yum库。 只用于安装或更新时enablerepo # 临时使用的yum库。只用于安装或更新时name # 所安装的包的名称state # present安装,latest安装最新版本,absent卸载软件update_cache # 强制更新yum的缓存
- 安装httpd
ansible -m yum -a "name=httpd state=latest" linuxservers
安装过程中查看server2的进程

- 卸载httpd
ansible -m yum -a "name=httpd state=absent" linuxservers
service
参数说明
arguments # 命令行提供额外的参数enabled # 设置开机启动,可以设置为yes或者noname # 服务名称runlevel # 开机启动的级别,一般不用指定sleep # 在重启服务的过程中,是否等待,如在服务关闭以后等待2秒再启动state # started启动服务,stopped停止服务,restarted重启服务,reloaded重载配置
- 启动httpd服务
ansible -m service -a "name=httpd state=started" linuxservers
selinux
功能:管理远端主机的 SELINUX 防火墙
参数说明
state # SELinux模式:enforcing、permissive、disabledpolicy # SELinux使用的策略名,比如:targeted
- 设置SELinux为enforcing
ansible -m selinux -a "state=enforcing policy=targeted" linuxservers
- 设置SELinux为disabled
ansible -m selinux -a "state=disabled policy=targeted" linuxservers
setup
获取远程主机的详细信息
ansible -m setup linuxservers
