ansible 是一个自动化运维工具,基于Python开发,集合了许多运维工具的特点,实现了批量系统配置,批量程序部署,批量运行命令等批量管理操作。
ansible是通过模块进行批量管理的,本身没有批量部署的能力,ansible只是提供 一种架构。
ansible本身不是一个应用程序,只是一个工具,不需要启动什么服务,配置文件修改之后也不需要进行重启进程之类的操作。
yum安装
先安装EPEL源
yum install epel-release -y
安装成功后在安装ansible
yum install ansible -y
配置文件
/etc/ansible/hosts
改文件是配置主机的文件
可以配置单个主机,也可以配置主机集群
格式:
配置单个主机
192.168.136.130
配置主机集群
[webservers] 集群名
192.168.136.130 主机1
192.168.136.136 主机2
/etc/absible/ansible.cfg
ansible的主配置文件
# some basic default values...
[defaults]
#inventory = /etc/ansible/hosts 主机列表配置文件
#library = /usr/share/my_modules/ 库文件存放目录
#remote_tmp = ~/.ansible/tmp 临时py命令文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp 本机临时命令执行目录
#forks = 5 默认并发数,同时可以执行五次
#sudo_user = root 默认sudo用户
#ask_sudo_pass = True 每次执行是否询问ssh密码
#ask_pass = True 每次执行是否询问ssh口令
#remote_port = 22 远程主机的端口号(默认22)
程序/常用ansible命令
ansible
常用选项
选项 | 说明 |
---|---|
--version | 显示版本 |
-m | 指定模块 |
-v | 详细过程,-v、-vv、-vvv更详细 |
--list-hosts | 显示主机列表,可简写--list |
-C | 检查并不执行 |
-T | 执行命令的时间,默认10s |
-u | 执行远程命令的用户,该用户是远程主机上的用户 |
-b | 代替旧版本的sudo切换,使用root权限 |
-K | 提示输入sudo时的口令 |
-a | 加参数、操作 |
ansible-doc
查看模块使用方法的命令
ansible-galaxy
下载模块的命令
ansible-pull
ansible-vault
管理加密解密yml文件的命令
常用选项:
选项 | 说明 |
---|---|
encrypt | 加密 |
decrypt | 解密 |
view | 查看加密后的文件,不能用cat查看,cat查看的为加密后的密文文件 |
edit | 编辑加密文件,加密后的文件不能用vi编辑 |
rekey | 修改新口令 |
create | 创建新文件 |
ansible-console
简单的yml文件:
#hello world yml file 文件介绍,这是一个yml文件
--- yml文件开头格式
- hosts: all 指定主机群组
remote_user: root 指定远程执行用户的身份
tasks: 执行的任务
- name: hello world 任务名
command: /usr/bin/wall hello world!!! 调用command模块发广播
执行远程主机上的脚本文件的模块
常见参数
参数 | 说明 |
---|---|
chdir | 在执行后面的命令前先切换到指定的目录底下 |
creates | 指定一个远程主机的参数,如果存在就不执行,不存在就执行,仅仅是执行后面的操作,对远程主机和本机上的文件不进行修改 |
removes | 指定一个远程主机的参数,如果不存在就不执行,存在就执行,仅仅是执行后面的操作,对远程主机和本机上的文件不进行修改 |
将本地文件copy至远程主机的模块
常见参数
参数 | 说明 |
---|---|
src | 源地址,本机文件路径 |
dest | 目标地址,远程主机的路径 |
content | 当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src和content必须有一个 |
force | 当远程主机的目标路径中已经存在同名文件,并且与ansible中的文件内容不同,是否强制覆盖,可选直有yes和no,默认为yes直接覆盖,no不进行操作 |
backup | 已有同名文件判断文件内容一样不,一样就不操作,不一样就备份,然后进行copy |
owner | 指定文件copy到远程主机后的属主,但是远程主机上必须有相应的用户 |
group | 指定文件copy到远程主机后的属组,但是远程主机上必须有相应的属组 |
mode | copy后文件的权限 |
从远程主机提取文件至ansible主机,与copy相反,不支持目录
ansible all -m fetch -a ‘src=/root/test dest=/data/test’
参数:
src:源地址
dest:目标地址
flat:默认值为no,如果dest以/结尾则覆盖本地同名源文件
专门用来设置文件属性
参数:
force:在两种情况下创建软连接时使用
源文件不存在但是之后会建立
目标软连接已存在,需要取消之前的软连接,然后再创建,两个选项yes|no
group:属组
mode:权限
owner:属主
path:必须项,定义文件目录的路径
recurse:递归设置文件属性,只对目录有效
src:要被软连接的源文件的路径,只能用于state=link
dest:被连接到的路径,只能用于state=link
state:选择属性
directory:如果目录不存在,创建目录
file:即使文件不存在,也不会被创建
link:创建软连接
hard:创建硬链接
touch:如果文件不存在,创建新文件,存在的话修改最后访问时间
absent:删除目录文件,或者取消链接文件
用于添加、删除、更新计划任务的模块
使用此模块时,-a后面接""里面的用’’
参数:
name:计划任务的名称,可有可无,不指定就为None
cron_file:使用文件替换远程主机上的cron.d目录下的用户的计划任务
minute:分
hour:时
day:日
month:月
weekday:周
job:要执行的计划任务
special_time:制定什么时候执行
参数:reboot,yearly,annually,monthly,weekly,daily,hourly
state:确认该任务计划是创建还是删除
user:以哪个用户的身份执行
实现远程服务的生命周期
参数:
enabled:开机自启动
name:服务名,必选
runlevel:运行级别
state:
started 启动服务
stopped 关闭服务
restarted 重启服务
reloaded 重新加载配置文件,不关闭服务
管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等
参数:
name:必须参数,指定要操作的用户
group:指定用户属组
groups:指定用户附加组
home:设置用户家目录
remove:删除用户,并删除用户的家目录,yes|no
shell:用户登录shell
state:
present:默认值为present
absent:删除
password:指定用户密码,不能为明文密码,只能是加密后的密文,与/etc/shadow中密码字段类似
uid:用户id
system:系统用户
管理远程主机上的组
参数:
name:指定要操作的组名
state:指定组的状态
present:默认值为
absent:删除
gid:指定组的gid
修改远程主机的主机名
用于收集远程主机的基本信息
可以查看系统变量
参数:
filter:用于进行条件过滤
可以用通配符
filter用法:
ansible 集群名 -m setup -a 'filter="系统变量名"'
与bash的yum类似
参数:
enablerepo:启用某个源
name:操作的软件报名,也可以传递一个url或者一个本地的rpm包的路径
state:定义软件包的状态
present:安装
absent:删除
latest:安装最新的
在要执行的yml文件中加入tags
---
- hosts: all
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=present
tags: install
- name: start httpd <---><--->
service: name=httpd state=started
tags: start <---><--->
- name: chkconfig
shell: chkconfig httpd on
tags: chkconfig <---><--->
<---><--->所在的行为tags
然后再命令行指定要使用的tags
ansible-playbook -t install,start,chkconfig *.yml
-t指定要调用的tags,多个用逗号隔开
在ansible中定义变量的方式有五种
(1)定义集群
[webservers]
192.168.136.130
(2)定义变量
[webservers]
192.168.136.130 http_port=81
在集群内给单个主机定义的变量为普通变量
[webservers:vars] 此处的webservers可以为all,表示全部集群
name1=httpd
在hosts文件中可以定义全局变量
***普通变量的优先级高于全局变量
在要执行的yml脚本中定义变量
- hosts: all
remote_user: root
vars:
- name1: httpd
- name2: vsftpd
*** 在此处定义的变量只能在这个文件中使用,优先级仅次于命令行的-e
格式必须按照上面的格式
tasks:
- name: install httpd
yum: name={{name1}} state=present
- name: start httpd
service: name={{name1}} state=started
- name: install vsftpd
yum: name={{name2}} state=present
- name: start httpd
service: name={{name2}} state=started
- name: chkconfig
shell: chkconfig httpd on
通过命令行定义变量
(1)在单独的文件中定义变量,此文件只用来定义变量
文件名为vars.yml
文件内容为
- name1: httpd
- name2: vsftpd
(2)在要执行的文件中引用变量文件
---
- hosts: all
remote_user: root
vars_files:
- vars.yml
*** 此处引用变量文件,格式为指定格式
tasks:
- name: install httpd
yum: name={{name1}} state=present
- name: start httpd
service: name={{name1}} state=started
- name: install vsftpd
yum: name={{name2}} state=present
- name: start httpd
service: name={{name2}} state=started
- name: chkconfig
shell: chkconfig httpd on
在命令行输入:ansible all -m setup
其中现实的变量都可使用
常用的有:
ansible_nodename:查询主机名
ansible_memtotal_mb:查询主机内存大小
ansible_distribution_major_version:查询系统版本
ansible_processor_vcpus:查询主机cpu个数