Linux 第58,59天 ansible

Linux 第58,59天 ansible

时间: 20180920

时间: 20180921


目录

运维的自动化过程

ansible

ansible特性

ansible主要组成部分

ansible命令执行来源

利用ansible实现管理的方式

ansible安装

ansible相关文件

主机清单inventory

ansible相关命令

ansible命令执行过程

ansible常用模块

总结



运维的自动化过程

On-Premises 所有都自己做

IaaS (Infrastructure as a Service) 类似IDC机房,硬件非自己的,系统层自己来操作

PaaS (Platform as a Service) 云  操作系统也不需要自己操作,只需要安装应用

SaaS (Software as a Service) 软件提供商 什么都不需要,直接拿过来使用即可



ansible

是一个工具可以批量化管理其它服务器,想象一下当你管理三四台或者10几台机器,手动一台

一台登录至每一台机器操作使用还可以接受,当上百台呢?这个每一台都连接上去手动执行命令

效率太过低下,所以就产生了一系统工具,ansible是其中之一


ansible特性

模块化: 调用特定的模块完成特定任务

paramiko, PyYAML, Jinja2(模板语言)三个关键模块

支持自定义模块

甚至于python语言实现

部署简单,基于python和SSH(默认已安装),agentless

安全,基于openssh

支持playbook编排任务

幂等性: 一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况

无需代表不依赖PKI无需ssl

可使用任何编程语言写模块

YAML格式,编排任务,支持丰富的数据结构

较强大的多层解决方案



ansible主要组成部分

playbooks 任务剧本(任务集) 编排定义Ansible任务集的配置文件,由Ansible顺序依次执行

通常是JSON格式的YML文件

inventory ansible管理主机的清单/etc/ansible/hosts

modules ansible执行命令的功能模块,多数为内置核心模块,也可自定义

plugins 模块功能的补充,如连接类型插件,循环插件,变量插件,过滤插件等该功能不常用

api 供第三方程序调用的应用程序编程接口


ansible命令执行来源

user 普通用户,即system administrator

cmdb (配置管理数据库) api调用

public/private cloud api调用

user -> Ansible Playbook -> Ansible


利用ansible实现管理的方式

Ad-Hoc 即ansible命令,主要用于临时命令的场景

Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划

Ansible-playbook执行过程

将已有编排好的任务集写入Ansible-Playbook

通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行

Ansible主要操作对象

Hosts

Networking Device


注意事项

执行ansible的主机一般称为主控端,中控,或保垒机

主控端Python版本需要2.6或以上

被控端Python版本小于2.4时需要安装python-simplejson

被控端如开启SELinux需要安装libselinux-python

windows不能做主控端


ansible安装

yum install ansible


ansible相关文件

配置文件

/etc/ansible/ansible.cfg 主配置文件

/etc/ansible/hosts 主机清单

/etc/ansible/roles/ 存放角色的目录

程序

/usr/bin/ansible 主程序,临时命令执行工具

/usr/bin/ansible-doc 查看配置文档,模块功能查看工具

/usr/bin/ansible-galaxy 下载/上传优秀的代码或roles模块的官网平台

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

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


ansible配置文件参数详解/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 #默认并发数

#sudo_user = root #默认sudo用户

#ask_pass = True #每次执行ansible命令时是否询问ssh密码

#ask_sudo_pass = True  #与上述类似

#remote_port = 22 #默认ssh端口

#host_key_checking = False #检查对应服务器的host_key是否在本机.ssh库里

#log_path=/var/log/ansible.log #日志文件路径

#module_name = command #默认模块


主机清单inventory

ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory 

文件中将其分组命名,默认的inventory file为/etc/ansible/hosts


inventory file可以有多个,且可以通过Dynamic Inventory来动态生成


/etc/ansible/hosts文件格式

inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到

多个不同的组中; 此外,如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使

用冒号加端口号来标明

单台机器

ntp.winthcloud.com

一组机器组名是webservers

[webservers]

www1.winthcloud.com

www2.winthcloud.com


一组机器使用特殊标明[dbservers]

[dbservers]

db[1:3].winthcloud.com

表示为db1,db2,db3这3台主机


可以在主机后边加参数如

ansible_ssh_pass=  连接主机时输入的密码

ansible_ssh_user=  连接主机时所使用的用户

ansible_ssh_port=  连接主机时的port

ansible_sudo_pass= 连接主机时sudo命令的密码



ansible相关命令

ansible的命令

ansible ansible-doc ansible-playbook ansible-vault

ansible-console ansible-galax ansible-pull


ansible-doc 显示模块帮助

ansible-doc [options] [module...]

-a 显示所有模块的文档

-l 列出可用模块

-s --snippet 显示指定模块的playbook片段


ansible 通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于

密钥认证的方式联系各被管理节点

ansible <host-pattern> [-m module_name] [-a args]

--version 显示版本

-m module 指定模块,默认为

-v 详细过程 -vv -vvv

--list-hosts 显示主机表示 可简写--list

-k, --ask-pass 提示输入ssh连接密码,默认key验证

-K, ask-become-pass 提示输入sudo时的口令

-C, --check 检查并不执行

-T, --timeout=TIMEOUT 执行命令的超时时间,默认10s

-u, --user=Remote_user 以指定的用户访问连接主机

-b, --become 代替旧版的sudo 切换


<host-pattern> 支持的格式

all 表示所有inventory中的所有主机

* 通配符

ansible "*" -m ping 所有主机

ansible 192.168.1.* -m ping 此网段中所有主机

ansible "*srvs" -m ping 后缀为srvs组的所有主机

或关系 (是属于webser或属于appser的机器都会执行)

ansible "webser: appser" -m ping

ansible "192.168.1.10:192.168.1.20" -m ping

逻辑与 (只有同时属于webser和appser的机器才会执行)

ansible 'webser:&appser' -m ping


逻辑非 属于webser里的机器但不可以是dbser的机器

ansible 'webser:!dbser' -m ping


综合逻辑 下边的逻辑有点绕

ansible 'webser:dbser:&appser:!ftpser' -m ping

[(属于webser或dbser的机器)并且属于appser的机器]但不属于ftpser的机器


正则表达式

ansible '~(web|app)ser' -m ping

~表示后边是正则


ansible-galaxy 命令

此命令是可以从互联网上下载一些别人已经写好的roles来供自己的服务器使用

roles的使用和作用后边会有说明

ansible-galaxy list 列出已经安装的galaxy

ansible-galaxy instal project.name

ansible-galaxy remove project.name


ansible-playbook 用来执行写好的yml文件


ansible-vault 管理加密解密用的文件

ansible-vault [create|decrypt|edit|encrypt|rekey|view] name.yml


ansible-console 交互式执行接口



ansible命令执行过程

1.加载自己的配置文件 默认/etc/ansible/ansible.cfg

2.加载自己对应的模块文件,如command

3.通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行

用户$HOME/.ansible/tmp/ansible-tmp-DIGIT/XXX.py文件

4.给文件+x权限

5.执行并返回结果

6.删除临时py文件,sleep 0退出


执行状态(ansible.cfg中有对其定义,可查看)

绿色 执行成功并且不需要做改变的操作

××× 执行成功并且对目标主机做变更

红色 执行失败



ansible常用模块

command 在远程主机执行命令,默认模块,可忽略-m选项

ansible servs -m command -a 'service vsftpd start'

ansible servs -m command -a 'echo pass | passwd --stdin admin' (不成功)

此命令不支持$VAR < > | ; &等,用shell模块实现


shell 和command相似,用shell执行命令

ansible srv -m shell -a 'echo pass| passwd --stdin admin'

调用bash执行命令 类似

caat /tmp/stanley.md|awk -F '|' '{print $1,$2}' &>/tmp/examp.txt

这样的复杂命令,即使使用shell也可能会失败,解决方法,写到脚本里,copy到

远程,执行,再把需要的结果拉回执行命令的机器


script 运行脚本(脚本是本地的路径)

ansible webser -m script -a /path/script.sh

ansible appser -m script -a ./matrix.sh


copy 复制本地文件至目标主机 (有了此命令就可以复制pub kye至目标主机)

ansible all -m copy -a 'src=/root/class/matrix.sh 

dest=/home/admin/test.sh mode=770' (此为一条命令)


利用内容可直接向目标机器生成此文件

ansible all -m copy -a "content='echo It is a test\n' dest=~/test2.sh"


fetch 从客户端取文件至控制端,与copy相反,目录可先tar

ansible all -m fetch -a 'src=~/test2.sh dest=~/hostdata'

取过来的文件会自创建目标IP目录


file 设置文件属性

(Choices: absent, directory, file, hard, link, touch)[Default: file]

absent就是删除的意思 其它的好理解 

ansible all -m file -a 'path=~/test1 state=touch'

ansible all -m file -a 'src=~/test1 dest=~/test1.link state=link'

ansible all -m file -a 'path=~/test1 state=absent'

(src只用来创建连接文件时使用)


综合练习使用ansible将控制端的公钥放到目标主机相应目录实现至于key验证通信

ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''

ansible all -m shell -a 'ls -ld ~/.ssh'

ansible all -m file -a 'path=~/.ssh state=directory mode=700'

ansible all -m copy -a 'src=~/.ssh/id_rsa.pub dest=~/.ssh/authorized_keys

mode=600'


hostname 管理主机名

ansible node1 -m hostnam -a 'name=webSRV'


cron 计划任务

支持时间 minute, hour, day, mounth, weekday

ansible all -m cron -a "minute=*/2 job='/usr/sbin/ntpdate 192.168.48.201

&> /dev/null' name=Synctime"


ansible all -m cron -a 'name=Synctime state=absent'

ansible all -m cron -a 'minute=*/5 job="/usr/bin/ntpdate 172.20.0.1 &> 

/dev/null" '


yum 管理包 

ansible all -m yum -a "name=httpd"

ansible all -m yum -a "name=httpd state=absent"


service 管理服务

ansible srv -m service -a 'name=httpd state=stopped'

ansible srv -m service -a 'name=htppd state=started'

ansible srv -m service -a 'name=httpd state=reloaded'

ansible srv -m service -a 'name=httpd state=restarted'


user 管理用户

ansible srv -m user -a 'name=user1 uid=1024 home=/app/data group=root'

ansible srv -m user -a 'name=user2 system=yes'

ansible srv -m user -a 'name=user1,user2 state=absent remove=yes'


group 管理组

ansible srv -m group -a 'name=testgroup system=yes'

ansible srv -m group -a 'name=testgroup state=absent'


总结

复制文件至远端时,如果目标主机已存在则会覆盖,再次执行时如果检查checksum相同

则不会再次复制,远程复制key时如果主机不存在.ssh文件夹创建时其目录的权限是700

密钥文件是600


猜你喜欢

转载自blog.51cto.com/winthcloud/2283624