linux 学习笔记-096-自动化运维-ansible 介绍与安装,远程执行命令,拷贝文件或目录,远程执行脚本,管理任务计划

发布于 2018-05-28  183 次阅读


ansible 介绍

不需要安装客户端,通过 sshd 去通信

基于模块工作,模块可以由任何语言开发

不仅支持命令行使用模块,也支持编写 yaml 格式的 playbook,易于编写和阅读

安装十分简单,centos 上可直接 yum 安装

有提供收费的 UI(浏览器图形化):

https://www.ansible.com/products/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/

ansible 安装

[root@am-01:~#] cd /etc/yum.repos.d

[root@am-01:/etc/yum.repos.d#] mv epel.repo epel.repo.bak

[root@am-01:/etc/yum.repos.d#] mv epel-testing.repo epel-testing.repo.bak

[root@am-01:/etc/yum.repos.d#] cd

[root@am-01:~#] yum list | grep ansible

ansible.noarch                              2.4.2.0-2.el7              extras  

ansible-doc.noarch                          2.4.2.0-2.el7              extras  

[root@am-01:~#] yum -y install ansible.noarch ansible-doc.noarch

#Centos 可以直接使用 yum 安装 ansible,这里建议先把 epel 源改名(不使用 epel 源)
[root@am-01:~#] cd .ssh/

[root@am-01:~/.ssh#] cat id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRIS49kbgbNquhiQw1+5uziJNuDO3Fe/Zbm0DZNuES26OLpTo0WqBm90i7J3UUO+W6jNZEn3sMuaw4cZR4BY8UqL+DyrDp+R2pZAVVYzsB/OrCXhFWRQTNV4LIgMpocryR5NLfrPMTyACKmVa/9JteM31SZzMUdr9wdNcA/MWO/VuJJXfTx7HP0Qwpoz/u0pU8VHY1JfJujFvGzOMOXWfvyH9SFk5OkEO3vZ+KYW1AkFVKLyVYlKho0SDxArUJ2l5efmsSPJSAkHUukuawt7fFwXOwlWhPsmNK3Owi/QjhFZYZE0VIdlcpHRGLLvAnbbSUaUQHcta9hdLX9+26BUqv root@am-01



[root@am-02:~#] vim .ssh/authorized_keys

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRIS49kbgbNquhiQw1+5uziJNuDO3Fe/Zbm0DZNuES26OLpTo0WqBm90i7J3UUO+W6jNZEn3sMuaw4cZR4BY8UqL+DyrDp+R2pZAVVYzsB/OrCXhFWRQTNV4LIgMpocryR5NLfrPMTyACKmVa/9JteM31SZzMUdr9wdNcA/MWO/VuJJXfTx7HP0Qwpoz/u0pU8VHY1JfJujFvGzOMOXWfvyH9SFk5OkEO3vZ+KYW1AkFVKLyVYlKho0SDxArUJ2l5efmsSPJSAkHUukuawt7fFwXOwlWhPsmNK3Owi/QjhFZYZE0VIdlcpHRGLLvAnbbSUaUQHcta9hdLX9+26BUqv root@am-01



[root@am-01:~/.ssh#] ssh am-02

Last login: Mon May 28 19:04:29 2018 from 172.17.1.1

[root@am-02:~#] exit

logout

Connection to am-02 closed.

#因为之前做实验已经生成过私钥和公钥,所以只需要把公钥内容复制到 am-02 上就可以免密码 ssh 登陆 am-02 了

#如果 am-01 没生成过私钥和公钥,可以使用 ssh-keygen 生成一下
[root@am-01:~#] vim /etc/ansible/hosts

[test]

127.0.0.1

am-02

#这里是配置主机组,配置了主机组,你就可以针对主机组做一些操作

#其中主机组的主机,可以配置为主机 ip,也可以是主机名

[root@am-01:~#] vim /etc/hosts

172.17.1.242 am-02

#因为配置主机组的时候,am-02 使用了主机名,所以还得修改 hosts,指定这个主机名所对应的 ip 地址

[root@am-01:~/.ssh#] cat id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRIS49kbgbNquhiQw1+5uziJNuDO3Fe/Zbm0DZNuES26OLpTo0WqBm90i7J3UUO+W6jNZEn3sMuaw4cZR4BY8UqL+DyrDp+R2pZAVVYzsB/OrCXhFWRQTNV4LIgMpocryR5NLfrPMTyACKmVa/9JteM31SZzMUdr9wdNcA/MWO/VuJJXfTx7HP0Qwpoz/u0pU8VHY1JfJujFvGzOMOXWfvyH9SFk5OkEO3vZ+KYW1AkFVKLyVYlKho0SDxArUJ2l5efmsSPJSAkHUukuawt7fFwXOwlWhPsmNK3Owi/QjhFZYZE0VIdlcpHRGLLvAnbbSUaUQHcta9hdLX9+26BUqv root@am-01

[root@am-01:~#] vim .ssh/authorized_keys

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRIS49kbgbNquhiQw1+5uziJNuDO3Fe/Zbm0DZNuES26OLpTo0WqBm90i7J3UUO+W6jNZEn3sMuaw4cZR4BY8UqL+DyrDp+R2pZAVVYzsB/OrCXhFWRQTNV4LIgMpocryR5NLfrPMTyACKmVa/9JteM31SZzMUdr9wdNcA/MWO/VuJJXfTx7HP0Qwpoz/u0pU8VHY1JfJujFvGzOMOXWfvyH9SFk5OkEO3vZ+KYW1AkFVKLyVYlKho0SDxArUJ2l5efmsSPJSAkHUukuawt7fFwXOwlWhPsmNK3Owi/QjhFZYZE0VIdlcpHRGLLvAnbbSUaUQHcta9hdLX9+26BUqv root@am-01

[root@am-01:~#] ssh 127.0.0.1

The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.

ECDSA key fingerprint is 7b:ec:d2:f6:f1:9f:f6:78:e1:4c:42:2f:cb:1b:37:dc.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '127.0.0.1' (ECDSA) to the list of known hosts.

Last login: Mon May 28 19:04:20 2018 from 172.17.1.1

[root@am-01:~#] w

 19:32:30 up 3 days,  1:40,  2 users,  load average: 0.26, 0.23, 0.31

USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT

root     pts/0    172.17.1.1       19:04    6.00s  0.87s  0.05s ssh 127.0.0.1

root     pts/1    localhost        19:32    6.00s  0.12s  0.02s w

[root@am-01:~#] exit

logout

Connection to 127.0.0.1 closed.

#因为配置主机组的时候,还配置了本机 am-01,使用的是 127.0.0.1,所以还得给本机做个 ssh 密钥验证,使用 w 可以见到,密钥登录后会有两个 shell

ansible 远程执行命令

远程批量执行命令

[root@am-01:~#] ansible test -m command -a 'w'

am-02 | SUCCESS | rc=0 >>

 22:53:34 up 3 days,  5:01,  2 users,  load average: 0.04, 0.07, 0.07

USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT

root     pts/0    172.17.1.1       19:04    3:26m  0.16s  0.16s -bash

root     pts/1    am-01            22:53    1.00s  0.44s  0.03s w



127.0.0.1 | SUCCESS | rc=0 >>

 22:53:35 up 3 days,  5:01,  2 users,  load average: 0.23, 0.14, 0.15

USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT

root     pts/0    172.17.1.1       19:04    7.00s  3.81s  0.01s ssh -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/21f0e6a9ae -tt 127.0.0.1 /bin/sh -c '/usr/bin/python /root/.ansible/tmp/ansible-tmp-1527519212.56-3101818428994/command.py; rm -rf "/root/.ansible/tmp/ansible-tmp-1527519212.56-3101818428994/" > /dev/n

root     pts/3    localhost        22:53    1.00s  0.39s  0.04s w



[root@am-01:~#] ansible test -m command -a 'hostname'

am-02 | SUCCESS | rc=0 >>

am-02



127.0.0.1 | SUCCESS | rc=0 >>

am-01

#testhost 为主机组名,-m 后边是模块名字,-a 后面是命令。当然也可以直接写一个 ip,针对某一台机器来执行命令
[root@am-01:~#] ansible test -m shell -a 'hostname'

am-02 | SUCCESS | rc=0 >>

am-02



127.0.0.1 | SUCCESS | rc=0 >>

am-01

#shell 模块的效果跟 command 模块一样

错误:

"msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"
解决方法:

yum install -y libselinux-python

ansible 拷贝文件或目录

源目录会放到目标目录下面去,如果目标指定的目录不存在,它会自动创建。如果拷贝的是文件,dest 指定的名字和源如果不同,并且它不是已经存在的目录,相当于拷贝过去后又重命名。但相反,如果 desc 是目标机器上已经存在的目录,则会直接把文件拷贝到该目录下面

[root@am-01:~#] ansible am-02 -m copy -a "src=/etc/passwd dest=/tmp/passwd/ owner=root group=root mode=755"

am-02 | SUCCESS => {

    "changed": true,

    "checksum": "fe36b2e0c2f0d76bdab205522c0ebf5393709c55",

    "dest": "/tmp/passwd/passwd",

    "gid": 0,

    "group": "root",

    "md5sum": "23f463947514dbf8a774eb226b98e42a",

    "mode": "0755",

    "owner": "root",

    "size": 2673,

    "src": "/root/.ansible/tmp/ansible-tmp-1527519663.0-94883028507963/source",

    "state": "file",

    "uid": 0

}



[root@am-02:~#] ls /tmp/passwd/

passwd

#把源文件复制到目标目录下,发现会自动创建所指定的目录

#-m 指定模块,-a 后面跟着动作,src 指定源目录或者文件,dest 指定目标文件或者目录,owner 指定所有者,group 指定所属组,mode 指定权限
[root@am-01:~#] ansible am-02 -m copy -a "src=/etc/passwd dest=/tmp/1.txt owner=root group=root mode=777"

am-02 | SUCCESS => {

    "changed": true,

    "checksum": "fe36b2e0c2f0d76bdab205522c0ebf5393709c55",

    "dest": "/tmp/1.txt",

    "gid": 0,

    "group": "root",

    "md5sum": "23f463947514dbf8a774eb226b98e42a",

    "mode": "0777",

    "owner": "root",

    "size": 2673,

    "src": "/root/.ansible/tmp/ansible-tmp-1527520169.73-101288182640874/source",

    "state": "file",

    "uid": 0

}



[root@am-02:~#] ls -la /tmp/1.txt

-rwxrwxrwx 1 root root 2673 5 月  28 23:09 /tmp/1.txt

#把源文件复制目标主机的时候,做一个改名字的操作

ansible 远程执行脚本

[root@am-01:~#] mkdir /tmp/test

[root@am-01:~#] cd /tmp/test/

[root@am-01:/tmp/test#] vim 1.sh

#!/bin/bash

echo `w` > /tmp/test/1.log

#在 ansible 端指定目录下新建一个测试脚本
[root@am-01:/tmp/test#] ansible am-02 -m copy -a "src=/tmp/test/1.sh dest=/tmp/test/ mode=0755"

am-02 | SUCCESS => {

    "changed": true,

    "checksum": "ab74779221dd0d0882d98ec9e9aa7660db6f943f",

    "dest": "/tmp/test/1.sh",

    "gid": 0,

    "group": "root",

    "md5sum": "cb734ecc5e030cbb4fb919699abff729",

    "mode": "0755",

    "owner": "root",

    "size": 39,

    "src": "/root/.ansible/tmp/ansible-tmp-1527521226.3-7084397658213/source",

    "state": "file",

    "uid": 0

}



[root@am-02:~#] ls -l /tmp/test

总用量 4

-rwxr-xr-x 1 root root 39 5 月  28 23:27 1.sh

#把 ansible 端的脚本拷贝到目标机器的指定目录下,注意这里的路径需要两边都一样
[root@am-01:/tmp/test#] ansible am-02 -m shell -a "/tmp/test/1.sh"

am-02 | SUCCESS | rc=0 >>



[root@am-02:~#] ls -l /tmp/test

总用量 8

-rw-r--r-- 1 root root 201 5 月  28 23:30 1.log

-rwxr-xr-x 1 root root  39 5 月  28 23:27 1.sh

[root@am-02:~#] cat !$/1.log

cat /tmp/test/1.log

23:30:12 up 3 days, 5:37, 2 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 172.17.1.1 19:04 1:08 0.38s 0.38s -bash root pts/1 am-01 23:30 1.00s 0.27s 0.02s w

#运行脚本,在 am-02 上可以见到,运行是成功的
[root@am-01:~#] ansible test -m command -a "cat /etc/passwd | wc -l"

am-02 | FAILED | rc=1 >>

cat: invalid option -- 'l'

Try 'cat --help' for more information.non-zero return code



127.0.0.1 | FAILED | rc=1 >>

cat: invalid option -- 'l'

Try 'cat --help' for more information.non-zero return code



[root@am-01:~#] ansible test -m shell -a "cat /etc/passwd | wc -l"

am-02 | SUCCESS | rc=0 >>

41



127.0.0.1 | SUCCESS | rc=0 >>

55

#另外需要注意的是,command 模块执行命令是不支持管道符的,需要支持管道符的话要使用 shell 模块

ansible 管理任务计划

[root@am-01:~#] ansible test -m cron -a "name='test cron' job='/bin/touch /tmp/1212.txt'  weekday=6"

am-02 | SUCCESS => {

    "changed": true,

    "envs": [],

    "jobs": [

        "test cron"

    ]

}

127.0.0.1 | SUCCESS => {

    "changed": true,

    "envs": [],

    "jobs": [

        "test cron"

    ]

}

[root@am-01:~#] crontab -l

#Ansible: test cron

* * * * 6 /bin/touch /tmp/1212.txt



[root@am-02:~#] crontab -l

#Ansible: test cron

* * * * 6 /bin/touch /tmp/1212.txt

#批量设置任务计划,name 指定任务计划的名称,job 指定任务计划需要执行的命令,最后指定分钟、小时、日期、月份、星期等参数,不做指定则为星

#其他的时间表示:分钟 -- minute,小时--hour,日期--day,月份--month
[root@am-01:~#] ansible test -m cron -a "name='test cron' state=absent"

am-02 | SUCCESS => {

    "changed": true,

    "envs": [],

    "jobs": []

}

127.0.0.1 | SUCCESS => {

    "changed": true,

    "envs": [],

    "jobs": []

}

#删除指定主机组的指定任务计划,主要参数是 state=absent