Ansible常用模块使用


Ansible

除了使用pssh做批量主机操作外,进阶选择就是使用Saltstack、Ansible、Puppet了。

Ansible基于Python开发,集合了众多优秀运维工具的优点,实现了批量运行命令、部署程序、配置系统等功能。默认通过SSH协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,从而使得自动化环境部署变得更加简单。可同时支持多台主机并行管理,使得管理主机更加便捷

1 特性

  1. 模块化:调用特定的模块完成特定任务,支持自定义模块,可使用任何编程语言写模块
  2. Paramiko(python对ssh的实现),PyYAML,Jinja2(模板语言)三个关键模块
  3. 基于Python语言实现
  4. 部署简单,基于python和SSH(默认已安装),agentless,无需代理不依赖PKI(无需ssl)
  5. 安全,基于OpenSSH
  6. 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性非绝对
  7. 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构
  8. 较强大的多层解决方案 role

2 组成

  1. Ansible 核心执行工具;一次性或临时执行的操作都是通过该命令执行
  2. INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
  3. MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
  4. PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等
  5. 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     	##私钥文件存储位置

相关工具

  1. /usr/bin/ansible 主程序,临时命令执行工具
  2. /usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man
  3. /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本
  4. /usr/bin/ansible-pull 远程执行命令的工具
  5. /usr/bin/ansible-vault 文件加密工具
  6. /usr/bin/ansible-console 基于Console界面与用户交互的执行工具
  7. /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
  • 利用ansible实现管理的主要方式

    1. Ad-Hoc 即利用ansible命令,主要用于临时命令使用场景
    2. 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命令执行过程

  1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
  2. 加载自己对应的模块文件,如:command
  3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户
    $HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
  4. 给文件+x执行
  5. 执行并返回结果
  6. 删除临时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*"

PS

Ansible常用模块
ansible太慢解决
ansible-playbook 使用
https://www.cnblogs.com/www233ii/p/11997368.html

posted @ 2020-01-28 22:05  AlexG  阅读(388)  评论(0编辑  收藏  举报