一、开始使用Ansible
Ansible使用语法
1 |
$ ansible -i /etc/ansible/host all [options] |
其中-i用来指定inventory文件,默认就是使用/etc/ansible/hosts,其中all是针对hosts定义的所有主机执行,这里也可以指定hosts中定义的组名或模式。
[options]
1 2 3 4 5 6 7 8 9 10 11 |
-m:指定模块(默认是command模块) -a:指定模块的参数 -u:指定执行远程主机的用户(默认是root)ansible.cfg中可配置 -k:指定远程主机的密码 -s:以sudo方式运行 -U:sudo到那个用户(默认是root) -f:指定多少个进程并发处理(默认是5) --private-key=/path:指定私钥路径 -T:ssh连接超时时间(默认(10s) -t:日志输出到该目录 -v:显示详细信息 |
开始使用Ansible
1)定义Inventory
Inventory文件用来定义你要管理的主机,其默认位置在/etc/ansible/hosts,如果不保存在默认位置,也可通过-i选项指定。被管理的机器可以通过其IP或域名指定。每个中括号里代表一个分组,其下的机器列表都归属于这个分组,直到出现下一个中括号为止。通常我们按组来执行任务,同一组受控服务器应用相同的配置。一台服务器也可以归属到多个组,以完成多个功能角色的配置。低耦合、模块化,非常灵活!如下定义一个分组[webservers],并给定一台主机。
1 2 |
[test] 10.0.60.143 |
2)执行ansible命令
配置好主机列表之后,就可以开始执行批量任务了。Ansible自带了ping模块,可以测试“管理节点”和和“受控节点”之间的网络联通情况。
Linux服务器均使用SSH进行远程管理,SSH服务是服务器必备组件。Ansible在设计上简化使用成本,在“管理节点”上使用SSH连接“受控节点”。通过创建SSH连接来发送指使并执行,达到配置管理的目的。这样避免了不同版本的操作系统、甚至不同发行版的操作系统下使用Agent带来的兼容性问题。
首先,我们来赶紧体验一下Ansible的强大魅力。使用Ansible来测试“受控节点”的网络联通情况:
1 |
$ ansible -i /etc/ansible/hosts test -u root -m ping -k |
或
1 |
$ ansible test -u root -m ping -k |
输入主机密码后,输出正确信息如下:
1 2 3 4 |
10.0.60.143 | SUCCESS => { "changed": false, "ping": "pong" } |
注意了,如果是第一次使用SSH连接agent端,那么就不能使用-k了,要先进行公钥保存确认。然后再使用-k进行连接。
1 2 3 |
The authenticity of host '10.0.60.100 (10.0.60.100)' can't be established. RSA key fingerprint is c1:d6:20:94:e2:d7:f5:e3:3e:11:6e:10:5f:3a:3f:1c. Are you sure you want to continue connecting (yes/no)? yes |
如果你使用密钥方式登录SSH,去掉-k参数即可。可以为Ansible设置一个特定的用户,所有操作均以此用户来执行。甚至可以为每个“受控节点”设置各自不同的用户。
全局用户的设置见配置文件/etc/ansible/ansible.cfg,修改[defaults]段落里的remote_user的值即可。也可以通过修改remote_port 来定义Ansible去使用非标准的22/SSH 端口来进行连接和管理。在没有给“受控节点”或“受控组”进行特定设置时,Ansible将默认使用全局设置。
二、Inventory格式
Ansible通过读取默认的主机清单配置/etc/ansible/hosts,可以同时连接到多个远程主机上执行任务,默认路径可以通过修改ansible.cfg的hostfile参数指定路径。主机清单配置格式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 指定IP地址并且支持通配; [web01] 192.168.10.1 192.168.10.[1-9] # 指定IP加端口; [web02] 192.168.20.1:5252 # 指定域名,必须可以解析; [web03] www.example.com # 组嵌套,当执行组[weball]时就会执行它的所有子组但是子组可以独立执行; [weball:children] [web01] [web02] [web03] |
另外可以通过设置ansible_ssh_user来用指定用户在“受控节点”上执行任务,还可以通过设置ansible_ssh_host来指定不同的主机或域名,SSH对应的端口也可以通过ansible_ssh_port来修改,同时你还能使用特定的密钥登录。
常用参数如下:
1 2 3 4 5 6 7 8 |
ansible_connection=ssh #指定连接类型,可以使local、ssh、paramiko; ansible_ssh_user=root #用于指定远程主机的账号; ansible_ssh_pass=password #指定连接到主机的密码连-k都省了; ansible_ssh_port=23 #用于指定远程主机SSH端口; ansible_ssh_privare_key_file=/PATH #用于指定key文件; aost_key_checking=false #当第一次连接远程主机,跳过yes/no环节; ansible_shell_type #指定目标系统的shell(默认为sh); ansible_python_interpreter=/ #指定Python解释器路径(默认/USR/BIN/PYTHON); |
我们对上述提到的配置进行示范:
1 2 3 |
[web01] 192.168.10.1 ansible_ssh_user=root 192.168.10.[1] ansible_ssh_pass=password |
可能有些场景下,执行配置管理需要用root权限。但由于安全原因,可能会限制root使用SSH登录。比如:Ubuntu系统默认就不能使用 root 直接SSH登录系统。Ansible设计时也考虑到此类场景,这种情况下我们只需要告诉Ansible使用sudo的方式执行那些需要 root 权限的配置任务。前提条件是执行Ansible任务的用户需要有sudo的权限。要设定Ansible使用sudo,执行Ansible的任务的用户必须要有sudo权限。可以通过修改/etc/sudoers文件或visudo命令来完成,或者直接使用现在符合条件的用户。参数-sudo即告诉Ansible使用sudo来运行任务,如果sudo需要密码,则需要添加-k参数,或者在配置文件/etc/ansible/ansible.cfg中添加ask_sudo_pass的属性。
Ansible使用键值方式接受参数,即传统的KV方式(key=value)。每次执行任务后,将以JSON格式返回结果。它可以解析复杂的参数,或者用playbooks方式(后面会讲解)。Ansible返回会明确指明运行是否成功、是否有变动以及失败时的错信息。
通常都用playbooks的方式来执行Ansible任务,少数情况下使用命令行模式运行。过去,我们用Ansible的ping模块来检查“受控节点”是否正常受控。而实际上,ping模块仅仅执行了Ansible最核心的功能并检查了网络联通性,并未做其它实际性动作。
进而产生了setup模块,它不仅可以反馈“受控节点”的可用性,还会收集一些系统信息以供其它模块使用。Setup 模块定义了一系列的采集指令,比如:内核版本、机器名、IP地址等等,并将这些信息保存在内置变量,其它模块再执行任务时可以直接引用或用于判断条件等。
主机变量和组变量
Inventory除了上述的基本功能外,还可以在主机后面定义变量以便于在playbook中使用,例如:
1 2 3 |
[web01] 192.168.10.1 http_port=80 maxRequest=100 192.168.10.2 http_port=8080 maxRequest=200 |
不光对主机可以定义变量,对组也可以定义变量。组变量是指赋予给组内所有主机,都可以在playbook中使用,格式如下:
1 2 3 |
[web01:vars] http_port01=80 http_port02=8080 |
这就是针对web01组设置的组变量,:vars是固定格式,组内的所有变量都可以给组内的主机使用。
更多模块介绍下一章介绍。