1. 配置文件ansible.cfg
1.1 配置文件使用
-
ansible.cfg配置文件是以ini格式存储配置数据的
-
ansible.cfg配置文件可以存放在不同的目录,但只有一个可用,在运行Ansible命令时,Ansible将会按照预先设定的顺序查找配置文件
-
ansible配置文件查找顺序(从上至下,先找到哪个文件就用哪个文件)
ANSIBLE_CONFIG:首先,Ansible命令会检查环境变量,及这个环境变量将指向的配置文件 ./ansible.cfg:其次,将会检查当前目录下的ansible.cfg配置文件 ~/.ansible.cfg:然后,将会检查当前用户home目录下的.ansible.cfg配置文件 /etc/ansible/ansible.cfg:最后,将会检查在用软件包管理工具安装Ansible时自动产生的配置文
-
建议使用~/.ansible.cfg作为配置文件,这样就可以实现每个用户都有自己独自的配置文件,不污染其它用户正常使用Ansible,同时也方便进行选项配置
-
几乎所有的配置项都可以通过Ansible的playbook或环境变量来重新赋值
1.2 配置文件内容(修改配置后不需要重启ansible)
[root@node1 ansible]# cat ansible.cfg | grep ^[^#]
[defaults] #定义常规默认的配置,如:定义文件路径、设置并发连接数、设置sudo用户、是否开启sudo功能等等
#inventory = /etc/ansible/hosts #被控端的主机列表文件
#library = /usr/share/my_modules/ #模块文件存放路径
#remote_tmp = ~/.ansible/tmp #临时py命令存放在远程主机目录
#local_tmp = ~/.ansible/tmp #管理节点临时文件存放目录
#forks = 5 #默认开启的并发数
#poll_interval = 15 #默认轮询时间间隔(单位秒)
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行ansible命令是否提示输入sudo密码
#ask_pass = True #是否提示输入密码
#transport = smart #远程传输模式
#remote_port = 22 #默认远程主机的端口号
#module_lang = C #模块运行默认语言环境
#gathering = implicit #facts信息收集开关定义 smart|implicit|explicit
roles_path = /etc/ansible/roles:/usr/share/ansible/roles #指定role存放路径
#timeout = 10 #SSH连接超时时间
#remote_user = root #ansible远程认证用户
host_key_checking = False # 检查对应服务器的host_key,建议取消此行注释,实现第一次连接自动信任目标主机
log_path = /var/log/ansible.log #ansible日志记录文件,建议启用
#module_name = command #ansible默认执行模块command,可以改成module_name = shell,这样默认的模块就是 shell 模块了
#executable = /bin/sh #ansible命令执行shell为/bin/sh
#hash_behaviour = replace #ansible主机变量重复处理方式replace(默认)|merge
#默认情况下,角色中的变量将在全局变量范围中可见。
#为了防止这种情况,可以启用以下选项,只有tasks的任务和handlers得任务可以看到角色变量
#private_role_vars = yes
#vault_password_file = /path/to/vault_password_file #指定vault密码文件路径
#ansible_managed = Ansible managed #定义的一个Jinja2变量,可以插入到Ansible配置模版系统生成的文件中
#display_skipped_hosts = True #开启显示跳过的主机
#error_on_undefined_vars = False #开启错误,或者没有定义的变量
# set plugin path directories here, separate with colons #设置相关插件路径,使用‘:’分割多个路径
#action_plugins = /usr/share/ansible/plugins/action
#cache_plugins = /usr/share/ansible/plugins/cache
#callback_plugins = /usr/share/ansible/plugins/callback
#connection_plugins = /usr/share/ansible/plugins/connection
#lookup_plugins = /usr/share/ansible/plugins/lookup
#inventory_plugins = /usr/share/ansible/plugins/inventory
#vars_plugins = /usr/share/ansible/plugins/vars
#filter_plugins = /usr/share/ansible/plugins/filter
#test_plugins = /usr/share/ansible/plugins/test
#terminal_plugins = /usr/share/ansible/plugins/terminal
#strategy_plugins = /usr/share/ansible/plugins/strategy
#fact_caching = memory #定义ansible facts缓存方式memory
#fact_caching_connection=/tmp #定义ansible facts缓存路径/tmp
[inventory] #设置插件及可忽略的文件格式
[privilege_escalation] #用户权限类的设定,如:sudo、是否启用sudo密码
[paramiko_connection] #不记录遇到的新主机密钥、增加新主机的性能
[ssh_connection] #对SSH连接的一些配置,配置项比较少
[persistent_connection] #主要就两个选项,连接超时、命令超时
[accelerate] #连接加速的相关配置
[selinux] #selinux相关配置,基本不会涉及
[colors] #设置输出颜色,最好默认
[diff] #输出打印是是否打印diff
2. 主机清单 inventory
inventory:资源清单,在大规模的配置管理工作中,特别是云服务提供商或者IDC厂家,需要管理不同业务的不同机器,这些机器的信息都存放在Ansible的inventory组件里面。
在我们使用Ansible进行远程主机管理时,必须先将主机信息存放在inventory里面,这样才能使用Ansible对它进行操作。默认情况下,Ansible的inventory是一个静态的INI格式的文件,可以通过在配置文件中的inventory选项,进行相关设置。
当然了,我们还可以通过ANSIBLE_HOSTS环境变量指定或者运行ansible和ansible-playbook的时候用-i参数临时设置。
ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分
组命名
默认的 inventory file 为 /etc/ansible/hosts
inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成
注意: 生产建议在每个项目目录下创建项目独立的hosts文件
官方文档
https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
主机清单文件格式
inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组
中
此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明
如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机
Inventory 参数说明
header 1 | header 2 |
---|---|
ansible_ssh_host | 将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置. |
ansible_ssh_port | ssh端口号.如果不是默认的端口号,通过此变量设置.这种可以使用 ip:端口 如:192.168.1.100:2222 |
ansible_ssh_user | 默认的 ssh 用户名 |
ansible_ssh_pass | ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥) |
ansible_sudo_pass | sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass) |
ansible_sudo_exe (new in version 1.8) | sudo 命令路径(适用于1.8及以上版本) |
ansible_connection | 与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 ‘smart’,‘smart’ 方式会根据是否支持 ControlPersist, 来 判断’ssh’ 方式是否可行. |
ansible_ssh_private_key_file | ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况. |
ansible_shell_type | 目标系统的shell类型.默认情况下,命令的执行使用 ‘sh’ 语法,可设置为’csh’ 或 ‘fish’. |
ansible_python_interpreter | 目标主机的 python 路径.适用于的情况:系统中有多个Python, 或者命令路径不是"/usr/bin/python",比如 *BSD, 或者 /usr/bin/python 不是 2.X 版本的Python.之所以不使用 “/usr/bin/env” 机制,因为这要求远程用户的路径设置正确, 且要求 “python” 可执行程序名不可为python以外的名字(实际有可能名为python26). 与ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径… |
示例
$ cat /etc/ansible/hosts
[test] #组名
172.16.5.201 #IP地址
192.168.0.[100:102] #相当于192.168.0.100,192.168.0.101,192.168.0.102
[nginx]
192.168.11.11
$ ansible -i /etc/ansible/hosts test -u root -m command -a 'ls /home' -k
#-i 指定hosts文件,默认是/etc/ansible/hosts
#test 组名
#-u 指定用户,默认是root用户
#-m 指定模块
#-a 指定模块参数
#-k 用来提示输入远程主机的密码,适用于所有主机密码相同的情况,只会提示一次输入密码
示例
$ cat /tmp/temp
[bidding]
biddingserver1.test.com:8022
biddingserver2.test.com
[rs]
rs1.test.com
rs2.test.com
rs3.test.com
# 或者写成 rs[1:3].test.com
[updateserver]
update[01:07].sun.updateserver.south.com
[qs]
qs-[a:z].south.com
[bidding:vars]
ansible_ssh_pass="noSafeNoWork@2016"
anisble_ssh_user="root"
$ ansible -i /tmp/temp bidding -u root -m shell -a "whoami"
# 简写,默认的host为/etc/ansible/hosts
ansible test -a 'ls /home' -k
我们知道,ansible通过ssh的方式来远程管理多台主机,所以我们需要使用ssh key的方式来进行ssh认证,当然你也可以选择在使用ansible的时候加上-k选项,来通过交互的方式输入密码。有了ssh key之后,我们就可以直接使用ansible进行一些简单的测试,
如下:
测试hosts中所有主机是否存活,如果只想检测某一组,可以将all改为改组的组名
ansible all -m ping
#只检查nginx组的主机是否存活
anbile nginx -m ping
#也可以直接输入被管理主机的ip地址
这个时候,默认使用root进行所有的远程管理,在大多数的情况下,为了安全起见,人们更愿意使用一个普通账号来进行管理,我们可以在所有的被管理机器上创建一个ansible用户,并让其可以使用sudo获取管理员权限,当然在ansible主机上也需要有这么一个用户,并为其生成ssh key,然后通过修改/etc/ansible/ansible.cfg配置文件里的remote_user以使ansible默认使用ansible用户进行管理,然后使用–sudo参数来获取root权限,你也可以通过修改/etc/ansible/ansible.cfg里的remote_port来修改默认的ssh端口
如果多台主机的管理账号各不相同,我们也可以在hosts文件里,分别进行设置,示例如下:
[web]
site01 ansible_ssh_user=root
site02 ansible_ssh_user=daniel
site01-dr ansible_ssh_host=site01.dr ansible_ssh_port=65422
[production]
site01
site02
db01 ansible_ssh_user=fred
ansible_ssh_private_key_file=/home/fred/ssh/id_rsa bastion
#简单说明:
#ansible_ssh_user 用于指定管理远程主机的账号
#ansible_ssh_host 用于指定该管理主机
#ansible_ssh_port 用于指定ssh的端口
#ansible_ssh_private_key_file 指定key文件
#host_key_checking=false 当第一次连接远程主机时,会提示输入yes或者no,跳过此环节
示例:主机组之间可以嵌套,需要使用关键字children
cat /etc/ansible/hosts
[mfs_master]
192.168.0.1
[mfs_logger]
192.168.0.2
[mfs_node]
192.168.0.3
[mfs_chient]
192.168.0.4
[mfs_all:children] # [mfs:children]组里面包含mfs_master组,mfs_logger组,mfs_node组和mfs_chient组
mfs_master
mfs_logger
mfs_node
mfs_chient
# 对mfs组操作
ansible mfs -m ping
# 对mfs组操作
ansible mfs_node -m ping
# 对mfs组操作
ansible mfs_master -m ping
示例
[test]
10.0.0.11 ansible_connection=local # 指定本地连接,无需ssh配置