最近公司在做一个自动化压力测试的产品,需要从一个master控制节点自动化地控制各节点,master是centOS,node是windows
ansible官网介绍:
Ansible 是一种安装在控制节点上的无代理自动化工具。Ansible 从控制节点远程管理机器和其他设备(默认情况下,通过 SSH 协议)。
要安装 Ansible 以在命令行中使用,只需在一台机器上安装 Ansible 包(很容易就是一台笔记本电脑)。您不需要安装数据库或运行任何守护程序。Ansible 可以从一个控制节点管理一整套远程机器。
ansible基于python的一些运维工具开发,现在属于RedHat公司管理。
目前要实现的功能是master用ansible从节点中读取一些文件的内容并把内容返回,但是光ping通就花了我一下午。
为了测试ansible我先创建了两个云主机,一个master一个node
安装应该挺简单,因为我们云主机的镜像自带了ansible我就没自己安装。
首先要测试连接吧,我直接ansible all -m ping
结果当然是失败了
然后发现ping的是镜像里面的节点,不是我的另一个云主机,然后我就找到了hosts文件改了ip地址,hosts文件位置在 /etc/ansible/hosts
hosts文件可以是ini格式和YAML格式,还可以分组、设置变量、循环,很复杂的我也没看懂,反正最简单的就是把node节点的地址放上去就完了,具体hosts文件说明:https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#intro-inventory
我只换了一个,还是ping不通,报错如下:
[WARNING]: No python interpreters found for host 192.168.173.48 (tried ['/usr/bin 'python3.6', 'python3.5', 'python2.7', 'python2.6', '/usr/libexec/platform-python 'python']) 192.168.173.48 | FAILED! => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "module_stderr": "Exception calling \"Create\" with \"1\" argument(s): \"At lsiballz_main():\r\n+ ~\r\nAn expression was expected after '(\n+ except (AttributeError, OSError):\r\n+ ~\r\nMis list.\r\nAt line:15 char:7\r\n+ if scriptdir is not None:\r\n+ ~\r\nMi statement.\r\nAt line:22 char:7\r\n+ if sys.version_info < (3,):\r\n+ ' in if statement.\r\nAt line:22 char:30\r\n+ if sys.version_info < (3,):\r\n ~\r\nMissing expression after ','.\r\nAt line:22 char:25\r\n+ if sys.ver ~\r\nThe '<' operator is reserved for future use.\r\nAt linenvoke_module(modlib_path, temp_path, json_params):\r\n+ ent in parameter list.\r\nAt line:28 char:40\r\n+ z = zipfile.ZipFile(mod ~\r\nMissing argument in parameter list.\r\ zinfo = zipfile.ZipInfo()\r\n+ ~\r\nAn exp '('.\r\nAt line:34 char:25\r\n+ z.writestr(zinfo, sitecustomize)\r\n+ nMissing argument in parameter list.\r\nNot all parse errors were reported. Corrd try again.\"\r\nAt line:6 char:1\r\n+ $exec_wrapper = [ScriptBlock]::Create($sp~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n + CategoryInfo : odInvocationException\r\n + FullyQualifiedErrorId : ParseException\r\n \r\nThe pipeline element produced an object that was not valid. It must result in a commck, or a CommandInfo object.\r\nAt line:7 char:2\r\n+ &$exec_wrapper\r\n+ ~~~~~~nfo : InvalidOperation: (:) [], RuntimeException\r\n + FullyQualifiedn ", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1 }
windows节点上是肯定安了python的,机智的我立马看出来是没检测到python文件,然后百度和Google双管齐下,最后信了某些论坛的鬼话,自己加了个配置文件,指定windows节点系统的python路径:
vi /root/.ansible.cfg
在里面加了一条:
ansible_python_interpreter=c : iProgram Files\Python36
然后继续
ansible all -m ping
期间我还进行了更新python版本、检查path路径等操作,都是不行,最后我发现,ansible他娘的根本不支持windows的python用法!
https://docs.ansible.com/ansible/latest/user_guide/windows_faq.html
也就是说,只有列出来的几个命令行可以用,刚才使用的是不能用到windows上面的。
想pingwindows的话,要用
ansible all -i hosts -m win_ping
但是,又出现了问题:
[WARNING]: Unable to parse /root/hosts as an inventory source [WARNING]: No inventory was parsed, only implicit localhost is available [WARNING]: provided hosts list is empty, only localhost is available. Note that t does not match 'all'
没有读取到hosts文件。
又搞了好久才发现是我刚才用vi /root/.ansible.cfg创建的配置文件,覆盖了原来的配置文件,而新的配置文件并没有指明hosts的路径,导致ansible找不到hosts列表了
附配置文件优先级列表:
ansible从上往下扫描,先扫描到哪个就用哪个,默认的地方是最低优先级。
最后终于ping通啦,hello ansible!
总结一下,就是本来只是命令输错了,结果以为配置文件有问题,把配置文件改了,后来用正确的命令也出错了,把配置文件改回来才弄好。
其实啥也没干,但是浪费了一下午。。