ansible学习笔记


一、简介

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。

ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。

ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一

特点:

  1. 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
  2. 默认使用SSH协议对设备进行管理;
  3. 有大量常规运维操作模块,可实现日常绝大部分操作;
  4. 配置简单、功能强大、扩展性强;
  5. 支持API及自定义模块,可通过Python轻松扩展;
  6. 通过Playbooks来定制强大的配置、状态管理;
  7. 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
  8. 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。

二、安装

系统 Centos 7.9

#查看yum源中ansible版本
yum list all *ansible*
#安装
yum install ansible

主要配置文件路径

/etc/ansible/ansible.cfg
/etc/ansible/hosts

三、简单应用

ansible通过ssh实现配置管理、应用部署、任务执行等功能,因此,需要事先配置ansible端能基于密钥认证的方式联系各被管理节点。

认证:

#ssh-keygen
#ssh-copy-id -i /root/.ssh/id_rsa.pub  root@xx.xx.xx.xx

如何查看模块帮助
ansible-doc: Show Ansible module documentation
-l,--list List available modules
-s, --snippet Show playbook snippet for specified module(s)

例:ansible-doc -s yum(模块名)


基本命令基本用法
ansible [-f forks] [-m module_name] [-a args]

-f forks: 启动的并发线程数
-m module_name: 要使用的模块,不指定时默认为command
-a args: 模块特有的参数

例:

ansible 192.168.1.1 -m command -a 'date' #单机运行
ansible webservers -m command -a 'date' #服务器组都运行
ansible webservers -m command -a 'tail -2 /etc/passwd' 
ansible webservers -a 'tail -2 /etc/passwd' #使用默认模块,意义同上

常用模块

cron模块

ansible-doc -s cron

cron: state: present: 安装 absent: 移除

例:
在linux的crontab任务中,格式如下:
*/10 * * * * /bin/echo "hello world"

ansible中格式如下:

ansible webservers -m cron -a 'minute="*/10" job="/bin/echo hello world" name="test cron job"'

#每10分钟执行一次,同上面的crontab,只指定了minute,其他不写默认为* ,并赋给任务名name为"test cron job"
#未指定state参数,默认为present

同理,删除操作为:

ansible webservers -m cron -a 'minute="*/10" job="/bin/echo hello world" name="test cron job" state="absent" ' 

查看上述命令安装结果

ansible webservers -a 'crontab -l'

user模块

ansible-doc -s user

默认创建

ansible myweb -m user -a 'name="danny1"'

删除用户

ansible myweb -m user -a 'name="danny1" state=absent'

group模块

ansible myweb -m group -a 'name=mysql gid=306 system=yes'

创建mysql用户

ansible myweb -m user -a 'name=mysql uid=306 system=yes group=mysql'

copy模块

ansible myweb -m copy -a 'src=/etc/my.cnf  dest=/tmp/my.cnf.ansible  owner=root  mode=644'

使用content直接生成文件内容,取代src,两者不共存

ansible myweb -m copy -a 'content="hello danny" dest=/tmp/danny.ansible'

file模块

设定文件属性

ansible myweb -m file -a 'owner=mysql group=mysql mode=644 path=/tmp/my.cnf.ansible'

生成符号链接

myweb -m file -a 'path=/tmp/my.cnf.link src=/tmp/my.cnf.ansible  state=link'

ping模块

测试远程主机的连通性

ansible webservers -m ping

service模块

查看远程服务状态

ansible webservers  -a 'service mysqld status'

启动mysql服务并设置开机自启

ansible myweb -m service -a 'enabled=true name=mysqld state=started'

enabled:是否开机自启,取值为true或者false

shell模块

远程执行命令

通过下面命令操作,设置用户密码不会成功,会被直接当初字符串处理

ansible myweb -m command -a 'echo danny123 | passwd --stdin user1'

此时就应使用shell模块了,可以解析命令

ansible myweb -m shell -a 'echo danny123 | passwd --stdin user1'

所以在使用管道、变量等复杂命令时,建议使用shell模块,默认的command模块不解析

script模块

将本地脚本复制到远程主机,并运行

ansible webservers -m script -a '/tmp/test.sh'

yum模块

程序包的安装/卸载

name:指明要安装的程序包名,可以指定版本号,不指定安装最新版

安装

ansible myweb -m yum -a 'name=lrzsz'

卸载

ansible myweb -m yum -a 'name=lrzsz state=absent'

setup模块

收集远程主机的facts(操作系统版本、IP地址、主机名等)

每个被管理节点,在接收并运行管理命令之前,会将自己主机的相关信息,如:操作系统版本、IP地址等报告给远程的ansible主机

ansible myweb -m setup