ansible基本使用
目录
一、ansible入门
(一)、简述
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。
(二)、特点
部署简单
轻量级,不需要安装agent
默认使用ssh协议
有大量的模块使用
支持api,易扩展
通过playbooks管理配置和状态
(三)、执行过程
- 加载配置文件,默认/etc/ansible/ansible.cfg
- 查找主机列表清单,默认/etc/ansible/hosts
- 加载对应模块
- 通过ansible将模块和命令生成对应的临时py文件,并且将文件传输到远程服务器上的执行用户目录的py脚本(如:root/.ansible/tmp/xx/xx.py)
- 给文件+x执行权限
- 执行并返回结果
- 删除临时py文件
(四)、安装
- pip安装
yum install python-pip -y
pip install ansible
- yum安装
yum install epel-release -y
yum install ansible –y
(五)、常用命令
# ad-hoc临时执行命令
ansible
# playbook 定制剧本的管理工具
ansible-playbook
# playbook开源库管理工具
ansible-galaxy
二、ansible配置文件
(一)、主机列表
- inventory描述
# 主机清单列表
# 默认地址/etc/ansible/hosts
[webservers]
x.x.x.1
x.x.x.2
- 主机和组
#[webservers]
[组名]
主机可以同时属于多个组
- 主机变量
[webservers]
test ansible_ssh_host=x.x.x.1 ansible_ssh_user=root ansible_ssh_pass=password
- 组变量
# 所有组的变量
[all:vars]
ansible_ssh_user=root
ansible_ssh_pass=password
- 把一个组作为另一个组的变量
[group1]
x.x.x.1 node_name=g1-node01
x.x.x.2 node_name=g1-node02
[group2]
x.x.x.1 node_name=g2-node01
x.x.x.2 node_name=g2-node02
[gs:children]
group1
group2
[gs:vars]
ansible_ssh_user=root
ansible_ssh_pass=password
- 参数说明
# 远程主机地址
ansible_ssh_host
# 主机端口
ansible_ssh_port
# 主机用户
ansible_ssh_user
# 密码
# 注意:明文不安全,建议使用 --ask-pass 或 SSH 密钥
ansible_ssh_pass
# sudo 密码
ansible_sudo_pass
(二)、ansible.cfg配置
- 示例
[defaults]
inventory = hosts
forks = 5
become = root
remote_port = 22
host_key_checking = False
timeout = 10
log_path = /var/log/ansible.log
private_key_file = /root/.ssh/id_rsa
- 参数说明
# 管理主机列表hosts文件路径,默认/etc/ansible/hosts
inventory=/etc/ansible/hosts
# 执行并发数,默认5
forks=5
# 执行playbook时的远程认证用户,默认root
remote_port=root
# ansible第1次连接客户端是否检查ssh密钥
host_key_checking=false
# ssh超时时间,默认10s
timeout=10
# 日志目录
log_path = /var/log/ansible.log
# 免密登录
private_key_file = /root/.ssh/id_rsa
三、 ansible命令行ad-hoc
(一)、基础
- 简述
ad-hoc命令可以输入内容,快速执行某个操作,但不希望留存记录。
ad-hoc命令是理解Ansible和在学习playbooks之前需要掌握的基础知识。
一般来说,Ansible的真正能力在于剧本。
- 命令格式
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
- 参数说明
选项 | 描述 |
---|---|
-u (remote-user) | ssh连接用户 |
-k,--ask-pass | ssh连接用户密码 |
-a | 参数 |
-m | 默认command模块 |
- 私钥配置
#生成私钥
ssh-keygen
# 复制私钥到远程主机
ssh-copy-id root@x.x.x.1
(二)、示例
- ping
# ping,测试主机连通性
ansible all -m ping -uroot -k
- 默认模块
# 使用默认模块,command
ansible all -a 'uname -a' -uroot -k
- 批量修改用户密码
# 批量修改user01用户密码
ansible -i hosts all -m shell -a "echo 'password' | passwd --stdin user01" -uroot -k
四、 ansible常用模块
(一)、shell
-
简述
在目标主机上执行shell命令
-
示例
ansible 组 -u root -k -m shell -a 'hostname'
(二)、copy
-
简述
文件拷贝,将管理主机的文件拷贝到目标主机上
-
示例
ansible 组 -m copy -a "src=/testdir/copytest dest=/testdir/"
- 常用参数说明
参数 | 描述 |
---|---|
src | 指定管理主机需要copy的文件或者目录 |
dest | 指定目标主机拷贝到的目录 |
mode | 拷贝到目标主机后文件或者目录的权限(如:0644) |
backup | 同名文件时,是否备份(值:yes no) |
(三)、file
-
简述
管理主机的文件和文件属性
-
示例
# 创建目录
ansible 组 -m file -a "path=/tmp/test state=directory"
# 删除目录
ansible 组 -m file -a "path=/tmp/test state=absent"
- 常用参数说明
参数 | 描述 |
---|---|
path | 需要操作的文件 |
state | 操作状态,创建,删除(directory、absent、touch) |
mode | 指定文件或者目录的权限(如:0644) |
recurse | 指定目录时,可以递归修改目录下文件的熟悉(yes、no) |
(四)、yum
-
简述
软件包管理工具
-
示例
# 安装vim
ansible 组 -m yum -a "name=vim state=present"
# 最新vim
ansible 组 -m yum -a "name=vim state=latest"
# 卸载
ansible 组 -m yum -a "name=vim state=absent"
# 指定源安装
ansible 组 -m yum -a "name=http://www.rpmfind.net/linux/epel/7/x86_64/Packages/n/nginx-1.16.1-3.el7.x86_64.rpm state=present"
- 参数说明
参数 | 描述 |
---|---|
name | 软件名称 |
state | 安装(present、installed),卸载(absent 、removed),安装最新latest |
enablerepo | 指定repo源 |
(五)、service/systemd
-
简述
服务管理
-
示例
# 启动nginx+开机自启动
ansible 组 -m service -a "name=nginx state=started enabled=yes"
- 参数说明
参数 | 描述 |
---|---|
name | 服务名称 |
state | started/stopped/restarted/reloaded |
enabled | 是否开机启动(yes/no) |
(六)、unarchive
-
简述
文件解压
-
示例
ansible 组 -m unarchive -a "src=/tmp/test.tar.gz dest=/tmp mode=0755"
- 参数说明
参数 | 描述 |
---|---|
src | 源文件路径 |
dest | 远程主机文件路径 |
mode | 解压后文件权限 |
copy | 管理主机(yes)或者远程主机(no)找源文件 |
(七)、其他模块
-
其他模块
user
group
mysql
debug
-
示例
# debug
ansible 组 -m debug -a "var=inventory_hostname"