一、ansible inventory
配置要管理主机的信息。指定inventory的方式。
- 默认是一个静态的INI格式的文件/etc/ansible/hosts。
- 通过ANSIBLE_HOSTS环境变量指定。
- 运行ansible和ansible-playbook时用-i参数临时设置。
1、定义主机和主机组
172.17.42.101 ansible_ssh_pass=‘123456’
172.17.42.102 ansible_ssh_pass=‘123456’
[docker]
172.17.42.10[1:3]
[docker:vars]
ansible_ssh_pass='123456'#是ansible Inventory内置参数
[ansible:children]#定义了一个组叫ansible,其中包含docker组
docker
#分别针对不同的主机和主机组进行ansible的ping模块检测
ansible 172.17.42.101:172.17.42.102 -m ping -o
ansible docker -m ping
ansible ansible -m ping
2、多个Inventory列表
Ansible还支持多个Inventory文件,可以方便管理不同业务或者不同环境的机器。
使用方法:
- 修改ansible.cfg中hosts文件的定义,或者使用ANSIBLE_HOSTS环境变量定义
- 创建一个文件夹,里面存放多个inventory文件。
inventory/
|-docker
|-hosts
cat inventory/hosts
172.17.4.101 ansible_ssh_pass='123456'
172.17.4.101 ansible_ssh_pass='123456'
cat inventory/docker
[docker]
172.17.42.10[1:3]
[ansible:vars]
ansible_ssh_pass='123456'
[ansible:children]
docker
vim ansible.cfg
inventory = /root/inventory/
ansible 172.17.42.101:172.17.17.42.102 --list-hosts
ansible docker --list-hosts
ansible ansible --list-hosts
3、动态inventory
引用动态inventory配置,把ansible.cfg文件中的inventory的定义值改成一个执行脚本。
脚本可以是任何语言,脚本的使用参数和脚本的执行结果有要求。脚本需要支持两个参数:
- –list或者-L,显示所有主机以及主机组的信息.(JSON)
- –host或者-H,这个参数后需指定一个host,运行结果会返回这台主机的所有信息。(JSON)
vim hosts.py
import argparse,sys,json
def lists():
r = {}#创建一个字典
h = ['172.17.42.10' + str(i) for i in range(1,4)]#创建一个主机list
hosts = {'hosts':h}#把这个list放入字典
r['docker'] = hosts#把这个字典放入list
return json.dumps(r,indent=4)
def hosts(name):
r = {'ansible_ssh_pass':'123456'}
cpis=dict(r.items())
return json.dumps(cpis)
parser = argparse.ArgumentParser()
parser.add_argument('-l','--list',help='hosts list',action='store_true')
parser.add_argument('-H','--host',help='hosts vars')
args = vars(parser.parse_args())
if args['list']:
print(lists())
elif args['host']:
print(hosts(args['host']))
else:
parser.print_help()
运行测试
#运行python脚本
python hosts.py --list
python hosts.py -H 172.17.42.102
#运行ansible指定inventory动态脚本文件
ansible -i hosts.py 172.17.42.102:172.17.42.103 -m ping -o
4、inventory内置参数
二、ansible AD-Hoc
Ansible自带259个模块,使用ansible-doc -l显示所有自带模块。使用ansible-doc 模块名查看模块的介绍及案例。使用Ad-Hoc命令,ansible的facts,lookup插件无法使用。
1、执行命令
默认的并发数由ansib.cfg的forks值来控制。
也可以使用-f参数指定并发数。
也可以使用Ansible异步执行功能。
ansible docker -a 'hostname' -o
ansible docker -a 'uname -r' -f 5 -o#-f并发数为5,-o在一行内显示
#-P 0的情况下回直接返回job_id,然后针对主机根据job_id查询执行结果,(在后台运行)
ansible docker -B 120 -P 0 -a 'sleep 10;hostname' -f 5 -o
......'ansible_job_id':'404114810096.2386'......
#通过async_status模块查看异步任务的状态和结果
ansible 172.17.42.101 -m async_status -a 'jid=404114810096.2386'
#当-P参数大于0时,absible会自动根据job_id去轮询查询执行结果(前台运行)
ansible docker -B 12 -P 1 -m shell -a 'sleep 5;hostname' -f 5 -o
2、复制文件
使用copy模块来批量下发文件,文件的额变化通过MD5值来判断。
ansible docker -m copy -a 'src=hosts.py dest=/root/hosts.py owner=root group=root mode=644 backup=yes' -o
#验证文件下发功能
ansible docker -m shell -a 'md5sum /root/hosts.py' -f 5 -o
3、包和服务管理
#yum安装包,版本为最新,也可以是正常版本state=present
ansible docker -m yum -a 'name=httpd state=latest' -f 5 -o
#服务的启动
ansible docker -m service -a 'name=httpd state=started' -f 5 -o
#查看已经安装的包的版本
ansible dcoker -m shell -a 'rpm -qa httpd' -f 5 -o
#验证服务运行情况
ansible docker -m shell -a 'netstat -tpln|grep httpd' -f 5
4、用户管理
使用user模块批量新建用户:
#首先用openssl生成一个密码
echo ansible | openssl passwd -1 -stdin
#然后新建用户
ansible docker -m user -a 'name=shencan password="$1$f.Y3hZWM$gzZkwHYiG6IUQKC9wkPJU1"' -f 5 -o
#验证
ssh 172.17.42.103 -l shencan
三、Ansible playbook
Ad-Hoc命令能完成基本配置管理工作,在实际使用时其实大部分时间都是在编写playbook。
四、Ansible facts
facts组件是Ansible用于采集被管理机器设备信息的一个功能,我们可以使用setup模块查看机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在json格式中,最上层的值是ansible_facts。
ansible 172.17.42.101 -m setup
"ansible_facts":{......
}......
#值查看指定信息
ansible 172.17.42.101 -m setup -a 'filter=ansible_all_ipv4_addresses'
1、使用facter扩展facts信息
#查看是否安装
ansible 172.17.42.101 -m shell -a 'rpm -qa facter'
#运行facter模块查看facter信息
ansible 172.17.42.101 -m facter
#直接运行setup模块也会采集facter信息,所有的facter信息以facter_开头
ansible 172.17.42.101 -m facter
2、使用ohai扩展facts信息
ohai是Chef配置管理工具中检测节点属性的工具,ansible的facts也支持ohai信息的采集。需要被管理及其上安装ohai包。
#安装包
gem install ohai
ansible 172.17.42.1 -m shell -a 'gem list|grep ohai'
#直接运行ohai模块查看其属性
ansible 172.17.42.1 -m ohai
#直接娙setup模块,也会采集ohai信息
ansible 172.17.42.1 -m setup
五、Ansible role
这个role用来配置部署nginx服务。role所有文件都在nginx目录下。
- site.yaml是role引用的入口文件,文件名可随意。
- files目录里面放一些静态文件,比如页面主页。
- handlers目录翻了task的handler。
- task目录下是task。
- templates目录下放jinja2模板文件。
- vars目录下存放着变量文件。
cat site.yaml
---
- hosts: 192.168.198.101
roles:
- {role: nginx, version: 1.0.15}
cat roles/nginx/tasks/main.yaml
---
- name: Install nginx package
yum: name=nginx-{{ version }} state=present
- name: Copy nginx.conf Template
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf owner=root group=root backup=yes mode=0644
notify: restart nginx
- name:Copy index.html
copy: src=index.html dest=/usr/share/nginx/html/index.html
owner=root group=root backup=yes mode=0644
- name: make sure nginx service running
service: name=nginx state=started
cat roles/nginx/handlers/main.yaml
---
- name: restart nginx
service: name=nginx state=restarted
cat roles/nginx/templates/nginx.conf.j2|grep '\{{'
worker_processes {{ ansible_processesor_cores }};
cat roles/nginx/files/index.html
hello kugou
#执行这个role
ansible-playbook -i /root/hosts site.yaml
#curlnginx测试
curl 192.168.198.101
六、Ansible Galaxy
Galaxy是Ansible官方一个分享role的功能平台。可以把自己编写好的role上传,也可以下载。
也可以从github上下载role。在我们使用ansible-galaxy命令下载role时候,要了解role的运行平台和ansible依赖版本以及相关依赖。
#默认安装到/etc/ansible/roles目录下,引用方式和自己写的一样
ansible-galaxy install
七、本章小结
了解了ansible常用的组件。