1.01 Ansible介绍
- 不需要安装客户端,通过sshd去通信
- 基于模块工作,模块可以由任何语言开发
- 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读
- 安装十分简单,centos上可直接yum安装
- 有提供UI(浏览器图形化)www.ansible.com/tower,收费的
- 官方文档 http://docs.ansible.com/ansible/latest/index.html
- ansible已经被redhat公司收购,它在github上是一个非常受欢迎的开源软件,github地址https://github.com/ansible/ansible
- 一本不错的入门电子书 https://ansible-book.gitbooks.io/ansible-first-book/
1.02 Ansible安装
准备两台机器,前面我们做实验的两台机器cdn001,cdn002
只需要在cdn001上安装ansible
yum list |grep ansible 可以看到自带源里就有2.5版本的ansible
yum install -y ansible ansible-doc
cdn001上生成密钥对 ssh-keygen -t rsa(如果已经有了 可以直接使用)
把公钥放到cdn001和cdn002上,设置密钥认证(因为组里面有两台机器,所以需要将中控机(cdn001)的公钥 分别放到这两台机器上!)
vi /etc/ansible/hosts //增加
[testhost]
127.0.0.1
192.168.60.12
说明: testhost为主机组名字,自定义的。 下面两个ip为组内的机器ip(也可以是主机名)。
[root@Dasoncheng ~]# yum list |grep ansible
ansible.noarch 2.5.0-2.el7 epel
ansible-doc.noarch 2.5.0-2.el7 epel
[root@Dasoncheng ~]# yum install -y ansible ansible-doc
[root@Dasoncheng ~]# cat /root/.ssh/id_rsa.pub ##分别拷贝到cdn001和cdn002
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvriTymkEzNVwubKHBUbQ1aDnY+YIHJhSL5BIWBiMF72Fn4D87+lRK9pWeVH4E4MXTIFBmx8yYcwao0bWJuPFTVQbQlJKd7+RLagkVP6Ds9k1WAc9ByqqNjGwvd6iMIj3xqfvqvo6bH8mlSmQ89qvdDqovQxLlDpRpy5bhX4NG9xuW2Pn/hCpVhLhjBADObapGS/nCgXDjg5+akVRKqM6ycKcb5GKUgE/rl7FGm1czaK/tkOpGvHPx6kvx9bcHo7guxwE3Kbhg39nlU5+YyHdBJg92Pi9ehI7uwPxq8t763I0tyYDloCb/R1rn66uyKKXUP3wl/yIKKRc+BYHOeQBp root@cdn001
[root@Dason02 ~]# vim /root/.ssh/authorized_keys
[root@Dasoncheng ~]# vim .ssh/authorized_keys
[root@Dasoncheng ~]# cat /etc/hosts
……
192.168.60.12 cdn002
[root@Dasoncheng ~]# vim /etc/ansible/hosts
[testhost]
127.0.0.1
192.168.60.12
cdn002
ssh-keygen命令常识:
-b:指定密钥长度;
-f:指定用来保存密钥的文件名;
-t:指定要创建的密钥类型。
1.03 ansible远程执行命令
ansible testhost -m command -a 'w'
这样就可以批量执行命令了。这里的testhost 为主机组名,-m后边是模块名字,-a后面是命令。当然我们也可以直接写一个ip,针对某一台机器来执行命令。
ansible 127.0.0.1 -m command -a 'hostname'
错误: "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"
解决: yum install -y libselinux-python
还有一个模块就是shell同样也可以实现(远程执行shell脚本、也支持命令 还支持管道符"|"--下面有讲)
ansible testhost -m shell -a 'w'
[root@Dasoncheng ~]# ansible cdn002 -m command -a 'hostname' ##ansible后面接主机/主机名组。-m是接模块、-a是接命令
cdn002 | SUCCESS | rc=0 >>
cdn002
[root@Dasoncheng ~]# ansible 192.168.60.12,127.0.0.1 -m command -a 'w'
127.0.0.1 | SUCCESS | rc=0 >>
17:02:44 up 21:03, 4 users, load average: 0.08, 0.05, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
gecz pts/0 192.168.60.1 Thu16 19:59m 0.70s 0.05s sshd: gecz [priv]
gecz pts/1 192.168.60.1 11:08 4:51m 0.17s 0.05s sshd: gecz [priv]
gecz pts/2 192.168.60.1 16:25 4.00s 3.03s 0.07s sshd: gecz [priv]
root pts/5 localhost 17:02 0.00s 0.40s 0.00s w
192.168.60.12 | SUCCESS | rc=0 >>
17:02:45 up 2:15, 3 users, load average: 0.04, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
gecz pts/0 192.168.60.1 Sun05 5days 0.36s 0.05s sshd: gecz [priv]
gecz pts/1 192.168.60.1 16:25 32:37 0.18s 0.11s sshd: gecz [priv]
root pts/2 192.168.60.11 17:02 1.00s 0.41s 0.02s w
[root@Dasoncheng ~]# ansible testhost -m command -a 'hostname'
192.168.60.12 | SUCCESS | rc=0 >>
cdn002
127.0.0.1 | SUCCESS | rc=0 >>
cdn001
1.04 Ansible拷贝文件或目录
类似于scp
ansible cdn002 -m copy -a "src=/etc/ansible dest=/tmp/ansibletest owner=root group=root mode=0755"
注意:源目录会放到目标目录下面去,如果目标指定的目录不存在,它会自动创建。如果拷贝的是文件,dest指定的名字和源如果不同,并且它不是已经存在的目录,相当于拷贝过去后又重命名。但相反,如果desc是目标机器上已经存在的目录,则会直接把文件拷贝到该目录下面。
ansible testhost -m copy -a "src=/etc/passwd dest=/tmp/123"
这里的/tmp/123和源机器上的/etc/passwd是一致的,但如果目标机器上已经有/tmp/123目录,则会再/tmp/123目录下面建立passwd文件
[root@Dasoncheng ~]# ansible cdn002 -m copy -a 'src=/etc/ansible dest=/tmp/ansible_test owner=root group=root mode=755'
cdn002 | SUCCESS => {
"changed": true,
"dest": "/tmp/ansible_test/",
"src": "/etc/ansible"
}
[root@Dasoncheng ~]# ansible cdn002 -m command -a 'ls /tmp/ansible_test '
cdn002 | SUCCESS | rc=0 >>
ansible
[root@Dasoncheng ~]# ansible cdn002 -m command -a 'ls /tmp/ansible_test/ansible '
cdn002 | SUCCESS | rc=0 >>
ansible.cfg
hosts
roles