【图文教程】Ansible

1. Ansible介绍

官网 www.ansible.com

在线电子书:https://getansible.com

Ansible是一款由RedHat赞助的开源软件。它是一款可以在整个IT团队中使用的自动化语言,从系统到网络到开发。它目前已经整合了虚拟化(Vmware、RHEV、Xen等)、网络设备(思科、F5、OpenSwitch)、容器(Docker、LXC)、公有云(亚马逊云AWS、微软Azure)、DEVOPS(Gitlab、Github、Jenkins)、监控/分析(Splunk、InfluxDB)等多个领域。

2. 安装Ansible

文档:https://docs.ansible.com/ansible/latest/index.html

  • 在CentOS7上安装Ansible
1. yum install -y epel-release

2. yum install -y ansible
  • 另外,ansible也支持使用pip安装
pip install ansible
  • Ansible因为是angent-less,所以只有一个控制中心,其他机器无需安装任何软件包。但,要想控制远程机器,还需要配置密钥认证。
1. 在控制中心生成密钥对

最好是先检查一下,ls ~/.ssh/,看看该目录下有没有id_rsa以及id_rsa.pub两个文件。如果没有执行如下命令

ssh-keygen

举例:

[root@test01 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):    #直接回车
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):                 #直接回车
Enter same passphrase again:                                #直接回车
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:7UMC0dJNyMNgQc+GpQHlxQ2/3OApPkIUs87QQlmJCZ8 root@test01
The key's randomart image is:
+---[RSA 2048]----+
|  ..oO%X+*.      |
|   o+=o&O.o      |
|    E O.+.o      |
|     * o + =     |
|      + S B .    |
|     . . =       |
|      . o o      |
|       . . .     |
|                 |
+----[SHA256]-----+
[root@test01 ~]# ls -la .ssh/
total 8
drwx------. 2 root root   38 Nov 19 09:37 .
dr-xr-x---. 5 root root  265 Nov 19 09:37 ..
-rw-------. 1 root root 1679 Nov 19 09:37 id_rsa
-rw-r--r--. 1 root root  393 Nov 19 09:37 id_rsa.pub



2. 配置密钥认证

在控制中心,执行ssh-copy-id

ssh-copy-id [user@]远程机器ip

举例:

[root@test03 ~]# ssh-copy-id 192.168.72.134
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.72.134 (192.168.72.134)' can't be established.
ECDSA key fingerprint is SHA256:0Xvj1TYMUHFQy8qgvavltAUzEylKChDyh4Yk4ALxJGI.
ECDSA key fingerprint is MD5:10:a7:87:81:8b:14:09:d7:81:b8:46:f6:12:65:be:e2.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.72.134's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '192.168.72.134'"
and check to make sure that only the key(s) you wanted were added.

[root@test03 ~]# ssh 192.168.72.134
Last login: Thu Nov 19 09:03:35 2020 from 192.168.72.1
[root@test01 ~]# 



3. 编辑hosts文件

Ansible控制中心有个hosts文件,用来配置它所管理的机器

vim /etc/ansible/hosts #格式如下
## [webservers]
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110

举例:

[test]          #主机组名,可以写任意。
127.0.0.1       #本机的ip地址。
test02          #可以是IP地址也可以是主机名,如果是主机名,需要在 vim /etc/hosts 里添加过IP地址。
192.168.72.136  

其中[]里面为主机组名,下面为要管理的机器IP或主机名。
  • 测试
1. ansible all -m ping 
这里的all代表hosts文件里所有的主机,也可以指定单个

2. ansible all -m ping

举例1[root@test01 ~]# ansible all -m ping
192.168.72.136 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
test02 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}


举例2[root@test01 ~]# ansible test02 -m ping
test02 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

[root@test01 ~]# ansible 192.168.72.136 -m ping
192.168.72.136 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

3. Ansible远程执行命令

1. ansible test -m command -a 'hostname'
#这里的test为hosts配置文件中配置的那个主机组名,-m后面指定模块名,这里的command为远程执行命令的模块,-a后面跟具体的命令

举例1[root@test01 ~]# ansible test -m command -a "hostname"
192.168.72.136 | CHANGED | rc=0 >>
test03
test02 | CHANGED | rc=0 >>
test02


举例2[root@test01 ~]# ansible test -m command -a "ls /tmp/"    #可以查看 [test] 主机组下的服务器  /tmp/ 下都有什么文件
test02 | CHANGED | rc=0 >>
ansible_command_payload_YonUiM
mysql.sock
php-fcgi.sock
systemd-private-2dc4dda3669c4df5bb110889e0db63ff-redis.service-DbHhCP
systemd-private-fe92b6ce4d4d4ef2ad450170e1f2341b-redis.service-KhnhVz
vmware-root_5577-4122781957
vmware-root_5693-1983786377
vmware-root_5956-692815633
vmware-root_5957-1723604175
vmware-root_6021-1723604079
vmware-root_6329-1715279180
192.168.72.136 | CHANGED | rc=0 >>
ansible_command_payload_RzeFrB
mysql.sock
php-fcgi.sock
systemd-private-1751683809484cbfb210a39ec0f7277c-redis.service-XTyQaF
systemd-private-2dc4dda3669c4df5bb110889e0db63ff-redis.service-DbHhCP
vmware-root_5577-4122781957
vmware-root_5693-1983786377
vmware-root_5957-1723604175
vmware-root_6064-734560284
vmware-root_6329-1715279180

举例3[root@test01 ~]# ansible 192.168.72.136 -m command -a "ls /tmp/"    #也可以查看单个服务器
192.168.72.136 | CHANGED | rc=0 >>
ansible_command_payload_LSj43N
mysql.sock
php-fcgi.sock
systemd-private-1751683809484cbfb210a39ec0f7277c-redis.service-XTyQaF
systemd-private-2dc4dda3669c4df5bb110889e0db63ff-redis.service-DbHhCP
vmware-root_5577-4122781957
vmware-root_5693-1983786377
vmware-root_5957-1723604175
vmware-root_6064-734560284
vmware-root_6329-1715279180



2. ansible 127.0.0.1 -m shell -a 'w' 
#除了command模块外,也可以使用shell模块实现远程执行命令。shell还支持执行远程主机上的shell脚本。

4. Ansible操作文件和目录

1. ansible test02 -m copy  -a "src=/etc/passwd dest=/tmp/test123 owner=root group=root mode=0755"
#注意:源目录会放到目标目录下面去,如果目标指定的目录不存在,它会自动创建。如果拷贝的是文件,dest指定的名字和源如果不同,并且它不是已经存在的目录,相当于拷贝过去后又重命名。但相反,如果desc是目标机器上已经存在的目录,则会直接把文件拷贝到该目录下面。

 
2. ansible test -m copy -a "src=/etc/passwd dest=/tmp/123"
#这里的/tmp/123和源机器上的/etc/passwd是一致的,但如果目标机器上已经有/tmp/123目录,则会再/tmp/123目录下面建立passwd文件

5. Ansible远程执行脚本

  • 首先创建一个shell脚本,/tmp/1.sh,内容如下
#!/bin/bash
echo `date` > /tmp/ansible_test.txt
  • 然后把该脚本分发到各个机器上
ansible test -m copy -a "src=/tmp/1.sh dest=/tmp/test.sh mode=0755"
  • 最后是批量执行该shell脚本
ansible test -m shell -a "/tmp/test.sh"
  • shell模块,还支持远程执行命令并且带管道
ansible test -m shell -a "cat /etc/passwd|wc -l "

6. Ansible管理任务计划

ansible test -m cron -a "name='test cron' job='/bin/touch /tmp/1212.txt'  weekday=6"

#若要删除该cron 只需要加一个字段 state=absent,前提是之前用ansible增加的那个cron没有手动修改过。 
ansible test -m cron -a "name='test cron' state=absent"

#其他的时间表示:分钟 minute 小时 hour 日期 day 月份 month
#示例
ansible aminglinux02 -m cron -a "name='test cron again' job='/bin/bash /usr/local/sbin/123.sh' minute=*/10 hour=10-20 day=5,10,15"

7. Ansible软件、服务管理

ansible test -m yum -a "name=httpd" 
#在name后面还可以加上state=installed/removed

ansible test -m service -a "name=httpd state=started enabled=yes" 
#注意,这里的name要和上面那个name区分开,上面的是包的名字,这里的是服务名字,如果本机没有该服务,则会报错
#在CentOS7上可以使用"systemctl list-unit-files  -t service"列出所有的服务
#state定义服务是开启还是关闭,stoped为关闭
#enabled定义服务是否开机启动

8. Ansible文档的使用

ansible-doc -l   #列出所有的模块

ansible-doc cron  #查看指定模块的文档