【图文教程】Ansible
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 #查看指定模块的文档