1 Ansible
- 执行ansible的主机一般称为主控端,中控,master或堡垒机
- 主控端Python版本需要2.6或以上
- 被控端Python版本小于2.4,需要安装python-simplejson
- 被控端如开启SELinux需要安装libselinux-python
- windows不能作为主控端
1.1 Ansible安装
ansible的安装方法有多种
1.1.1 EPEL源的rpm包安装
yum install ansible
1.1.2 编译安装
yum -y install python-jinja2 PyYAML pyramiko 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
1.1.3 GIT方式
git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
1.1.4 pip安装
pip是安装Python包的管理器,类似yum
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
1.1.5 确认安装及查看版本号
[root@ansible-server yum.repos.d]# ansible --version
ansible 2.9.10
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Aug 7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
1.2 Ansible相关文件
1.2.1 配置文件
· /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
· /etc/ansible/hosts 主机清单
· /etc/ansible/roles/ 存放角色的目录
1.2.2 ansible主配置文件
Ansible的配置文件/etc/ansible/ansible.cfg其中大部分的配置内容无需进行修改
[defaults]
#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 #本机的临时命令执行目录
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
#forks = 5 #默认并发数
#poll_interval = 15
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
#ask_pass = True
#transport = smart
#remote_port = 22
#module_lang = C
#module_set_locale = False
#host_key_checking = false #检查对应服务器的host_key,建议取消目录
#log_path=/var/log/ansible.log #日志文件,建议启动
#module_name = command #默认模块,可以修改为shell模块
1.2.3 inventory 主机清单
ansible的主要功用于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名默认的inventory file为/etc/ansible/hosts
主机清单文件格式
inventory文件遵循INI文件风格,中括号中的字符为组名,可以将同一个主机同时归并到多个不同的组中
此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明
如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机
范例:
www.zyixinn.com
[webservers]
www.ceshi1.com:2222
www.ceshi2.com
[dbservers]
db1.ceshi.com
db2.ceshi.com
db3.ceshi.com
[websrvs]
www[1:100].example.com
[dbsrvs]
db-[a:f].example.com
[appsrvs]
10.0.0.[1:100]
1.3 Ansible相关工具
· /usr/bin/ansible 主程序,临时命令执行工具
· /usr/bin/ansible-doc 查看配置文档,模块功能查看工具
· /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官方平台
· /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具
· /usr/bin/ansible-pull 远程执行命令的工具
· /usr/bin/ansible-vault 文件加密工具
· /usr/bin/ansible-console 基于Console界面与用户交互的执行工具
利用ansible实现管理的主要方式:
· Ad-Hoc 既利用ansible命令,主要用于临时命令使用场景
· Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前期的规划过程
1.3.1 ansible-doc
此工具用来显示模块帮助
格式:
ansible -doc [options] [module...]
-l,--list #列出可用模块
-s,--snippet #显示指定模块的playbook片段
范例
#列出所有模块
ansible-doc -l
#查看指定模块帮助用法
ansible-doc ping
#查看指定模块帮助简洁用法
ansible-doc -s ping
1.3.2 ansible
此工具通过ssh协议,实现对远程主机的配置管理,应用部署,任务执行等功能
建议:使用次工具前,先配置ansible主控端能基于密钥认证的方式联系各个被管理节点
范例:利用sshpass批量实现基于key验证
ssh-keygen -f /root/.ssh/id-rsa -P ''
NET=192.168.139
export SSHPASS=root@123
for IP in {1..200};do
sshpass -e ssh-copy-id $NET.$IP
done
格式:
ansible <host-pattern> [-m module_name] [-a args]
命令 分组 模块 参数
选项说明:
--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的Host-pattern
用于匹配被控制的主机的列表
All:表示所有Inventory的所有主机
范例:
ansible all -m ping
*:通配符
ansible "*" -m ping
ansible 192.168.139.* -m ping
ansible "srvs" -m ping
或关系
ansible "websrvs:appsrvs" -m ping
ansible "192.168.139.100:192.168.139.200" -m ping
逻辑与
#在websrvs组并且在dbsrvs组的主机
ansible "websrvs:&dbsrvs" -m ping
逻辑非
#在websrvs组,但不在dbsrvs组中的主机
#注意:此处为单引号
ansible 'websrvs:!dbsrvs' -m ping
综合逻辑
ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' -m ping
正则表达式
ansible "websrvs:&dbsrvs" -m ping
ansible "~(web|db).*\.zyixin\.com" -m ping
ansible命令执行过程
1.加载自己的配置文件 默认/etc/ansible/ansible.cfg
2.加载自己对应的模块文件,如:command
3.通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/ansible.tmp-数字/xxx.py文件
4.给文件+x执行权限
5.执行并返回结果
6.删除临时py文件,退出
ansible的执行状态
[colors]
#highlight = white
#verbose = blue
#warn = bright purple
#error = red
#debug = dark gray
#deprecate = purple
#skip = cyan
#unreachable = red
#ok = green
#changed = yellow
#diff_add = green
#diff_remove = red
#diff_lines = cyan
· 绿色:执行成功并且不需要做改变的操作
· 黄色:执行成功并且对目标主机做变更
· 红色:执行失败
ansible使用范例
#以zyixin用户执行ping存活检测
ansible all -m ping -u zyixin -k
#以zyixin sudo至root执行ping存活检测
ansible all -m ping -u zyixin -k -b
#以zyixin sudo至test用户执行ping存活检测
ansible all -m ping -u zyixin -k -b --become-user=test
#以zyxin sudo至root用户执行ls
ansible all -m command -u zyixin -a 'ls /root' -b --become-user=root -k -k
1.3.3 ansible-galaxy
此工具会连接 https://galaxy.ansible.com 下载相应的roles
范例:
#列出所有已安装的galaxy
ansible-galaxy list
#安装galaxy
ansible-galaxy install geerlingguy.redis
#删除galaxy
ansible-galaxy remove geerlingguy.redis
1.3.4 ansible-pull
此工具会推送ansible的命令至远程,效果无限提升,对运维要求较高
1.3.5 ansible-playbook
此工具用于执行编写好的playbook任务
范例:
ansible-playbook hello.yml
cat hello.yml
---
#hello world yml file
- hosts: cat websrvs
remote_user: root
tasks:
- name: hello world
command: /usr/bin/wall hello world
1.3.6 ansible-valut
此工具可以用于加密解密yml文件
格式:
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 #创建新文件
1.3.7 ansible-console
此工具可交互执行命令,支持tab,ansible 2.0+新增
提示符格式:
执行用户@当前操作的主机组(当前组的主机数量)[f:并发数]$
常用子命令
· 设置并发数:forks n 例如:forks 10
· 切换组:cd 主机组 例如:cd web
· 列出当前组主机列表:list
· 列出所有的内置命令:7或help
范例:
[root@ansible-server ~]# ansible-console
Welcome to the ansible console.
Type help or ? to list commands.
root@all (2)[f:5] list
192.168.139.200
192.168.139.100
root@all (2)[f:5] cd appsrvs
root@appsrvs (2)[f:5] list
192.168.139.200
root@appsrvs (2)[f:5] yum name=httpd state=present
root@appsrvs (2)[f:5] service name=httpd state=started
评论区