一,ansible概述
1,概述
---自动化统一配置管理工具
2,相关自动化工具
a, puppet,安装ruby环境楠,学习楠,没有远程执行功能
b, ansible,轻量,ssh远程执行,串行,200+台服务器会慢一些
c, saltstack,C&S架构,salt-master和salt-minion,并行大规模批量会比ansible快,也支持ssh
3,自动化优点
1)效率快
2)减少重复性工作
3)减少人力成本
4)提高工作精确度
4,ansible功能及优点
1)远程执行,统一配置管理,新建文件等;
2)事件驱动,通过模块,对服务进行不同的事件驱动;
3)通过playbook统一管理,可以一条命令完成一整套架构;
4)跨平台,跨系统
在Ubuntu上安装apache服务名字叫apt-get install apache
在CentOS上安装apache服务名字叫yum install apache
在CentOS6上启动服务器使用命令:/etc/init.d/nginx start
在CentOS7上启动服务器使用命令:systemctl start nginx
二、Ansible架构
1,构成
connection plugins 连接插件,用于连接主机,被管理端
core modules 核心模块,连接主机实现操作,依赖于具体的模块做具体的事情
custom modules 自定义模块,可根据自己需求,编写具体的模块;
plugins 完成模块功能的补充;
playbook ansible 剧本,将多个任务写在剧本中,由ansible自动执行
inventor 定义ansible需要操作的主机范围
2,执行流程
1)ansible读取playbook剧本,剧本会记录对哪些主机执行哪些任务;
2)ansible通过主机清单找到要执行的主机,然后调用具体的模块;
3)通过连接插件,连接对应的主机并推送对应的任务;
4)被管理的主机将ansible发来的任务解析为本地shell并执行
三、Ansible安装
1,环境准备
2,安装
[root@m01~]# yum install -y ansible
3,常用参数
# ansible
[options] -v #显示详细信息
-i #主机清单文件路径,默认是在/etc/ansible/hosts
-m #使用的模块名称,默认使用command模块
-a #使用的模块参数,模块的具体动作
-k #提示输入ssh密码,而不使用基于ssh的密钥认证
-C #模拟执行测试,但不会真的执行
-T #执行命令的超时
--version #ansible版本及模块路径
[root@m01~]# ansible --version
ansible 2.9.14
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
4,配置文件详解
[root@m01 ~]# cat /etc/ansible/ansible.cfg
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时py文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp #本机的临时执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行是否询问sudo的ssh密码
#ask_pass = True #每次执行是否询问ssh密码
#remote_port = 22 #远程主机端口
host_key_checking = False #跳过检查主机指纹
log_path = /var/log/ansible.log #ansible日志
host_key_checking = False
一定要改,去掉注释
四,主机清单配置
1,单主机配置
1)IP+端口+主机名+密码
[root@m01~]# vim /etc/ansible/hosts
[web01]
10.0.0.7 ansible_ssh_port=22 ansible_sshuser=root ansible_ssh_psss='1'
[web02]
10.0.0.9 ansible_ssh_port=22 ansible_sshuser=root ansible_ssh_pass='1'
测试
[root@m01~]# ansible web01 -m ping
10.0.0.7 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@m01~]# ansible web02 -m ping
10.0.0.9 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
2)主机名+密码;配置etc/hosts
[root@m01~]# vim /etc/ansible/hosts
[lb01]
lb01 ansible_ssh_pass='1'
[lb02]
lb02 ansible_ssh_pass='1'
[root@m01~]# vim /etc/hosts
10.0.0.4 lb01
10.0.0.5 lb02
3)基于密钥方式
a,生成密钥对
[root@m01~]# ssh-keygen
[root@m01~]# ssh-copy-id [email protected]
[root@m01~]# ssh-copy-id [email protected]
b,配置hosts
[root@m01~]# vim /etc/ansible/hosts
[web1]
web01
[web3]
web03
2.主机组配置清单
1)主机组清单
[root@m01~]# vim /etc/ansible/hosts
...
[lb_group]
lb01 ansible_ssh_pass='1'
lb02 ansible_shh_pass='2'
[web_group]
web01
web02
测试
[root@m01~]# ansible lb_group -m ping
lb01 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
lb02 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: connect to host lb02 port 22: Connection timed out",
"unreachable": true
}
## lb02服务器没有打开
2)查看指定主机组的主机
[root@m01~]# ansible web_group --list-host
hosts (2):
web01
web02
[root@m01~]# ansible lb_group --list-host
hosts (2):
lb01
lb02
3,操作不同的主机组
[root@m01~]# ansible 'web_group,lb_group' -m ping
[root@m01~]# vim hosts
lb01 ansible_ssh_pass='1'
lb02 ansible_shh_pass='2'
[root@m01~]# ansible '*' -m ping -i ./hosts
lb01 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
lb02 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: connect to host lb02 port 22: Connection timed out",
"unreachable": true
}
4.定义多组
##整合web_group 和 lb_group
[root@m01 ~]# cat /etc/ansible/ansible.cfg
...
[nginx_group:children]
web_group
lb_group
##查看
[root@m01~]# ansible nginx_group --list-host
或
[root@m01~]# ansible nginx_group:chlidren --list-host##children(可以忽略 )
[WARNING]: Found both group and host with same name: lb01
[WARNING]: Could not match supplied host pattern, ignoring: chlidren
hosts (4):
web01
web02
lb01
lb02
五、Ansible ad-hoc
1,ad-hoc
ad-hoc简而言之就是“临时命令”,执行完即结束,并不会保存
2,ad-hoc结果返回颜色
绿色:被管理主机端没有被修改
黄色:被管理主机端发生改变
红色:报错
六、ad-hoc常用模块
常用模块:
command # 执行shell命令(不支持管道等特殊字符)
shell # 执行shell命令
scripts # 执行shell脚本
yum_repository # 配置yum仓库 (不常用)
yum # 安装软件
copy # 变更配置文件
file # 建立目录或文件
service # 启动与停止服务
mount # 挂载设备
cron # 定时任务
get_url # 下载软件
firewalld # 防火墙
selinux # selinux
[root@m01 ~]# ansible-doc -l # 查看所有模块说明
[root@m01 ~]# ansible-doc copy # 查看指定模块方法
搜索 EXAMPLES:示例
[root@m01 ~]# ansible-doc -s copy # 查看指定模块参数x
1.Ansible命令模块
1)command模块
[root@m01~]# ansible web01 -m command -a 'free -m'
[WARNING]: Found both group and host with same name: lb01
web01 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 468 206 5 30 256 180
Swap: 1023 0 1023
不支持特殊字符
[root@m01~]# ansible web01 -m command -a "ifconfig eth0 | awk 'NR==2 {print \$2}'"
[WARNING]: Found both group and host with same name: lb01
web01 | FAILED | rc=1 >>
|: 未知的主机
ifconfig: `--help' gives usage information.non-zero return code
2)shell模块
[root@m01~]# ansible web01 -m shell -a 'free -m'
[WARNING]: Found both group and host with same name: lb01
web01 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 468 206 6 30 256 181
Swap: 1023 0 1023
支持特殊符号
[root@m01~]# ansible web01 -m shell -a "ifconfig eth0 | awk 'NR==2 {print \$2}'"
[WARNING]: Found both group and host with same name: lb01
web01 | CHANGED | rc=0 >>
10.0.0.7
3) script模块
先准备一个脚本
[root@m01~]# cat qq.sh
#!/bin/bash
touch /root/yueliang
[root@m01~]# ansible web01 -m script -a ./qq.sh
[WARNING]: Found both group and host with same name: lb01
web01 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to web01 closed.\r\n",
"stderr_lines": [
"Shared connection to web01 closed."
],
"stdout": "",
"stdout_lines": []
}
到web01验证查看:
[root@web01 ~]# ll
-rw-r--r-- 1 root root 0 2020-11-15 00:02 yueliang
2.Ansible软件管理模块
1)yum模块
语法
name: httpd (服务名称)
http://... (下载路径)
/usr/local/src/nginx.rpm (本地文件路径)
state:latest 最新版(不常用)
present (下载)
absent (卸载)
示例
a,) 服务名称
[root@m01~]# ansible web_group -m yum -a "name=httpd state=present"
[WARNING]: Found both group and host with same name: lb01
web03 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"msg": "",
"rc": 0,
"results": [
"httpd-2.4.6-93.el7.centos.x86_64 providing httpd is already installed"
]
}
web01 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"msg": "",
"rc": 0,
"results": [
"httpd-2.4.6-93.el7.centos.x86_64 providing httpd is already installed"
]
}
调整 state=absent 就是卸载
相当于被控制主机端执行 yum install -y httpd
b,) 链接地址
[root@m01~]# ansible web_group -m yum -a "name=https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm state=present"
web03 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"changes": {
"installed": [
"/root/.ansible/tmp/ansible-tmp-1605752822.97-19202-199062966729605/zabbix-agent-4.0.0-2.el7.x86_64PWvubI.rpm"
]
.......
相当于被控制端执行 wget https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm
c,)文件路径
[root@m01 ~]# ansible web_group -m yum -a "name=/root/php71w-cli-7.1.31-1.w7.x86_64.rpm state=present
相当于yum localinstall -y
2) yum_repository模块 (不常用 不建议用)
语法
yum_repository:
name: epel 仓库的描述信息
description: EPEL YUM repo
baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
mirrorlist: http://mirrorlist.repoforge.org/el7/mirrors-rpmforge
file: external_repos
enabled: no 是否启用这个仓库,0表示不启用,1表示启用
gpgcheck: no 是否检查合法性,0是否
执行命令后如下:
[root@m01~]# ansible web01 -m yum_repository -a "name='nginx stable repo' description='nginx repo' baseurl='http://nginx.org/packages/centos/7/$basearch/' gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key state=present file=nginx"
[root@web01 ~]# cat /etc/yum.repos.d/nginx.repo
[nginx stable repo]
baseurl = http://nginx.org/packages/centos/7//
enabled = 1
gpgcheck = 1
gpgkey = https://nginx.org/keys/nginx_signing.key
name = nginx repo
3.文件管理模块
1)copy模块
语法
copy:
src: /srv/myfiles/foo.conf 文件原路径
dest: /etc/foo.conf 目标地址
owner: 属主
group: 属组
mode: '0644' 权限
content 一行简短的文本
不常用:
backup
follow 是否识别软连接
content 例:
[root@m01~]# ansible web01 -m copy -a "content=234567890 dest=/tmp/index"
[root@web01 ~]# cat /tmp/index
234567890
本地先准备好要推送的文件:
[root@m01~]# cat /etc/yum.repos.d/php.repo
[php-webtatic]
name = PHP Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0
执行命令
[root@m01~]# ansible web_group -m copy -a "src=/etc/yum.repos.d/php.repo dest=/tmp/ mode=666 owner=www group=www"
查看
[root@web01 ~]# ll /tmp/
总用量 4
-rw-rw-rw- 1 www www 109 2020-11-15 02:59 php.repo
2)file模块
语法
- name: Change file ownership, group and permissions
file:
path: /etc/foo.conf
owner: foo
group: foo
mode: '0644'
state: link, touch, hard, directory, file, absent
recurse: yes / no 递归
实例
1,创建目录
[root@m01~]# ansible web01 -m file -a 'path=/etc/abc owner=www group=www mode=755 state=directory'
查看
[root@web01 ~]# ll -d /etc/abc/
drwxr-xr-x 2 www www 6 2020-11-22 16:31 /etc/abc/
2,新建两个目录,递归授权
[root@m01~]# ansible web01 -m file -a 'path=/abc/bcc state=directory'
[root@m01~]# ansible web01 -m file -a 'path=/abc state=directory recurse=yes mode=777'
备注:
可以递归创建目录;
创建文件时,上层目录必须存在;
创建的上层目录已存在,不会改变上层的目录的权限,需要加上递归授权recurse
3, 删除abc及下面的所有目录目录
[root@web01 ~]# ll /etc/abc/ccc -d
drwxrwxrwx 2 www www 6 2020-11-22 16:44 /etc/abc/ccc/bbb/
[root@m01~]# ansible web01 -m file -a 'path=/etc/abc owner=www group=www mode=777 state=absent'
4,创建软连接
[root@m01~]# ansible web01 -m file -a 'src=/etc/rsyncd.conf dest=/root/rsync state=link'
[root@web01 ~]# ll /root/rsync
lrwxrwxrwx 1 root root 16 2020-11-22 16:51 /root/rsync -> /etc/rsyncd.conf
3.get_url 模块
--相当于wget
语法:
get_url:
url: http://example.com/path/file.conf
dest: /etc/foo.conf #下载后保存路径
mode: '0440'
checksum #下载时进行验证
示例:
[root@m01~]# ansible web01 -m get_url -a 'url=https://mirrors.aliyun.com/apache/archiva/2.2.5/src/apache-archiva-2.2.5-src.zip mode=777 dest=/tmp'
[root@web01 ~]# ll /tmp/
-rwxrwxrwx 1 root root 18955403 2020-11-22 17:28 apache-archiva-2.2.5-src.zip
备注:
checksum=md5:a4e52205a104c2db0c3e5a5ae1335de8'
用于大型企业,公有专门的下载包库,司会给个类似md5值,防止下载包被人串改
示例:
配置较多,看主要的黑色字体即可
[root@web01 ~]# vim /etc/nginx/conf.d/autoindex.conf
limit_conn_zone $remote_addr zone=limit_conn:1m;
limit_req_zone $remote_addr zone=limit_req:1m rate=1r/s;
server {
listen 80;
server_name www.autoindex.com;
charset utf-8;
limit_conn limit_conn 1;
limit_req zone=limit_req;
location /nginx_status {
stub_status;
}
location /download {
root /code/auto;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
allow 10.0.0.0/24;
deny all;
#auth_basic "输入登陆用户密码";
#auth_basic_user_file /etc/nginx/auth_basic;
}
location / {
root /code/auto;
index index.html;
}
}
#查看站点
[root@web01 /code/auto/download]# ll
drwxr-xr-x 2 www www 33 2020-09-10 23:06 aaaa
... ...
-rw-r--r-- 1 root root 727290 2020-11-23 08:55 sersync2.5.4_64bit_binary_stable_final.tar.gz
配置hosts,访问
另一台服务器下载:
[root@web03 ~]# wget http://www.autoindex.com/download/sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@web03 ~]# ll
-rw-r--r-- 1 root root 0 2020-11-26 12:32 sersync2.5.4_64bit_binary_stable_final.tar.gz
接收方一定要配置:
[root@web03 ~]# vim /etc/hosts
10.0.0.7 www.autoindex.com
web01的仓库文件设置md5值:
[root@web01 /code/auto/download]# ll
-rw-r--r-- 1 root root 727290 2020-11-23 08:55 sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@web01 /code/auto/download]# md5sum sersync2.5.4_64bit_binary_stable_final.tar.gz
cf202bc0568653ba5f486b5a2952301e sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@m01~]# ansible web03 -m get_url -a 'url="http://www.autoindex.com/download/sersync2.5.4_64bit_binary_stable_final.tar.gz" dest=/tmp/ mode=777 checksum=md5:cf202bc0568653ba5f486b5a2952301e'
##如果改变md5值,会报错
五、Ansible服务管理模块
1.service模块 & systemd模块
语法:
service:
name: httpd
state: started
stopped #停止服务
restarted #重启服务
reloaded #重载服务
enabled: yes
no
service示例:
[root@m01~]# ansible web01 -m service -a 'name=nginx state=stopped'
[root@m01~]# ansible web01 -m service -a 'name=nginx state=started enabled=yes'
systemd示例:
[root@m01~]# ansible web01 -m systemd -a 'name=nginx state=stopped'
[root@m01~]# ansible web01 -m systemd -a 'name=nginx state=started enabled=yes'
daemon_reload: 后台启动
yes
no
六、用户管理模块
1.group 模块
语法
group:
name: somegroup
state: present
absent
gid : 666
示例:
#建组,会随机产生一个gid
[root@m01~]# ansible web01 -m group -a 'name=z state=present'
#修改gid,组名不改即可
[root@m01~]# ansible web01 -m group -a 'name=z gid=1234 state=present'
#删除组
[root@m01~]# ansible web01 -m group -a 'name=z state=absent'
2.user 模块
语法
user:
name: johnd
comment: John Doe #用户注释
uid: 1040
group: admin
shell: /bin/zsh
/sbin/nologin
append: yes #是否使用附加组
create_home:yes #是否创建家目录
remove: yes #移除家目录
expires: 1422403387 #用户的有效时间
enerate_ssh_key: yes
ssh_key_bits: 2048
ssh_key_file: .ssh/id_rsa
password:'123456' #用户的密码
state:present #创建用户
absent #删除用户
示例:
[root@m01~]# ansible web01 -m user -a 'name=xzx uid=998 create_home=yes shell=/sbin/nologin state=present'
[root@m01~]# ansible web01 -m user -a 'name=xzx create_home=yes state=absent'
备注:用户名和用户组名一样的话,删除用户会连同用户一起删除
如果组下有其他用户,不会和用户一起删除
七、其他模块
1.cron 定时任务模块
语法
cron:
name: "check dirs"
minute: "0"
hour: "5,2"
day:
month:
weekday:
job: "ls -alh > /dev/null"
disabled: #是否开启定时任务(是否禁用)注释掉/不删除
state: present
absent
示例:
[root@m01~]# ansible web01 -m cron -a 'name=时间同步 minute=*/5 job="/user/sbin/ntpdate time1.aliyun.com &>/dev/null"'
[root@web01 ~]# crontab -l
#Ansible: 时间同步
*/5 * * * * /user/sbin/ntpdate time1.aliyun.com &>/dev/null
#注释掉
[root@m01~]# ansible web01 -m cron -a 'name=时间同步 minute=*/5 job="/usr/sbin/ntpdate time1.aliyun.com &>/dev/null" disabled=yes'
#删除
[root@m01~]# ansible web01 -m cron -a "name=时间同步 state=absent"
注意⚠️ &>/dev/null 符号和/dev之间不能有空格
2.mount 挂载模块
语法
mount:
path: /mnt/dvd 本地需要挂载的目录
src: /dev/sr0 远程提供的挂载点
fstype: iso9660 挂载类型,一般都是nfs
opts: ro,noauto 自动挂载的参数 ro, noauto
state: present 写入自动挂载,需要重启
mounted 写入了自动挂载,不需要重启,直接挂载了(常用)
unmounted 取消挂载,但不删除自动挂载配置
absent 取消挂载,并删除自动挂载配置(常用)
示例:
#配置主机清单
[root@m01~]# vim /etc/ansible/hosts
[web_group]
web01
web03
[nfs]
nfs ansibl_ssh_pass='1'
[root@m01~]# vim /etc/hosts
10.0.0.7 web01
10.0.0.9 web03
172.16.1.31 nfs
# 服务端配置
#安装nfs
[root@m01~]# ansible nfs -m yum -a 'name=nfs-utils state=present'
#配置
[root@m01~]# ansible nfs -m copy -a 'content="/date 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)" dest=/etc/exports'
#建组 用户 及共享目录
[root@m01~]# ansible nfs -m group -a 'name=www gid=666'
[root@m01~]# ansible nfs -m user -a 'name=www uid=666 group=www create_home=no shell=/sbin/nologin'
[root@m01~]# ansible nfs -m file -a 'path=/date owner=www group=www state=directory'
#启动
[root@m01~]# ansible nfs -m systemd -a 'name=nfs state=started'
#客户端配置
[root@m01~]# ansible web_group -m file -a 'path=/date state=directory'
#挂载
[root@m01~]# ansible web_group -m mount -a 'src=172.16.1.31:/date path=/date fstype=nfs state=mounted'
#验证
[root@web01 ~]# cat /etc/fstab
... ...
172.16.1.31:/date /date nfs defaults 0 0
#卸载
[root@m01~]# ansible web_group -m mount -a 'src=172.16.1.31:/date path=/date state=absent'
3.selinux 模块
#语法
selinux:
state: enforcing #开启
disabled #关闭
permissive #临时关闭
示例:
[root@m01~]# ansible web_group -m selinux -a 'state=disabled'
4.firewalld 模块
语法:
firewalld:
service: https
permanent: yes
state: enabled
disabledzone: dmz
source: 192.0.2.0/24
interface: eth2 #绑定网卡masquerade: yes # IP伪装
rich_rule: rule service name="ftp" audit limit value="1/m" accept
示例:
#开启防火墙
[root@m01~]# ansible web_group -m service -a 'name=firewalld state=started'
#开启http服务
[root@m01~]# ansible web_group -m firewalld -a 'service=nginx state=enabled'
#富规则,允许172.1.1.0网段访问
[root@m01~]# ansible web_group -m firewalld -a 'rich_rule="rule family=ipv4 source address=172.1.1.0/24 accept" state=enabled'
#关闭防火墙
[root@m01~]# ansible web_group -m systemd -a 'name=firewalld state=stopped'
5.unarchive 解压模块
语法
unarchive:
src: foo.tgz 需要解压包的路径
dest: /var/lib/foo 解压到的位置
remote_src: yes 解压包是否在受控端(默认no)
示例:
压缩包在web01上
[root@m01~]# ansible web01 -m unarchive -a 'src=/tmp/WeCenter_3-2-1.zip dest=/tmp/ remote_src=yes'
压缩包在本地m01上
[root@m01~]# ansible web01 -m unarchive -a 'src=/opt/WeCenter_3-2-1.zip dest=/opt/'
6.archive 压缩模块
语法
archive:
path: /path/to/foo 要压缩的文件路径
dest: /path/to/foo.tgz 压缩后存放的位置
format: zip bz2 tar 压缩格式
示例:
[root@m01~]# ansible web01 -m archive -a 'path=/etc/nginx/conf.d/zh.conf dest=/opt/zh'
#指定压缩包格式
[root@m01~]# ansible web01 -m archive -a 'path=/code/pp dest=/opt/code.zip format=zip'
7.setup 模块
#查看服务器所有信息
[root@m01~]# ansible web01 -m setup
常用参数
ansible_all_ipv4_addresses:仅显示ipv4的信息。
ansible_devices:仅显示磁盘设备信息。
ansible_distribution:显示是什么系统,例:centos,suse等。
ansible_distribution_major_version:显示是系统主版本。
ansible_distribution_version:仅显示系统版本。
ansible_machine:显示系统类型,例:32位,还是64位。
ansible_eth0:仅显示eth0的信息。
ansible_hostname:仅显示主机名。
ansible_fqdn:显示完整的主机名。
ansible_kernel:仅显示内核版本。
ansible_lvm:显示lvm相关信息。
ansible_memtotal_mb:显示系统总内存。
ansible_memfree_mb:显示可用系统内存。
ansible_memory_mb:详细显示内存情况。
ansible_swaptotal_mb:显示总的swap内存。
ansible_swapfree_mb:显示swap内存的可用内存。
ansible_mounts:显示系统磁盘挂载情况。
ansible_processor:显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_vcpus:显示cpu个数(只显示总的个数)。
示例:
查看cpu个数
[root@m01~]# ansible web01 -m setup -a 'filter=ansible_processor'
八,Ansible 搭建交作业
1,确认使用的服务器,配置主机清单
[root@m01~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_pass='1'
web02 ansible_ssh_pass='1'
[nfs]
nfs ansible_ssh_pass='1'
[root@m01~]# vim /etc/hosts
10.0.0.7 web01
10.0.0.8 web02
172.16.1.31 nfs
2,准备需要的包
[root@m01~]# ll /package/
-rw-r--r-- 1 root root 28921 2020-11-29 21:07 kaoshi.zip
-rw-r--r-- 1 root root 19889622 2020-11-29 21:07 php.tar.gz
3,准备配置文件
[root@m01~]# yum install -y httpd
[root@m01~]# vim /etc/httpd/conf/httpd.conf
... ...
User www
Group www
4,搭建流程
#1,所有主机创建统一组
ansible 'all' -m group -a 'name=www gid=666 state=present' &&\
#2,所有主机创建统一用户
ansible 'all' -m user -a 'name=www uid=666 group=www create_home=no shell=/sbin/nologin state=present' &&\
#3,下载httpd
ansible 'web_group' -m yum -a 'name=httpd state=present' &&\
#4,配置httpd
ansible 'web_group' -m copy -a 'src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/' &&\
#5,解压php
ansible 'web_group' -m unarchive -a 'src=/package/php.tar.gz dest=/tmp' &&\
#6,安装php
ansible 'web_group' -m shell -a 'yum localinstall -y /tmp/*.rpm' &&\
#7,解压交作业代码
ansible 'web_group' -m unarchive -a 'src=/package/kaoshi.zip dest=/var/www/html'
#8,创建上传作业目录
ansible 'web_group' -m file -a 'path=/var/www/html/upload state=directory'
#9,授权交作业目录
ansible 'web_group' -m file -a 'path=/var/www/html state=directory owner=www group=www recurse=yes'
#10,启动httpd
ansible 'web_group' -m systemd -a 'name=httpd state=started enabled=yes' &&\
#11,服务端下载nfs
ansible nfs -m yum -a 'name=nfs-utils state=present' &&\
#12,服务端配置nfs
ansible nfs -m copy -a 'content="/date 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)" dest=/etc/exports' &&\
#13,服务端创建目录并授权
ansible nfs -m file -a 'path=/date state=directory owner=www group=www' &&\
#14,启动nfs
ansible nfs -m service - a 'name=nfs state=started'
#15,挂载
ansible web_group -m mount -a 'path=/var/www/html/upload src=172.16.1.31:/date fstype=nfs state=mounted'
把以上放在一个脚本里执行
[root@m01~]# vim jiaozuoye.sh
#!/bin/bash
... ...
[root@m01~]# ansible 'all' -m ping
[root@m01~]# sh jiaozuoye.sh
成功后配置hosts 访问
10.0.0.7
10.0.0.8
各上传一张图片
10.0.0.7图省略
查看同步:
[root@web01 ~]# ll /var/www/html/upload
-rw-r--r-- 1 www www 13467 2020-11-30 11:38 1_1.jpg
-rw-r--r-- 1 www www 499181 2020-11-30 11:37 33_33.png
[root@nfs /date]# ll
-rw-r--r-- 1 www www 13467 2020-11-30 11:38 1_1.jpg
-rw-r--r-- 1 www www 499181 2020-11-30 11:37 33_33.png