自动化运维-Ansible基础
  • 分类:自动化运维
  • 发表:2018-06-05
  • 围观(1,404)
  • 评论(0)

ansible,一个由 Python 编写的强大的配置管理解决方案。尽管市面上已经有很多可供选择的配置管理解决方案,但他们各有优劣,而 ansible 的特点就在于它的简洁。让 ansible 在主流的配置管理系统中与众不同的一点便是,它并不需要你在想要配置的每个节点上安装自己的组件。同时提供的一个优点在于,如果需要的话,你可以在不止一个地方控制你的整个基础架构。最后一点是它的正确性,或许这里有些争议,但是我认为在大多数时候这仍然可以作为它的一个优点。说得足够多了,让我们来试着用一下它吧


ansible命令执行过程
1、加载自己的配置文件,默认在/etc/ansible/ansible.cfg
2、加载对应的模块,如command,shell等
3、通过ansible将模块或命令生成对应的临时py文件,并传输到远程服务器对应执行用户$HOME/.ansible/tmp/ansible-tmp-xxx/xxx.py
4、给文件执行权限并执行
5、返回执行结果并删除临时py文件,sleep 0 退出
执行状态:
绿色:执行成功且未对主机做更改
黄色:执行成功并且对目标主机做出更改
红色:执行失败
配置文件:

/etc/ansible/ansible.cfg
主配置文件,配置ansible的各项工作特性

/etc/ansible/hosts
主机清单

/etc/ansible/roles
存放角色的目录。角色:可以理解为多个多个ansible脚本的集合

/usr/bin/ansible-doc
ansible的帮助程序,查看ansible模块的帮助信息

/usr/bin/ansible-galaxy
优秀代码,playbook分享程序

/usr/bin/ansible-playbook
定制化自动任务,剧本编排工具

/usr/bin/ansible-pull
远程执行命令的工具

/usr/bin/ansible-vault
文件加密工具

/usr/bin/ansible-console
基于console界面与用户交互的执行工具

主机清单:/etc/ansible/hosts

[group1]
192.168.1.1
192.168.1.2:1024
192.168.1.3

[group2]
192.168.[2:11]

[group3]
192.168.1.3
192.168.1.20

[group]--中括号用来将不同的主机分组,中括号内是组名
主机列表通常为IP地址的集合,可以使用[n1:n2]的方式来指定IP地址的范围
相同的IP可以在不同的组中,在执行命令的时候相同的IP只会执行一次命令

ansible配置文件:/etc/ansible/ansible.cfg
通常情况下不会改动此文件的配置

[defaults]
#inventory= /etc/ansible/hosts
#library = /usr/share/my_modules/
#remote_tmp = $HOME/.ansible/tmp
#local_tmp = $HOME/.ansible/tmp
#forks= 5
#sudo_user = root
#ask_sudo_pass = True
#ask_pass = True
#remote_port = 22
#host_key_checking = False
#log_path=/var/log/ansible.log

ansible基本用法:

ansible host-pattern [-m module] [-a args]
--version                                         显示版本信息
-m module                                      指定使用的模块,默认为command模块
-v、-vv或-vvv                                显示详细的信息
--list-hosts                                      显示主机列表,可以简写为 --list
-k , --ask-pass                               提示连接密码。(ansible默认使用基于key的验证,使用此选项来交互输入认证信息)
-K ,--ask-become-pass              提示输入sudo密码
-C ,--check                                 检查,但并不实际执行
-T ,--timeout=timeout             执行命令的超时时间,默认是10s
-u ,--user=user                        指定远程执行的用户身份
-b ,--become                             代替旧版的sudo切换

host-pattern:

匹配主机的列表,某些情况下双引号可能会有问题,建议全部使用单引号
all 表示主机列表文件中的所有主机

* 通配符

ansible "*" -m ping 对主机列表中的所有主机进行操作
ansible 192.168.1.* -m ping 对主机列表中所有192.168.1.开头的 主机进行操作
ansible "*srvs" -m ping 对主机列表中以srvs结尾的组进行操作

:&、:、:! 逻辑关系,与或非

ansible 'group1:group2' -m ping group1和group2中的主机都会被操作
ansible 'group1:&group2' -m ping 同时在group1和group2中的主机会被操作
ansible 'group1:!group2' -m ping 在group1中但不在group2中的主机被操作

~ 使用正则表达式

ansible '~(web|db).*' -m ping web或db开头的组会被操作(包含匹配)

ansible使用 示例:

ansible all -m ping -u mrhan -k

使用ping模块对主机列表中的所有主机以mrhan的身份进行操作,-k指定在没有使用key认证的情况下交互输入密码。
即使多台主机使用不同密码也只会询问一次。ansible会使用此密码匹配所有主机。

ansible all -m ping -u mrhan -b -k

以mrhan的身份sudo到root对主机列表执行ping模块(被控端需要配置对应的sudo权限)

ansible all -m ping -u mrhan -b -k --become-user wang

以mrhan的身份sudo到wang对主机列表执行对应操作

ansible all -m command -u mrhan --become-user=root -a 'cat /etc/passwd' -b -k -K

以mrhan的身份sudo到root对主机执行cat /etc/passwd

ansible web -a 'cat /etc/passwd' --limit 192.168.1.22

只对组中特定的主机进行执行

 

ansible常用模块:

command 在远程主机执行命令,默认模块可省略(在不指定-m的情况下默认使用此模块)不支持管道、变量、重定向等
chdir 执行后续命令前切换目录
removes 当文件不存在不执行后续命令
creates 当文件从存在不执行后续命令

ansible all -a 'chdir=/etc/ cat fstab'
ansible all -a 'creates=/etc/fstab cat /etc/fstab'
ansible all -a 'removes=/etc/fstab cat /etc/fstab'
ansible all -m command -a 'cat /etc/passwd'
ansible all -a 'cat /etc/passwd'

在主机列表中的主机上打开/etc/passwd文件

 

shell 和command类似的模块,但支持的更加全面,可以用来替代command模块使用

ansible all -m shell -a 'cat /etc/passwd'
ansible all -m shell -a 'echo 000000 | passwd --stdin mrhan'

注意第二条命令使用command模块无法完成,注意:过于复杂的命令使用shell模块也可能失败,建议写入脚本执行

script 运行脚本

ansible all -m script -a file.sh
ansible hostlist -m script -a '/path/script.sh'

copy 从主控端复制文件到被控端

owner 复制到目标主机之后修改所属主
mode 复制到目标主机之后修改权限
backup 如果目标文件存在,覆盖之前先备份
directory_mode 文件夹模式,使用0或者1
content 使用内容直接生成文件

ansible all -m copy -a 'src=/path/file dest=/path/ owner=owner mode=755 backup=yes'
ansible all -m copy -a 'src=/root/test dest=/root/ directory_mode=1'
ansible all -m copy -a 'content="hello world\n" dest=/root/test1'

fetch 从被控端复制文件到主控端(一次只可以复制一个文件,不可复制文件夹)

ansible all -m fetch -all 'src=/root/test dest=/root/'

将被控端指定文件复制到控制端,文件会存放在以各自IP为目录的原目录下,如果需要同时拉去多个文件,可以先将多个文件
进行打包然后使用此命令进行拉取。(远程执行tar命令在不指定绝对路径的时候,文件会生成在工作目录)

archive 打包模块

cron 计划任务

minute 指定分钟
hour
day
weekday
month
job 指定具体任务

ansible all -m cron -a 'minute=* weekday=1,2,3,4 job="/usr/bin/wall hello world "'
ansible all -m cron -a 'minute=* weekday=* job="echo hello world " name=name'
ansible all -m cron -a 'disabled=yes name=name job="echo hello world"'
启用或禁用计划任务
ansible all -m cron -a 'name=name job="echo hello world" state=absent'
删除指定的计划任务

yum 包管理

ansible all -m yum -a 'name=httpd state=latest update_cache=yes'
ansible all -m yum -a 'name=httpd state=absent'

安装或删除包,state=latest可以省略,模块默认为安装动作,也可以使用install和remove,多个包使用逗号隔开
name可以指定位于被控端的本地RPM包,update_cache=yes可以清空yum缓存,但不可以单独存在

ansible all -m yum -a 'list=installed'

installed,updates,available,repos

file 文件模块,设置文件属性

owner 修改文件的所有者
mode 修改文件的权限信息
state
touch 创建文件
absent 删除文件(可以删除目录)
directory 创建目录
link 创建软链接

ansible all -m file -a 'path=/path/file owner=mrhan mode=755'
ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’
ansible hostlist -m file -a 'name=/path/[file] state=xxx'

hostname 修改主机名模块,即时生效,通过修改文件生效(设置永久保存)

ansible all -m hostname -a 'name=hostname'

service 管理服务

ansible srv -m service -a 'name=httpd state=stopped enabled=yes'
ansible srv -m service -a 'name=httpd state=started enabled=no'
ansible srv –m service –a ‘name=httpd state=reloaded’
ansible srv -m service -a 'name=httpd state=restarted'

user 管理用户

name 指定要管理的用户
state 不指定的时候表示新建用户,指定state=absent表示删除用户

remove 当state=absent即删除用户的时候指定remove=yes表示同时删除用户的 Home目录

ansible srv -m user -a 'name=user1 shell=/sbin/nologin system=yes comment=“test user” uid=2048 home=/app/user1 group=root'
ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1 '
ansible srv -m user -a ‘name=user1 state=absent remove=yes‘

ansible系列常用命令:

ansible-doc
ansible-galaxy
ansible-playbook
ansible-vault
ansible-console
ansible-pull

ansible-doc:显示指定ansible模块的帮助信息

ansible-doc [opt] [module...]
-a 显示所有模块的文档信息
-l, --list 列出当前可用模块
-s, --snippet 显示指定模块的playbook片段

示例:

ansible-doc -l                                     列出当前可用模块
ansible-doc ping                              查看ping模块的帮助信息
ansible-doc -s ping                          查看ping模块的帮助信息(精简信息)

ansible-galaxy:                              优秀角色下载--https://galaxy.ansible.com
ansible-galaxy install name             默认的下载目录在~/.ansible/roles/name
ansible-galaxy list name                  列出下载的角色的信息
ansible-galaxy remove name          删除指定的角色(通过删除对应的目录)

ansible-valut                                    剧本加密工具
ansible-valut encrypt file.yml          加密一个剧本,使用AES256加密算法
ansible-valut decrypt file.yml          解密一个剧本
ansible-valut view                         查看一个加密的剧本
ansible-valut edit                          编辑一个加密的剧本
ansible-valut rekey                      修改加密剧本的密码
ansible-valut create                    创建要给加密的剧本
ansible-console                         交互式执行ansible

---------
Welcome to the ansible console.
Type help or ? to list commands.

root@all (4)[f:5]$
----------

用户名@主机清单 (主机清单包含几个主机)[并发连接数]
使用cd groupname切换主机清单
使用focks n修改并发数

内部命令格式
使用?查看支持的模块列表
module cmd

ansible-playbook 剧本编排工具--中文站:www.ansible.com.cn
ansible-playbook ... [opt]
--check 试运行,不对主机做实际更改
--list-hosts 列出运行任务的主机
--list-tasks 列出任务列表
--limit hostlist 针对hostlist中的主机进行执行
-v -vv -vvv 显示执行的详细信息

Top