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.20
192.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 # 指定默认shell
state # 设置帐号状态,不指定为创建,指定值为absent表示删除
system # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid # 指定用户的uid
update_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 zhangsan
zhangsan:x:111:111:hello zhangsan:/home/zhangsan:/bin/bash
[root@server3 ~]# cat /etc/passwd | grep zhangsan
zhangsan: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_form
chdir # 指定一个目录,在执行对应的命令之前,会先进入到 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.txt
hello world
[root@server3 ~]# cat 1.txt
hello world
shell虽说是万能的模块但是某些复杂的操作也会使shell模块失效,这个时候就需要将操作写入到脚本中,使用scripts模块
script
参数说明
free_form # 指定需要远程执行的命令,但是并没有具体的一个参数名叫free_form
chdir # 指定一个目录,在执行对应的命令之前,会先进入到 chdir 参数指定的目录中。
creates # 使用此参数指定远程主机一个文件,当指定的文件存在时,就不执行对应命令
removes # 使用此参数指定远程主机一个文件,当指定的文件不存在时,就不执行对应命令
192.168.31.30的root目录下有1.txt,192.168.31.20的root目录下没有1.txt
[root@server1 ~]# vim test.sh
#!/bin/bash
echo "hello linux" > 1.txt
[root@server2 ~]# cat 1.txt
hello world
[root@server2 ~]# rm -f 1.txt
[root@server3 ~]# cat 1.txt
hello world
[root@server1 ~]# ansible -m script -a "test.sh chdir=/root creates=1.txt" linuxservers
[root@server2 ~]# cat 1.txt
hello linux
[root@server3 ~]# cat 1.txt
hello world
copy
参数说明
backup # 在覆盖之前,将源文件备份,备份文件包含时间信息。
content # 用于替代“src”,可以直接设定指定文件的值
dest # 必选项,要将源文件复制到的远程主机的绝对路径
src # 被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制
directory_mode # 递归设定目录的权限,默认为系统默认权限
force # 强制覆盖目的文件内容,默认为yes
others # 所有的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 test1
hello world
file
参数说明
name #
force # 需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group # 定义文件/目录的属组
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或者no
name # 服务名称
runlevel # 开机启动的级别,一般不用指定
sleep # 在重启服务的过程中,是否等待,如在服务关闭以后等待2秒再启动
state # started启动服务,stopped停止服务,restarted重启服务,reloaded重载配置
- 启动httpd服务
ansible -m service -a "name=httpd state=started" linuxservers
selinux
功能:管理远端主机的 SELINUX
防火墙
参数说明
state # SELinux模式:enforcing、permissive、disabled
policy # 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