Ansible Inventory
-
Inventory文件位置定义
# ANSIBLE_HOSTS环境变量 exporter ANSIBLE_HOSTS=/etc/ansible/hosts # ansibele.cfg内部指定 inventory = /etc/ansible/hosts # 运行ansible或ansible-playbook用-i参数指定 ansible -i hosts ... ansible-playbook -i hosts ...
-
定义主机和主机组
# 主机定义,使用inventory内置变量定义ssh登陆密码 1 172.17.42.101 ansible_ssh_pass ='123456' 2 172.17.42.102 ansible_ssh_pass ='123456' # 定义组docker,下面四台机器172.12.42.101~172.12.42.103 3 [docker] 4 172.17.42.10[1:3] # 针对docker组,使用inventory内置变量定义了ssh登陆密码 5 [docker:vars] 6 ansible_ssh_pass ='123456' # 定义了一个组ansible,包含docker组 7 [ansible:children] 8 docker
-
多个inventory文件
修改ANSIBLE_HOSTS环境变量或者修改ansible.cfg,此时使用目录即可,目录下可以存放不同主机 测试下来,必须放到inventory目录下;或者放在playbook目录下,-i指定
# ANSIBLE_HOSTS环境变量 exporter ANSIBLE_HOSTS=/root/inventory # ansibele.cfg内部指定 inventory = /root/inventory
比如:
[root@Master ~ ]# cat inventory/hosts 172.17.42.101 ansible_ssh_pass ='123456' 172.17.42.102 ansible_ssh_pass ='123456' [root@Master ~ ]# cat inventory/docker [docker] 172.17.42.10[1:3] [docker:vars] ansible_ssh__pass ='123456' [ansible:children) docker
-
动态inventory
将ansible.cfg配置文件中inventory定义成一个脚本即可. 该脚本必须支持2个参数:–list、–host
或 运行ansible、ansible-playbook命令是-i + 脚本名字.#!/usr/bin/python # 必须加上,否则会被解析为ini文本 # coding:utf-8 ''' 动态inventory: a) 需要支持两个参数,--list(返回组包含的主机列表hosts、主机组变量vars、子组列表children、_meta存放主机变量) ''' import json import sys def groups(): '''groups信息:包含主机列表,组变量,子组等信息''' host_list = ["172.22.12." + str(i) for i in range(11,14)] r = dict() r['docker'] = {'hosts':host_list[0:1]} r['web'] = {'hosts':host_list[1:]} print json.dumps(r, indent=4) def hosts(name): '''hosts信息:包含主机变量''' host_var = { "172.22.12.11":{"ansible_ssh_port":21}, "172.22.12.12":{"ansible_ssh_port":22}, "172.22.12.13":{"ansible_ssh_port":23} }.get(name) print json.dumps(host_var, indent=4) def main(): if len(sys.argv) == 2 and sys.argv[1] == "--list": groups() elif len(sys.argv) == 3 and sys.argv[1] == "--host": hosts(sys.argv[2]) else: print "Usage: {} --list or --host <hostname>".format(sys.argv[0]) if __name__ == "__main__": main() ```
-
Inventory参数说明
变量 说明 ansible_ssh_host 将要连接的远程主机名. ansible_ssh_port ssh端口号 ansible_ssh_user ssh用户名 ansible_ssh_pass ssh密码,建议使用–ask-pass或ssh密钥 ansible_sudo_pass sudo密码,建议使用–ask-sudo-pass ansible_sudo_exe sudo命令路径(适用V1.8及以上) ansible_connection 与主机连接的类型,比如 local、ssh、paramiko;ansible以前默认使用paramiko,以后默认使用 ‘smart’,‘smart’ 方式会根据是否支持 ControlPersist, 来判断’ssh’ 方式是否可行 ansible_ssh_private_key_file ssh使用的私钥文件 ansible_shell_type 目标系统的shell类型,命令的执行使用’sh’语法,可设置为’csh’或’fish’ ansible_python_interpreter 目标主机的python路径 定义主机和组变量的方式:
a) /etc/ansible/group_vars/组名 /etc/ansible/host_vars/主机名
b) /etc/ansible/group_vars/组名/{文件1,文件2} # 文件1、文件2中的变量都可以被加载;环境比较复杂时,这种管理方式更好 -
patterns(匹配执行任务的主机)
下面列举一些常见的匹配条件:all:匹配所有主机 // ansible和ansible-playbook都支持 webservers:dbservers:冒号表示或的关系,表示主机可以存在于多个group中 ansible和ansible-playbook都支持 webservers:!phoenix:表示属于webservers组,不属于phoenix组的主机 ansible-playbook支持 webservers:&staging:交集,表示同时属于webservers和staging组的主机 ansible-playbook支持 webservers:dbservers:&staging:!phoenix:webserver和dbservers两个组中,隶属于staging组,不属于phoenix组的主机 ansible-playbook支持 ~(web|db).*\.example\.com:正则 ansible-playbook支持
Ansible Ad-Hoc命令
ansible-doc -l查看所有自带模块,目前有259个命令
ansible-doc 模块名,查看模块使用方法
-
执行命令
ansible命令是并发执行的,并发数由ansible.cfg中的forks值控制、或者运行命令时通过-f参数指定.
ansible允许异步执行任务,对于执行时间很长的任务,下发任务后每过一段时间轮询获取任务结果.
# 异步任务超时时间为120s 每个-P参数后秒数轮询获取结果,-P + 0 表示不关心任务结果 ansible docker -B 120 -P 0 -m shell -a 'sleep 10;hostname' -f 5 -o
-
复制文件
copy模块批量下发文件,文件变化通过MD5值判断.
ansible docker -m copy -a 'src=hosts.py dest=/root/hosts.py owner=root group