- 目录
- Ansible
- 1 特性
- 2 组成
- 3 安装
- 主配置文件
- 相关工具
- 4 ansible命令执行过程
- 执行状态
- 5 ansible-playbook
- 6 其他命令
- 5 常用模块
- 1 ping模块
- 2 command模块
- 3 shell模块
- 4 Script 模块
- 5 copy模块
- 6 yum/apt模块
- 7 file模块
- 8 user模块
- 9 corn模块
- 10 synchronize模块
- 11 Service 模块
- 12 Lineinfile 模块
- 13 unarchive 模块
- 14 Setup 模块
- PS
Ansible
除了使用pssh做批量主机操作外,进阶选择就是使用Saltstack、Ansible、Puppet了。
Ansible基于Python开发,集合了众多优秀运维工具的优点,实现了批量运行命令、部署程序、配置系统等功能。默认通过SSH协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,从而使得自动化环境部署变得更加简单。可同时支持多台主机并行管理,使得管理主机更加便捷
1 特性
- 模块化:调用特定的模块完成特定任务,支持自定义模块,可使用任何编程语言写模块
- Paramiko(python对ssh的实现),PyYAML,Jinja2(模板语言)三个关键模块
- 基于Python语言实现
- 部署简单,基于python和SSH(默认已安装),agentless,无需代理不依赖PKI(无需ssl)
- 安全,基于OpenSSH
- 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性非绝对
- 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构
- 较强大的多层解决方案 role
2 组成
- Ansible 核心执行工具;一次性或临时执行的操作都是通过该命令执行
- INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
- MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
- PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等
- API:供第三方程序调用的应用程序编程接口
3 安装
#1 yum install epel-release
yum install ansible
#rpm -qa ansible
ansible-2.9.21-1.el7.noarch
#rpm -qc ansible
/etc/ansible/ansible.cfg # 主配置文件
/etc/ansible/hosts # 默认的管理主机清单
#2 pip install
pip3 install ansible==
主配置文件
hostfile = /etc/ansible/hosts ##hosts文件的位置
library = /usr/share/ansible ##ansible默认搜寻模块的位置
pattern = * ##如果没有提供hosts节点,这是playbook要通信的默认主机组.默认值是对所有主机通信
remote_tmp = $HOME/.ansible/tmp ##Ansible通过远程传输模块到远程主机,然后远程执行,执行后在清理现场.在有些场景下,你也许想使用默认路径希望像更换补丁一样使用
forks = 5 ##在与主机通信时的默认并行进程数 ,默认是5d
poll_interval = 15 ##当具体的poll interval 没有定义时,多少时间回查一下这些任务的状态, 默认值是5秒
sudo_user = root ##sudo使用的默认用户 ,默认是root
#ask_sudo_pass = True ##用来控制Ansible playbook 在执行sudo之前是否询问sudo密码.默认为no
#ask_pass = True ##控制Ansible playbook 是否会自动默认弹出密码
transport = smart ##通信机制.默认 值为’smart’。如果本地系统支持 ControlPersist技术的话,将会使用(基于OpenSSH)‘ssh’,如果不支持将使用‘paramiko’.其他传输选项‘local’,‘chroot’,’jail’等等
#remote_port = 22 ##远程SSH端口。 默认是22
module_lang = C ##模块和系统之间通信的计算机语言,默认是C语言
#host_key_checking = False ##检查主机密钥
timeout = 10 ##SSH超时时间
#log_path = /var/log/ansible.log ##日志文件存放路径
#module_name = command ##ansible命令执行默认的模块
#private_key_file = /path/to/file ##私钥文件存储位置
相关工具
- /usr/bin/ansible 主程序,临时命令执行工具
- /usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man
- /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本
- /usr/bin/ansible-pull 远程执行命令的工具
- /usr/bin/ansible-vault 文件加密工具
- /usr/bin/ansible-console 基于Console界面与用户交互的执行工具
- /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
- 利用ansible实现管理的主要方式
- Ad-Hoc 即利用ansible命令,主要用于临时命令使用场景
- Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前期的规划过程
- ansible-doc 显示模块帮助
ansible-doc [options] [module...]
-l, --list #列出可用模块
-s, --snippet #显示指定模块的playbook片段
#列出所有模块
ansible-doc -l
#查看指定模块帮助用法
ansible-doc ping
#查看指定模块帮助用法
ansible-doc -s ping
4 ansible命令执行过程
- 加载自己的配置文件,默认/etc/ansible/ansible.cfg
- 加载自己对应的模块文件,如:command
- 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户
$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件 - 给文件+x执行
- 执行并返回结果
- 删除临时py文件,退出
执行状态
# grep -A 14 '\[colors\]' /etc/ansible/ansible.cfg
#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
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
5 ansible-playbook
此工具用于执行编写好的 playbook 任务
ansible-playbook hello.yml
6 其他命令
# ansible-vault 加密解密yml文件
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-console 可交互执行命令
# ansible-galaxy 连接 https://galaxy.ansible.com 下载相应的roles
5 常用模块
ansible模块众多,但最常用的模块也就几十个,针对特定业务只用10几个模块
ansible-doc -s ping
# 查看模块帮助
1 ping模块
检测主机存活状态
# cat /etc/ansible/hosts
[webservers]
192.168.1.101
192.168.1.102
192.168.1.102:2222
www[1:100].example.com
[dbserver]
192.168.1.102 ansible_ssh_user=root ansible_ssh_port=2222
# ansible all -m ping
#ansible -i hosts webservers -om ping
# ansible 192.168.1.111 -m ping
###
--version #查看ansible的版本信息
-i 文件位置 #指定hosts文件的存放位置
-f 进程数量 #指定fork出的进程数量值
-a 模块的参数或命令 #指定module模块的参数或者命令
-sudo #基于sudo用户指定
-T 指定命令超时时间单位为秒 #超时时间,默认是10s
-m module #指定模块,默认为command
-v #详细过程 –vv -vvv更详细
--list-hosts #显示主机列表,可简写 --list
-C, --check #检查,并不执行,预演
-T, --timeout=TIMEOUT #执行命令的超时时间,默认10s
-k, --ask-pass #提示输入ssh连接密码,默认Key验证
-u, --user=REMOTE_USER #执行远程执行的用户
-b, --become #代替旧版的sudo 切换
--become-user=USERNAME #指定sudo的runas用户,默认为root
-K, --ask-become-pass #提示输入sudo时的口令
2 command模块
ansible all -a 'uptime'
ansible all -m command -a 'uptime'
ansible all -a 'chdir=/tmp ls'
ansible all -a 'creates=/tmp ls'
ansible all -a 'removes=/root/a cat a' cv
###
chdir ##执行命令前,切换到该目录
creates ##当该文件存在时,则不执行该步骤
executable ##换用其他shell环境执行命令
free_form ##需要执行的脚本
removes ##当该文件不存在时,则不执行该步骤
3 shell模块
用于执行远端主机上的shell命令或脚本,支持比command更多的指令
ansible all -m shell -a 'hostname -i >> /tmp/ip; cat /tmp/ip'
###
chdir ##执行命令前,切换到此位置
creates ##当该文件存在时,不执行该步骤
removes ##当该文件不存在时,不执行该步骤
warn ##不显示警告
4 Script 模块
在远程主机上运行ansible服务器上的脚本(无需执行权限)
ansible all -m script -a agent.sh
5 copy模块
ansible all -m copy -a 'src=/root/agent.sh dest=/tmp/ mode=700 owner=2049'
###
src #源文件位置
content #手动编写源文件内容
dest #目标主机上的目标文件位置
mode #设置文件权限
owner #设置文件属主
group #设置文件属组
force #强制覆盖文件
6 yum/apt模块
ansible all -m yum -a "name=tmux state=installed"
ansible all -m apt -a 'name=bb,sl,cowsay,cmatrix,oneko,hollywood,boxes,libaa-bin,x11-apps'
###
name #软件包名称
state #软件包状态,installed表示安装、absent表示卸载
update_cache #安装软件包前更新缓存
enablerepo #指定yum源名称
conf_file #指定yum安装时所加载的yum配置文件
7 file模块
ansible all -m file -a 'path=/tmp/direct state=directory mode=755'
ansible all -m file -a 'path=/tmp/text state=touch mode=700'
###
path #目标位置
state #状态,directory为目录、touch为文件、link为软链接
mode #文件权限
owner #属主
group #属组
8 user模块
ansible all -m user -a 'name=www home=/app/nginx shell=/sbin/nologin uid=2048 state=present'
ansible all -a 'id www'
###
name #用户名
home #家目录位置
shell #指定登陆shell
uid #指定用户uid
state #状态,present为新建、absent为删除
force #强制删除
9 corn模块
ansible all -m cron -a "minute=1 hour=0 day=* month=* weekday=* name=test_cron job='echo a > /tmp/text'"
ansible all -a "crontab -l"
ansible all -m cron -a "name=test_cron state=absent"
###
name #计划任务名称
minute #分钟数
hour #小时数
day #日
month #月
weekday #周
job #任务内容
user #任务计划的用户
state #状态,present是新建,absent是删除
10 synchronize模块
ansible all -m synchronsize -a 'src=/root/ dest=/tmp/ compress=yes'
###
用于管理节点与被管理节点之间的文件目录数据同步;
compress #开启压缩,默认为开启
archive #是否采用归档模式同步,保证源文件与目标文件属性一致
links #是否同步链接文件
recursive #是否开启递归
delete #删除源位置没有,而目标位置有的文件
src #源位置
dest #目标位置
--exclude=.log #排除,忽略同步.log
11 Service 模块
ansible all -m service -a 'name=httpd state=started enabled=yes'
ansible all -m service -a 'name=httpd state=stopped'
ansible all -m service -a 'name=httpd state=reloaded'
12 Lineinfile 模块
ansible在使用sed进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时,存在问题,无法正常进行替换 。其实在ansible自身提供了两个模块:lineinfile模块和replace模块,可以方便的进行替换
一般在ansible当中去修改某个文件的单行进行替换的时候需要使用lineinfile模块
regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除
如果想进行多行匹配进行替换需要使用replace模块
ansible websrvs -m lineinfile -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen' line='Listen 80'"
ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'"
ansible all -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#"'
13 unarchive 模块
解包解压缩
实现有两种用法:
1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes
2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no
ansible all -m unarchive -a 'src=/data/foo.tgz dest=/var/lib/foo owner=user group=bin'
ansible all -m unarchive -a 'src=/tmp/foo.zip dest=/data copy=no mode=0777'
ansible all -m unarchive -a 'src=https://example.com/example.zip dest=/data copy=no' ansible websrvs -m unarchive -a 'src=https://releases.ansible.com/ansible/ansible-2.1.6.0-0.1.rc1.tar.gz dest=/data/ owner=mysql remote_src=yes'
###
copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为
copy=no,会在远程主机上寻找src源文件
remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible
主机上
src:源路径,可以是ansible主机上的路径,也可以是远程主机(被管理端或者第三方主机)上的路径,如果
是远程主机上的路径,则需要设置copy=no
dest:远程主机上的目标路径
mode:设置解压缩后的文件权限
14 Setup 模块
setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度,可以使用 gather_facts: no 来禁止 Ansible 收集 facts 信息
ansible all -m setup
ansible all -m setup -a "filter=ansible_nodename"
ansible all -m setup -a "filter=ansible_hostname"
ansible all -m setup -a "filter=ansible_domain"
ansible all -m setup -a "filter=ansible_memtotal_mb"
ansible all -m setup -a "filter=ansible_memory_mb"
ansible all -m setup -a "filter=ansible_memfree_mb"
ansible all -m setup -a "filter=ansible_os_family"
ansible all -m setup -a "filter=ansible_distribution_major_version"
ansible all -m setup -a "filter=ansible_distribution_version"
ansible all -m setup -a "filter=ansible_processor_vcpus"
ansible all -m setup -a "filter=ansible_all_ipv4_addresses"
ansible all -m setup -a "filter=ansible_architecture"
ansible all -m setup -a "filter=ansible_processor*"