ansible:
远程自动化运维
ansible是基于python开发的配置管理和应用部署工具。
也是自动化运维的重要工具。
可以批量配置、部署、管理上千台主机。
只需要在一台主机配置ansible就可以完成对其他主机的操作
操作模式
1、模块化操作,命令行操作
2、playbook,脚本,也是把命令行的脚本化。脚本的格式是yaml格式
ansible的特性:
幂等性:多次操作或者是多次执行,对系统的影响不会发生变化,无论执行多少次结果都是一样的。
ansible什么都不会做
ansible四大组件
1、inventory 主机清单 主机组
必须要声明管理主机的地址或者其他的配置,不声明ansible无法对目标主机进行操作
2modules 模块 学习核心
ansible的功能是靠模块来实现的
3、插件
4、playbooks 剧本 ---- 脚本(服用)
模块和语法的学习
命令行
test41 192.168.65.41 安装ansible
docker1 192.168.65.51
docker2 192.168.65.52
安装ansible
#关闭防火墙
[root@test41 ~]# systemctl stop firewalld
[root@test41 ~]# setenforce 0
#安装epel-release
[root@test41 ~]# yum -y install epel-release
#安装ansible
[root@test41 ~]# yum -y install ansible
[root@test41 ~]# cd /etc/ansible/
[root@test41 ansible]# ls
ansible.cfg hosts roles
#修改连接的配置文件
[root@test41 ansible]# vim hosts
20行 [web]
23行 192.168.65.51
33行 [xy102]
37行 192.168.65.52
#设置免密登录
[root@test41 ansible]# ssh-keygen -t rsa
#传密码
[root@test41 ansible]# sshpass -p '123' ssh-copy-id root@192.168.65.51
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
[root@test41 ansible]# sshpass -p '123' ssh-copy-id root@192.168.65.52
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
#列出ansible所有已安装的模块
[root@test41 ansible]# ansible-doc -l
#command模块,基础模块,也是ansible的默认模块,不支持管道符和重定向操作,执行一般的linux命令。
#如果报错就把密码再传一次就能执行
[root@test41 ansible]# ansible 192.168.65.52 -m command -a "date"
192.168.65.52 | CHANGED | rc=0 >> #可以用指定的ip地址
2024年 08月 21日 星期三 09:43:23 CST
[root@test41 ansible]# ansible 192.168.65.51 -m command -a "date"
192.168.65.51 | CHANGED | rc=0 >>
2024年 08月 21日 星期三 09:43:35 CST
[root@test41 ansible]# ansible web -m command -a "date"
192.168.65.51 | CHANGED | rc=0 >> #也可以用组名
2024年 08月 21日 星期三 10:00:47 CST
[root@test41 ansible]# ansible xy102 -m command -a "date"
192.168.65.52 | CHANGED | rc=0 >>
2024年 08月 21日 星期三 10:01:01 CST
#所有声明的主机都会执行
[root@test41 ansible]# ansible all -m command -a "date"
192.168.65.52 | CHANGED | rc=0 >>
2024年 08月 21日 星期三 10:02:19 CST
192.168.65.51 | CHANGED | rc=0 >>
2024年 08月 21日 星期三 10:02:19 CST
#怎么使用ansible
ansible<组名/ip地址> -m 指定模块,不加就是默认使用command -a <参数或者命令>
常用的模块参数
1、command模块
#chdir在目标主机提前进入目录,然后执行指令
[root@test41 ansible]# ansible 192.168.65.51 -a 'chdir=/home ls'
192.168.65.51 | CHANGED | rc=0 >>
aaa
bbb
wbl
#creates判断文件是否存在,如果存在就不执行后面的指令
[root@test41 ansible]# ansible 192.168.65.51 -a 'creates=/opt/123 ls/opt'
192.168.65.51 | SUCCESS | rc=0 >>
skipped, since /opt/123 exists
#removes 判断文件是否存在,如果存在就会执行指令
[root@test41 ansible]# ansible 192.168.65.51 -a 'removes=/opt/123 ls /opt'
192.168.65.51 | CHANGED | rc=0 >>
123
docker-compose.yml
harbor
harbor-offline-installer-v2.8.1.tgz
mysql
mysql1
nginx
nginx1
nhtml
php
php1
2、shell模块 支持管道符和重定向,也可以用逻辑表达式&&且 ; 逻辑或
[root@test41 ansible]# ansible 192.168.65.51 -m shell -a 'useradd test'
192.168.65.51 | CHANGED | rc=0 >>
[root@test41 ansible]# ansible 192.168.65.51 -m shell -a 'echo 123456 | passwd --stdin test'
192.168.65.51 | CHANGED | rc=0 >>
更改用户 test 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@test41 ansible]# ansible 192.168.65.51 -m shell -a 'cat /opt/123'
192.168.65.51 | CHANGED | rc=0 >>
123
#逻辑且
[root@test41 ansible]# ansible 192.168.65.51 -m shell -a 'touch /opt/123.txt && echo 123 > /opt/123.txt && cat /opt/123.txt'
[WARNING]: Consider using the file module with state=touch rather than running
'touch'. If you need to use command because file is insufficient you can add
'warn: false' to this command task or set 'command_warnings=False' in
ansible.cfg to get rid of this message.
192.168.65.51 | CHANGED | rc=0 >>
123
#逻辑或 (前一个失败不影响后一个执行)
[root@test41 ansible]# ansible 192.168.65.51 -m shell -a 'cat /etc/passwdd ; cat /opt/123.txt'
192.168.65.51 | CHANGED | rc=0 >>
123cat: /etc/passwdd: 没有那个文件或目录
在目标主机创建一个脚本,在脚本中写一个命令ifcong,然后运行脚本
[root@test41 ansible]# ansible 192.168.65.51 -m shell -a 'echo -e "#!/bin/bash\nifconfig" > /opt/test.sh && sh /opt/test.sh'
192.168.65.51 | CHANGED | rc=0 >>
br-211011ad3135: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255
inet6 fe80::42:41ff:fe8e:75ed prefixlen 64 scopeid 0x20<link>
ether 02:42:41:8e:75:ed txqueuelen 0 (Ethernet)
RX packets 12020 bytes 3861077 (3.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 16415 bytes 1421992 (1.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
3、cron模块,定时任务模块 minute/hour/day/month/weekday 分/时/日/月/周
#创建定时任务,不指定名字就会报错
[root@test41 ansible]# ansible 192.168.65.51 -m cron -a 'minute=30 hour=8 day=* job="ls /opt"'
[DEPRECATION WARNING]: The 'name' parameter will be required in future
releases.. This feature will be removed in version 2.12. Deprecation warnings
can be disabled by setting deprecation_warnings=False in ansible.cfg.
192.168.65.51 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"None"
]
}
[root@test41 ansible]# ansible 192.168.65.51 -a 'crontab -l'
192.168.65.51 | CHANGED | rc=0 >>
#Ansible: None
30 8 * * * ls /opt
#指定文件名
[root@test41 ansible]# ansible 192.168.65.51 -m cron -a 'minute=30 hour=8 day=3 month=9 job="ls /opt" name="test1"'
192.168.65.51 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"None",
"test1"
]
[root@test41 ansible]# ansible 192.168.65.51 -a 'crontab -l'
192.168.65.51 | CHANGED | rc=0 >>
#Ansible: None
30 8 * * * ls /opt
#Ansible: test1
30 8 3 9 * ls /opt
#删除定时任务
[root@test41 ansible]# ansible 192.168.65.51 -m cron -a 'name="test1" state=absent'
192.168.65.51 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"None"
]
}
[root@test41 ansible]# ansible 192.168.65.51 -m cron -a 'name="None" state=absent'
192.168.65.51 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": []
}
[root@test41 ansible]# ansible 192.168.65.51 -a 'crontab -l'
192.168.65.51 | CHANGED | rc=0 >>
4、user模块,用户管理模块
name用户名必选参数
state=present|absent present创建 absent删除
system=yes|no 创建用户时,是否是系统账号
uid指定用户的uid
group指定用户组
shell默认系统用户可以不加
create_home=yes|no不是默认的家目录/home。指定到/opt/test1家目录 create_home=yes创建 no不创建
password用户添加密码
remove=yes|no只有当state=absent删除用户,删除用户时是否删除家目录
[root@test41 ansible]# ansible 192.168.65.51 -m user -a 'name=xy102 system=no'
=no是普通用户
xy102:x:1002:1002::/home/xy102:/bin/bash
#指定用户、uid号、是否是系统用户
[root@test41 ansible]# ansible 192.168.65.51 -m user -a 'name=xy103 uid=900 shell=/sbin/nologin system=yes'
xy103:x:900:900::/home/xy103:/sbin/nologin
#删除用户
[root@test41 ansible]# ansible 192.168.65.51 -m user -a 'name=xy102 remove=yes state=absent'
192.168.65.51 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"force": false,
"name": "xy102",
"remove": true,
"state": "absent"
}
5、copy模块 复制模块,复制主机文件到目标主机。
src表示源文件 dest目标主机保存的路径 mode复制文件保存的权限 owner文件的所有者 group文件的所在组 content指定复制内容,就不能用src
[root@test41 opt]# ansible 192.168.65.52 -m copy -a 'src=/opt/xy102.txt dest=/opt/'
[root@docker2 opt]# cat xy102.txt
123
#设置权限
[root@test41 opt]# ansible 192.168.65.52 -m copy -a 'src=/opt/xy102.txt dest=/opt/ mode=640'
root用户下的权限640
[root@docker2 opt]# ll
-rw-r-----. 1 root root 4 8月 21 11:37 xy102.txt
#指定文件的所有者
[root@test41 opt]# ansible 192.168.65.52 -m copy -a 'src=/opt/xy102.txt dest=/opt/ mode=640 owner=wbl group=wbl'
改变了所有者
[root@docker2 opt]# ll
-rw-r-----. 1 wbl wbl 4 8月 21 11:37 xy102.txt
#
[root@test41 opt]# ansible 192.168.65.52 -m copy -a 'content="黑神话:悟空真好玩" dest=/opt/houzi.txt mode=777 owner=wbl group=wbl'
[root@docker2 opt]# cat houzi.txt
黑神话:悟空真好玩
#修改文件名
[root@test41 opt]# ansible 192.168.65.52 -a 'mv /opt/houzi.txt /opt/孙悟空。txt'192.168.65.52 | CHANGED | rc=0 >>
[root@docker2 opt]# ll
改前的文件名
-rwxrwxrwx. 1 wbl wbl 27 8月 21 11:43 houzi.txt
改后的文件名
-rwxrwxrwx. 1 wbl wbl 27 8月 21 11:43 孙悟空。txt
权限:r/4读--w/2写--x/1执行
5、file模块 设置文件属性
mode owner group state=touch |absent touch 创建 absent 删除
#创建文件
[root@test41 opt]# ansible 192.168.65.51 -m file -a 'path=/opt/abc.txt state=touch mode=777 owner=wbl group=wbl'
[root@docker1 opt]# ll
-rwxrwxrwx. 1 wbl wbl 0 8月 21 13:37 abc.txt
#创建链接文件
[root@test41 opt]# ansible 192.168.65.51 -m file -a 'path=/opt/abc.txt.link src=/opt/abc.txt state=link'
[root@docker1 opt]# ll
-rwxrwxrwx. 1 wbl wbl 0 8月 21 13:37 abc.txt
lrwxrwxrwx. 1 root root 12 8月 21 13:39 abc.txt.link -> /opt/abc.txt
#删除链接文件
[root@test41 opt]# ansible 192.168.65.51 -m file -a 'path=/opt/abc.txt.link state=absent'
[root@docker1 opt]# ll
-rwxrwxrwx. 1 wbl wbl 0 8月 21 13:37 abc.txt
6、hostname模块 设置远程主机的主机名
[root@test41 opt]# ansible 192.168.65.51 -m hostname -a "name=nginx1"
[root@docker1 opt]# su
[root@nginx1 opt]#
7、ping模块 测试主机和主机名
#ping主机看连接是否正常
[root@test41 opt]# ansible all -m ping
192.168.65.51 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.65.52 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
8、yum模块 在目标主机安装软件 (只能安装和卸载)
#安装软件
[root@test41 opt]# ansible 192.168.65.51 -m yum -a 'name=httpd'
192.168.65.51 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"msg": "",
"rc": 0,
"results": [
"httpd-2.4.6-99.el7.centos.1.x86_64 providing httpd is already installed"
]
}
#卸载软件
[root@test41 opt]# ansible 192.168.65.51 -m yum -a 'name=httpd state=absent'
192.168.65.51 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"changes": {
"removed": [
"httpd"
]
},
#查看服务运行状态
[root@test41 opt]# ansible 192.168.65.51 -a 'systemctl status httpd'
192.168.65.51 | FAILED | rc=4 >>
Unit httpd.service could not be found.non-zero return code
9、service模块 用来管理目标主机上的软件的运行状态
name 服务名称
state=started|stopped|restarted
enabled=true 设置开机自启
runlevel=40 运行级别 设置了开机自启就需要声明运行级别
[root@test41 opt]# ansible 192.168.65.51 -m yum -a 'name=nginx'
[root@test41 opt]# ansible 192.168.65.51 -m service -a 'name=nginx enabled=true state=started runlevel=60'
1、安装nginx 2、开启nginx 开机自启动 3、访问的内容是this is nginx1!
[root@test41 opt]# ansible 192.168.65.52 -m shell -a 'yum -y install nginx && systemctl start nginx && systemctl enable nginx && echo "this is nginx!" > /usr/share/nginx/html/index.html && curl 192.168.65.52'