简介
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、 fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批 量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
- 概述
- 基于python语言开发的自动化软件
- 基于SSH远程管理鼓舞实现远程主机批量管理
- 意义
- 提高工作效率
- 提高工作准确度
- 减少维护的成本
- 减少重复性工作
- 功能
- 可以实现批量系统操作配置
- 可以实现批量软件服务部署
- 可以实现批量文件数据分发
- 可以实现批量系统信息收集
- 特点
- ansible:核心程序
- Modules:包括ansible自带的核心模块以及自定义模块
- Plugins:完成模块功能的补充,包括连接插件、邮箱插件
- Playbooks:剧本;定义Ansible多任务配置文件,由Ansible自动执行
- Inventory:定义Ansible管理主机的清单
Connection Plugins:负责和被监控端实现通信
特点
不需要在被管控主机上安装任何客户端
- 无服务器端,使用时直接运行命令即可
- 基于模块工作,可使用任意语言开发模块
- 使用yaml语言定制剧本playbook
- 基于SSH工作
- 可实现多级指挥
- 幂等性:一种操作重复多次结果相同
安装和配置
[root@node1 ~]# rpm ‐ql ansible | grep bin/usr/bin/ansible/usr/bin/ansible‐config/usr/bin/ansible‐connection/usr/bin/ansible‐console/usr/bin/ansible‐doc/usr/bin/ansible‐galaxy/usr/bin/ansible‐inventory/usr/bin/ansible‐playbook/usr/bin/ansible‐pull/usr/bin/ansible‐vault[root@node1 ~]# rpm ‐ql ansible | grep etc/etc/ansible/etc/ansible/ansible.cfg/etc/ansible/hosts/etc/ansible/roles
- ansible:临时命令执行工具,常用于临时命令的执行
- ansible-doc:Ansible模块功能查看工具
- ansible-playbook:Ansible定制自动化的任务集编排工具
- ansible.cfg:主配置文件
- hosts:主机清单
- 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 本机的临时命令执行目录#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主机清单的定义方式:1.直接指明主机地址或主机名2.定义一个主机组,调用的时候指定该组即可一般情况下我们的主配置文件保持默认即可。
基于ssh免密登录
- 登录方
- 生成一对公钥私钥文件
- 将公钥文件发送给被登录方(私钥加密,公钥解密)
- ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.80.20 # 方式一
- 将公钥文件内容写到被登录方的/root/.ssh/authorized_keys文件中。
-
ansible参数说明
-a MODULE_ARGS:指定模块的参数
- -m MODULE_NAME:指定模块
- -C:坚持执行结果
- -e EXTRA_VARS:指明变量名
- -f FORKS:指定并发进程数
- -i INVENTORY:指定主机清单文件
- —syntax-check:检查执行命令是否存在语法错误
ansible执行过程
- 加载自己的配置文件,默认为/etc/ansible/ansible.cfg
- 加载自己对应的模块文件
- 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器
- 对应执行用户的家目录的.ansible/tmp/xx.py文件
- 给文件+x执行
- 执行并将返回结果,删除临时py文件,sleep 0 退出
常用模块
- ansible的执行状态
- 绿色:执行成功并且不需要做改变的操作
- 黄色:执行成功并且对目标主机做变更
- 红色:执行失败
- 粉色:警告信息
- 蓝色:显示ansible命令执行的过程
- ping 模块:主机连通性测试
user 模块
[root@node1 ~]# ansible‐doc ‐s 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 #指明密码的过期时间 1.添加系统用户,指定uid、家目录、主组及注释 ansible -m user -a "system name=zhangsan home=/home/zhangsan uid=111 group=zhangsan comment='hello zhangsan'" nodes 2.删除用户及家目录 ansible -m user -a "name=zhangsan state=absent remove=yes"group
[root@node1 ~]# ansible‐doc ‐s group
‐ name: 添加或删除组
action: group
gid # 设置组的GID号
name= # 管理组的名称
state # 指定组状态,默认为创建,设置值为absent为删除
system # 设置值为yes,表示为创建系统组
ansible -m group -a "name=eagles gid=111 system=yes" nodes
ansible -m group -a "name=eagles gid=111 state=absent" nodes
- command
1.默认使用的模块
2.不支持管道,变量及重定向等
[root@node1 ~]# ansible‐doc ‐s command ‐ name: Executes a command on a remote node
- shell
1.调用bash执行命令
2.但是某些复杂的操作即使使用shell也可能会失败
解决方法:将操作写到脚本中,通过script模块
- script
free_form参数 :必须参数,指定需要执行的脚本,脚本位于 ansible 管理主机本地,并没有具体的一个参数名叫 free_form,具体解释请参考 command 模块。
chdir参数 : 此参数的作用就是指定一个远程主机中的目录,在执行对应的脚本之前,会先进入到 chdir 参数指定的目录中。
creates参数 :使用此参数指定一个远程主机中的文件,当指定的文件存在时,就不执行对应脚本,可参考 command 模块中的解释。
removes参数 :使用此参数指定一个远程主机中的文件,当指定的文件不存在时,就不执行对应脚本,可参考 command 模块中的解释。
- copy
[root@node1 ~]# ansible‐doc ‐s copy
‐ name: Copies files to remote locations
copy:
backup:在覆盖之前,将源文件备份,备份文件包含时间信息。
content:用于替代“src”,可以直接设定指定文件的值
dest:必选项。要将源文件复制到的远程主机的绝对路径
directory_mode:递归设定目录的权限,默认为系统默认权限
force:强制覆盖目的文件内容,默认为yes
others:所有的file模块里的选项都可以在这里使用
src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归 复制
ansible -m copy -a "src=/本地文件 dest=/远程文件" nodes


- file
[root@node1 ~]# ansible‐doc ‐s file
‐ name: Sets attributes of files
file:
force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软 链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归设置文件的属性,只对目录有效
src:被链接的源文件路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其后修改时间
ansible -m file -a "path=/需要创建的文件 owner=root group=root mode=777" nodes

- cron
- yum
[root@node1 ~]# ansible‐doc ‐s yum
‐ name: Manages packages with the yum package manager
yum:
conf_file #设定远程yum安装时所依赖的配置文件。如配置文件没有在默认的位置。
disable_gpg_check #是否禁止GPG checking,只用于`present' or `latest'。
disablerepo #临时禁止使用yum库。 只用于安装或更新时。
enablerepo #临时使用的yum库。只用于安装或更新时。
name= #所安装的包的名称
state #present安装, latest安装新的, absent 卸载软件。
update_cache #强制更新yum的缓存
ansible -m yum -a "name=httpd state=latest" nodes
- service
[root@node1 ~]# ansible‐doc service
> SERVICE (/usr/lib/python2.7/site‐packages/ansible/modules/system/service.py)
Controls services on remote hosts. Supported init systems include BSD init, OpenRC, SysV, Solaris
SMF, systemd, upstart. For Windows targets, use the [win_service] module instead.
* note: This module has a corresponding action plugin.
arguments #命令行提供额外的参数
enabled #设置开机启动。
name= #服务名称
runlevel #开机启动的级别,一般不用指定。
sleep #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。
state #started启动服务, stopped停止服务, restarted重启服务, reloaded重载配置
ansible -m service -a "name=httpd state=started" nodes
- selinux
[root@node1 ~]# ansible‐doc ‐s selinux
‐ name: Change policy and state of SELinux
selinux:
conf: # path to the SELinux configuration file, if non‐standard
policy: # name of the SELinux policy to use
state: # (required) The SELinux mode
- setup
ansible -m setup nodes #获取远程主机的详细信息
ansible-doc -l # 可以查询ansible具有的所有模块
https://docs.ansible.com/ansible/latest/index.html # 官方文档

