ansible基于Python开发,主要用于批量系统配置、批量程序部署、批量运行命令等。
看看它能干什么 ansible DBA常用场景命令小集_Hehuyi_In的博客-CSDN博客
架构如下
工作原理
yum install epel-release -y
yum install ansible -y
二进制包下载 Index of /ansible
yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible
git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup
yum install python-pip python-devel
yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel
pip install --upgrade pip
pip install ansible --upgrade
ansible --version
vim /etc/ansible/ansible.cfg
[defaults]
#inventory = /etc/ansible/hosts # 主机列表配置文件
#library = /usr/share/my_modules/ # 库文件存放目录
#remote_tmp = $HOME/.ansible/tmp # 临时py命令文件存放在远程主机目录
#local_tmp = $HOME/.ansible/tmp # 本机的临时命令执行目录
#forks = 5 # 默认并发数,同时可以执行5次
#sudo_user = root # 默认sudo 用户
#ask_sudo_pass = True # 每次执行ansible命令是否询问ssh密码
#ask_pass = True # 每次执行ansible命令是否询问ssh口令
#remote_port = 22 # 远程主机的端口号(默认22)
# 建议调整项
host_key_checking = False # 检查对应服务器的host_key,建议取消注释
log_path=/var/log/ansible.log # 日志文件,建议取消注释
module_name = command # 默认模块,可以改为shell
可以分组指定,可以写ip、主机名
[testgroup]
192.168.56.40
192.168.56.41
[test41]
host001
host002
可以用正则表达式
[webservers]
www[1:100].example.com # ip: 1-100
[dbservers]
db-[a:f].example.com # dba - dbf
指定主机参数(用户、密码、端口、是否sudo等)
[testgroup]
10.192.168.101 ansible_ssh_user=dba ansible_become=true ansible_become_pass='xxxxx!'
10.192.168.137 ansible_ssh_user=dba ansible_become=true ansible_become_pass='xxxxx!' ansible_ssh_port=9527
ansible普通用户切换_N0thln9的博客-程序员秘密_ansible 指定用户 - 程序员秘密
ansible可根据正则表达式调用主机
ansible "*" -m ping # (*表示所有主机)
ansible 192.168.1.* -m ping
ansible "*srvs" -m ping
还可以按逻辑关系确定调用主机
ansible webservers:dbservers -m win_ping
ansible webservers:!dbservers -m win_ping
ansible webservers:&dbservers -m win_ping
ansible [-m module_name] [-a args]
ansible +被管理的主机(ALL) +模块 +参数
--help 显示帮助
--version 显示版本
-m module 指定模块,默认为command
-v 详细过程 –vv -vvv更详细
--list-hosts 显示主机列表,可简写 --list
-k, --ask-pass 提示输入ssh连接密码,默认Key验证
-C, --check 检查,并不执行
-T, --timeout=TIMEOUT 执行命令的超时时间,默认10s
-u, --user=REMOTE_USER 执行远程执行的用户
-b, --become 代替旧版的sudo切换
--become-user=USERNAME 指定sudo的runas用户,默认为root
-K, --ask-become-pass 提示输入sudo时的口令
显示模块帮助
ansible-doc [options] [module...]
-a 显示所有模块的文档
-l, --list 列出可用模块
-s, --snippet 显示指定模块的playbook片段(简化版,便于查找语法)
用于执行playbook文件,系列后面文章会详细介绍
ansible-playbook hello.yml
cat hello.yml
#hello world yml file
- hosts: websrvs
remote_user: root
tasks:
- name: hello world
command: /usr/bin/wall hello world
连接 https://galaxy.ansible.com,下载相应的roles
# 列出所有已安装的galaxy
ansible-galaxy list
# 安装galaxy
ansible-galaxy install geerlingguy.redis
# 删除galaxy
ansible-galaxy remove geerlingguy.redis
管理、加解密playbook文件(例如其中包含密码时)
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
# 加密
ansible-vault encrypt hello.yml
# 解密
ansible-vault decrypt hello.yml
# 查看
ansible-vault view hello.yml
# 编辑加密文件
ansible-vault edit hello.yml
# 修改口令
ansible-vault rekey hello.yml
# 创建新文件
ansible-vault create new.yml
执行步骤
执行状态
ansible -i host文件 主机组或者主机 -m 模块 -a 命令
# 例如
ansible testgroup -m ping
ansible testgroup -m command -a "pwd"
默认模块,支持简单的linux命令,不支持管道、重定向等,不建议使用
ansible testgroup -m command -a "pwd"
ansible testgroup -m command -a "echo testa|grep a" #这个不能正常使用
ansible testgroup -m command -a "echo bb >>/tmp/testansible" #重定向也无法正常使用
支持管道、重定向等,常用模块
ansible testgroup -m shell -a "echo testa|grep a" #支持管道
ansible testgroup -m shell -a "echo bb >>/tmp/testansible" #支持重定向
ansible testgroup -m shell -a "cat /etc/passwd|awk -F':' '{print \$1}'" #遇到特殊符号需要加入\转义,这样子ansible才能正常运行
# 更新rpm包
ansible -i /tmp/host testgroup -m shell -a "cd /tmp; rpm -Uvh polkit-0.112-26.0.1.el7_9.1.x86_64.rpm"
ansible依赖python环境,例如需要有python-simplejson之类的包,如果没安装的话,就无法使用shell等模块。而raw模块不依赖Python,可以先用raw模块安装批量安装Python。
从 Ansible 2.4 版开始,不再支持 Python2 2.4 版。CentOS 5 附带 2.4.3。
您需要降级到 Ansible 2.3,或者使用更新版本的 CentOS,或者更新版本的 Python。
您也许可以改用该raw模块,该模块对 python 没有远程依赖。https://github.com/ansible/ansible/issues/34643
ansible testgroup -m raw -a "yum install python-simplejson -y"
ansible testgroup -m raw -a "yum install libselinux-python -y"
从ansible服务器复制文件/目录到远程主机,常用参数:
src:源文件/目录
dest:指定目标路径
mode:设置权限
backup:备份源文件
content:代替src,将本机指定内容传至远程主机并生成目标文件
# src指定本地文件,dest指定远程主机目录或者文件
ansible testgroup -m copy -a "src=/tmp/testdir/test.txt dest=/usr/local/src/"
ansible -i /tmp/host testgroup -m copy -a "src=polkit-0.112-26.0.1.el7_9.1.x86_64.rpm dest=/tmp/"
ansible testgroup -m copy -a "src=/tmp/testdir/ dest=/usr/local/src/" #testdir文件夹没拷贝
ansible testgroup -m copy -a "src=/tmp/testdir dest=/usr/local/src/" #testdir文件夹拷贝了
ansible testgroup -m copy -a "src=/tmp/testdir/test.txt dest=/usr/local/src/ backup=yes"
ansible testgroup -m copy -a "src=/tmp/testdir/test.txt dest=/usr/local/src/ backup=yes owner=oracle group=oinstall mode=0600"
在远程主机上运行ansible服务器上的脚本,优点是不需手动传送脚本至每个服务器。
其实是ansible自动传到远程主机、执行然后再删除脚本,即copy+shell+delete
ansible websrvs -m script -a "/data/test.sh"
与copy相反,从远程主机获取文件至ansible服务器(每个被管理主机会生成不同编号的目录,不会发生文件名冲突)。目前不支持目录,可以先打包再提取文件。
ansible websrvs -m fetch -a 'src=/root/test.sh dest=/data/scripts'
ansible all -m shell -a 'tar jxvf test.tar.gz /root/test.sh'
ansible all -m fetch -a 'src=/root/test.tar.gz dest=/data/'
功能同yum命令
# 查看程序列表
ansible websrvs -m yum -a 'list=httpd'
# 安装软件
ansible websrvs -m yum -a 'name=httpd state=present'
# 删除删除
ansible websrvs -m yum -a 'name=httpd state=absent'
功能同service(systemctl)命令
# 停止服务
ansible srv -m service -a 'name=httpd state=stopped'
# 启动服务,并设为开机自启动
ansible srv -m service -a 'name=httpd state=started enabled=yes'
# 重新加载
ansible srv -m service -a 'name=httpd state=reloaded'
# 重启服务
ansible srv -m service -a 'name=httpd state=restarted'
参考:
ansible批量执行命令_小鱼的技术博客_51CTO博客
《ansible权威指南》
https://www.bilibili.com/video/BV1HZ4y1p7Bf?from=search&seid=13215158654353304589&spm_id_from=333.337.0.0
有道云笔记