1、Ansible版本之间的区别
Ansible1.3之后的版本,默认情况下会先尝试调用本地的openssh链接,这使得ansible可以拥有一些ssh的特性,比如默认的ssh配置是在~/.ssh/config中。但是在企业版本linux中(红帽企业版6和centos6中)作为控制端时由于本地的openssh版本过于老,所以ansible会调用一个python的模块(paramiko)来完成高效的工作。如果想要使用ssh的一些特性可以使用fedora,os x或者Ubuntu作为控制端,或者可以升级计算机中的软件版本以支持openssh的特性。
Ansible1.2以及以前的版本,默认使用的都是paramiko,如果想要使用本地的ssh,可以使用-c ssh,来显示设置,或者修改配置文件。
-c:后可以添加的类型有ssh\local\smart\paramiko
local:只在本地执行(这里对于playbooks在本地执行,但是对于ping,这里我也还不是很清楚)
smart:默认方式
ssh:应该是调用openssh
paramiko:表示使用paramiko
注意:以上类容由于我没有看到明确的效果,很多是我的猜想。
# ansible 192.168.1.104 -m ping -c ssh --ask-pass -vv
ansible 2.4.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.6.6 (r266:84292, Jul 23 2015, 15:22:56) [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)]
Using /etc/ansible/ansible.cfg as config file
SSH password:
META: ran handlers
192.168.1.104 | SUCCESS => {
"changed": false,
"failed": false,
"ping": "pong"
}
META: ran handlers
META: ran handlers
[root@vp-mysql ~]# ansible 192.168.1.104 -m ping -c paramiko --ask-pass -vv
ansible 2.4.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.6.6 (r266:84292, Jul 23 2015, 15:22:56) [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)]
Using /etc/ansible/ansible.cfg as config file
SSH password:
META: ran handlers
192.168.1.104 | SUCCESS => {
"changed": false,
"failed": false,
"ping": "pong"
}
META: ran handlers
META: ran handlers
[root@vp-mysql ~]# ansible 192.168.1.104 -m ping -c local --ask-pass -vv
ansible 2.4.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.6.6 (r266:84292, Jul 23 2015, 15:22:56) [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)]
Using /etc/ansible/ansible.cfg as config file
SSH password:
META: ran handlers
192.168.1.104 | SUCCESS => {
"changed": false,
"failed": false,
"ping": "pong"
}
META: ran handlers
META: ran handlers
[root@vp-mysql ~]# ansible 192.168.1.104 -m ping -c smart --ask-pass -vv
ansible 2.4.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.6.6 (r266:84292, Jul 23 2015, 15:22:56) [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)]
Using /etc/ansible/ansible.cfg as config file
SSH password:
META: ran handlers
192.168.1.104 | SUCCESS => {
"changed": false,
"failed": false,
"ping": "pong"
}
META: ran handlers
META: ran handlers
偶尔可能会遇到设备不支持SFTP的情况,但是这种情况极其罕见(反正我是没有遇到过),但是如果遇到了也不要慌,SFTP的功能最常用的就是发送数据或者拉取了,但是一般是发送和拉取多,所以我们可以用SCP代替。开启这个功能也很简单,只需要修改/etc/ansible/ansible.cfg中的配置内容:
scp_if_ssh = False
一般不建议修改,虽然SCP最终能达到的效果和SFTP差不多吧。
2、ansible的使用
Ansible和远程主机通信默认使用的是ssh免密登录,如果需要输入密码可以使用--ask-pass,来输入密码,用户名如果没有显示申明的话一般就是当前控制端执行命令的用户,这个特性和ssh登录是一样的。如果需要使用sudo功能可以使用--ask-sudo-pass,后来的版本准备开始弃用--ask-become-pass,所以呢,建议能不实用--ask-sudo-pass就不使用吧(后来的版本如果使用了会有警告提醒,不过也可以通过修改配置修改,取消提醒)
以下由于没有添加公钥在被控端,所以报错了:
# ansible 192.168.1.104 -m ping
192.168.1.104 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n",
"unreachable": true
# ansible 192.168.1.104 -m ping --ask-pass
SSH password:
192.168.1.104 | SUCCESS => {
"changed": false,
"failed": false,
"ping": "pong"
}
--ask-become-pass简单的使用方法如下:
[root@vp-mysql ~]# ansible 192.168.1.104 -a "mkdir /opt/test" -u vperson --ask-become-pass -b --become-user root
SUDO password:
[WARNING]: Consider using file module with state=directory rather than running mkdir
192.168.1.104 | SUCCESS | rc=0 >>
[root@vp-mysql ~]# ansible 192.168.1.104 -a "mkdir /opt/test" -u vperson --ask-pass
SSH password:
[WARNING]: Consider using file module with state=directory rather than running mkdir
192.168.1.104 | FAILED | rc=1 >>
mkdir: 无法创建目录"/opt/test": 文件已存在non-zero return code
但是这里有一点要注意了,centos 6 上的系统装完后新建的普通用户默认是没有sudo权限的,需要通过修改配置文件/etc/sudoers 来开启sudo权限。
以下内容可以参考使用:
# as bruce
$ ansible all -m ping -u bruce
# as bruce, sudoing to root
$ ansible all -m ping -u bruce --sudo
# as bruce, sudoing to batman
$ ansible all -m ping -u bruce --sudo --sudo-user batman
# With latest version of ansible `sudo` is deprecated so use become
# as bruce, sudoing to root
$ ansible all -m ping -u bruce -b
# as bruce, sudoing to batman
$ ansible all -m ping -u bruce -b --become-user batman
前面都着急讲简单的使用了,忘记说配置文件的事情了,下面开始讲配置文件。
3、Ansible配置文件
Ansible默认配置文件所在位置为:/etc/ansible/下面。
# tree .
.
├── ansible.cfg
├── hosts
└── roles
目录结构如上其中主配置文件是ansible.cfg,而hosts只不过是ansible.cfg中默认指定的:
#inventory = /etc/ansible/hosts
前面说的sftp改成scp也在这里面修改:
#scp_if_ssh = smart
还有默认的ssh端口:
#remote_port = 22
4、通过修改hosts来实现对远程主机的控制
Ansible默认被控主机需要被添加到hosts中,所以我上面的所有操作,都必须先把主机加入hosts中。
#cat /etc/ansible/hosts
192.168.1.104
192.168.1.106
192.168.1.105
这里我学习的过程中发现,后续的playbooks文件中的主机默认也是以hosts文件的主机为主。
如果主机中的密钥对有很多,可以使用参数--private-key,来指定私钥:
先把公钥拷贝到被控端:
# ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 22 root@192.168.1.104"
[root@vp-mysql ansible]# ssh 192.168.1.104
Last login: Thu Dec 21 05:57:06 2017 from 192.168.1.110
[root@vp-proxy ~]# exit
logout
Connection to 192.168.1.104 closed.
把私钥移动加家目录下:
[root@vp-mysql ansible]# cd
[root@vp-mysql ~]# cd .ssh/
[root@vp-mysql .ssh]# ls
id_rsa id_rsa.pub known_hosts
[root@vp-mysql .ssh]# mv id_rsa ../
[root@vp-mysql .ssh]# !ssh
ssh 192.168.1.104
root@192.168.1.104's password:
从上面的结果来看我们再次登录需要输入对端的密码
下面看看使用参数后的效果:
[root@vp-mysql .ssh]# ansible 192.168.1.104 -m ping
192.168.1.104 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n",
"unreachable": true
}
[root@vp-mysql .ssh]# ansible 192.168.1.104 -m ping --private-key /root/id_rsa
192.168.1.104 | SUCCESS => {
"changed": false,
"failed": false,
"ping": "pong"
}
5、总结
Ansible总体来说各个版本之间的区别在使用过程中可能会有一点点的不一样,但是其实原理都是差不多,掌握原理可以让我们在遇到问题可以更加快速的排错。还有paramiko和源生的ssh是有区别的,paramiko中还有提供一个长连接的demo,可以去玩一下,就会发现他有很多问题。反正能用源生的尽量用源生的吧,稳定。