作为一个进阶话题,Ansible不止支持SSH来远程连接.连接方式是插件化的而且还有许多本地化管理的选项诸如管理 chroot, lxc, 和 jail containers.一个叫做‘ansible-pull’的模式能够反转主控关系并使远程系统通过定期从中央git目录检出 并 拉取 配置指令来实现背景连接通信
第一条命令(公钥认证)我们已经安装ansible了,第一件事就是编辑或者创建/etc/ansible/hosts并在其中加入一个或多个远程系统,我们的public SSH key必须在这些系统的authorized_keys中.
# 我们现在ansible控制机上主机名解析 tail /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 121.36.43.223 node1 120.77.248.31 node2 116.196.83.113 master # 将解析过的主机名放到ansible配置文件里面 tail -2 /etc/ansible/hosts node1 node2 # ansible控制机生成公钥并传给需要被控制的机器上 ssh-copy-id node1 ssh-copy-id node2 # 因为考虑到安全问题,会有主机秘钥的检查,但如果在内网非常信任的服务器就没必要了. sed -i 's/# *StrictHostKeyChecking *ask/StrictHostKeyChecking no/g' /etc/ssh/ssh_config # 然后我们就可以执行第一条命令来查看能ping通控制的所有节点. ansible all -m ping node1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } node2 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }Ansible会像SSH那样试图用你的当前用户名来连接你的远程机器.要覆写远程用户名,只需使用’-u’参数. 如果你想访问 sudo模式,这里也有标识(flags)来实现:
ansible all -m ping -u bruce ansible all -m ping -u bruce --sudo ansible all -m ping -u bruce --sudo --sudo-user batman(如果你碰巧想要使用其他sudo的实现方式,你可以通过修改Ansible的配置文件来实现.也可以通过传递标识给sudo(如-H)来设置.) 现在对你的所有节点运行一个命令:
ansible all -a "/bin/echo hello" node1 | CHANGED | rc=0 >> hello node2 | CHANGED | rc=0 >> hello公钥认证
Ansible1.2.1及其之后的版本都会默认启用公钥认证
如果有个主机重新安装并在“known_hosts”中有了不同的key,这会提示一个错误信息直到被纠正为止.在使用Ansible时,你可能不想遇到这样的情况:如果有个主机没有在“known_hosts”中被初始化将会导致在交互使用Ansible或定时执行Ansible时对key信息的确认提示.
如果你想禁用此项行为并明白其含义,你能够通过编辑 /etc/ansible/ansible.cfg or ~/.ansible.cfg来实现:
[defaults] host_key_checking = False同样注意在paramiko 模式中 公钥认证 相当的慢.因此,当使用这项特性时,切换至’SSH’是推荐做法.
密码认证因为我们接下来要将存取的密码放到主机清单甚至存到Mysql里面,我们可以装一个ssh_pass
apt-get install sshpass我们将之前的公钥.ssh目录都删掉,主机名解析不用管.
注意,删除.ssh目录过后记得关闭主机秘钥检查.
tail -3 /etc/hosts 121.36.43.223 node1 120.77.248.31 node2 116.196.83.113 master tail -2 /etc/ansible/hosts node1 node2 ansible all -m ping -k # 并不是真的ping,只是检查客户端的22号端口是否提供工作.不指定用户默认root用户 # -k 输入密码 # -m 指定模块 SSH password: node1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } node2 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } # 如果不想指定用户名和密码,避免ansible每次执行到相应主机都会要求输入密码. tail -2 /etc/ansible/hosts node1 ansible_ssh_user='root' ansible_ssh_pass='youmen' node2 ansible_ssh_user='root' ansible_ssh_pass='youmen' ansible_ssh_port=22 ansible all -m ping node1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } node2 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } Ansible常用模块 常用模块块
模块名 作用 用例command 默认模块 ansible webserver -a "/sbin/reboot" -f 10
shell 执行shell命令 ansible test -m shell -a "echo $HOSTNAME"
filetransfer 文件传输 ansible test -m copy -a "src=http://www.likecs.com/etc/hosts dest=http://www.likecs.com/tmp/hosts"
managingpackages 管理软件包 ansible test -m yum -a "name=nginx state=present"
user and groups 用户和组 ansible test -m user -a "name=jeson password=123456"
Deploying 部署模块 ansible test -m git -a "repo=https://github.com/iopsgroup/imoocc dest=http://www.likecs.com/opt/iops version=HEAD"
managingservices 服务管理 ansible test -m service -a "name=nginx state=started"
BackgroundOperatiions 后台运行 ansible test -B 3600 -a "/usr/bin/running_operation --do-stuff"
gatheringfacts 搜集系统信息 ansible test -m setup
playbook