Ansible原理和安装,Ansible原理安装


原理

远程执行实现原理
现在站在 ansible 的作者的立场,我们的典型实用场景是远程执行命令。那 playbook 怎么弄?playbook 从实现上说,可以执行完一个命令后自动执行下一个命令,外加处理一些逻辑,比如错误处理,重试等。所以先搞定远程执行命令,playbook的执行就水到渠成。

Ansible 最引以为豪的是 agentless 架构,不用在目标主机上安装任何agent,只要能 ssh 连接到目标主机,并且目标主机上已经安装了 python 解释器,Ansible 就能工作。面对这样的需求,Ansible 的作者 Michael DeHaan 是这么想得(其实是 gtt 乱猜的):

根据参数生成一个 python 脚本,接着通过 ssh 此脚本 copy 到目标主机上,再用 python 执行脚本,最后打扫战场走人。

这里的 python 脚本在 Ansible 中叫做 module,即预先定的一些逻辑,比如 apt module,将所有需要修改的地方以参数的形式传入到 module 中,可以通过直接修改 module 源代码或者传入参数的方法搞定。比如 ansible -m apt -a “name=git” 这行命令就可以解析成:将参数 name=git 传入到 apt module中,然后执行 apt module。

具体看 apt module 的代码,源代码位于:https://github.com/ansible/ansible-modules-core/blob/stable-1.9/packaging/os/apt.py

这个文件类似一个脚本文件,入口函数 main() 解析了传入的参数 name=git ,解析完成开始执行业务逻辑。

def main():
    module = AnsibleModule(
        argument_spec = dict(
            state = dict(default='present', choices=['installed', 'latest', 'removed', 'absent', 'present', 'build-dep']),
            ...
        ),
    )
    p = module.params
    ...
    if p['state'] in ('latest', 'present', 'build-dep'):
        ### 拼接出类似 "apt-get install %(pacakges)s" 的命令,然后执行它。
        result = install(module, packages, cache, upgrade=state_upgrade,
                default_release=p['default_release'],
                install_recommends=install_recommends,
                force=force_yes, dpkg_options=dpkg_options,
                build_dep=state_builddep)
        (success, retvals) = result
        if success:
            module.exit_json(**retvals)
        else:
            module.fail_json(**retvals)
    ...

if __name__ == "__main__":
    main()

有了 module 之后,Ansible 就通过 ssh 通道,将文件内容 copy 到目标主机上,存放在用户家目录下(这个路径是可以配置的),比如 gtt 测试时用的是 ubuntu 用户,Ansible 就创建了一个路径为/home/ubuntu/.ansible/tmp/ansible-tmp-1486872622.14-192988328438393 的目录,里面放每一个 task 的 module 源代码,执行每个 module 就是执行一个 python 脚本。当 python 脚本执行完后删除这个目录,不留一丝痕迹,深藏功与名。

原文:https://www.gaott.info/dive-into-ansible-source-code/

安装

1.安装

[root@localhost ~]# git clone git://github.com/ansible/ansible.git --recursive
[root@localhost ~]# cd ansible/
[root@localhost ~]# cd hacking/
[root@localhost ~]# source ./env-setup
[root@localhost ~]# ansible --version

2.编辑hosts文件,默认没有这个文件,自己创建

[root@localhost ~]# vim /etc/ansible/hosts
[test]
172.16.0.112

3.配置ssh无密码登录

[root@localhost ~]# ssh-keygen
[root@localhost ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.168.0.112

4.尝试几条操作

[root@localhost ~]# ansible all -m ping
[root@localhost ~]# ansible test  -m ping   test是主机组
[root@localhost ~]# ansible constrol -m command -a 'date'
[root@localhost ~]# ansible all -a "/bin/echo hello"
[root@localhost ~]# ansible test -a "/usr/bin/python" -u root
[root@localhost ~]# ansible test -m shell -a "echo $TERM" 
[root@localhost ~]# ansible 172.16.0.112 -m copy -a “src=/etc/hosts dest=/tmp/hosts"
[root@localhost ~]# ansible 172.16.0.112 -m file -a "dest=/tmp/hosts mode=777"

参考链接:
http://www.ansible.com.cn/index.html

相关内容

    暂无相关文章