02 . Ansible高级用法(运维开发篇) (2)

作为一个进阶话题,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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjydf.html