Ansible常用模块

ad-hoc与常用模块

ad-hoc就是临时命令,执行完成即结束,并不会保存

可以查看多台节点是的进程是否存在

拷贝指定文件至本地

使用范例

ansible 'groups' -m command -a "df -h"

image-20220103175305795

ad-hoc执行过程

1.加载配置文件,默认 /etc/ansible/ansible.cfg
2.读取inventory
3.操作对应的目标主机组;如果组不存在则报错
4.构建对应的py文件,推送到远程目标主机
5.远程主机执行该文件
6.执行完成后,删除对应的py文件
7.像服务端返回最终执行结果

执行状态

返回结果的颜色说明
绿色: 代表被管理端主机没有被修改
黄色: 代表被管理端主机发现变更
红色: 代表出现了故障,注意查看提示

单独项目使用ansible

# 创建项目
cd ~
mkdir project1
cd project1

# 项目配置文件和主机文件
cp /etc/ansible/ansible.cfg .
cp /etc/ansible/hosts  hosts_group

# 修改配置文件
vim ansible.cfg
...
inventory      = ./hosts_group
...

# 查看读取的配置文件
ansible --version

# 执行
ansible all -m ping

Ansible常用模块

常用模块较多,可以使用ansible-doc 模块名查看帮助

command 模块

功能:在远程主机执行 shell 命令,是一个默认模块,可以忽略参数 -m,但是不支持管道命令 |

参数选项含义
chdirchdir /opt执行 ansible 时,切换到指定的目录
createscreates /data/file如果文件在,则跳过执行
removesremoves /data/file如果文件存在,则执行
# 当 /data/opt 不存在时,就会执行 ifconfig eth0 命令
ansible all -m command -a "creates=/data/opt ifconfig eth0"
# 备份: 如果备份的文件存在,则不执行备份的命令;如果文件不存在,则执行备份的命令


# 当 /data/opt 存在时,就会执行 ifconfig eth0 命令
ansible all -m command -a "removes=/data/opt ifconfig eth0"

shell模块

command 支持在这个模块一样能执行,被控端已有的shell命令都可以执行,且支持管道

yum模块

name:  # 软件包名称
  state: # 状态
		present # 安装
		absent # 删除
		latest # 最新版

enablerepo  # 通过哪个仓库获取
disablerepo  # 不使用哪些仓库的包
excludekernel  # kernel排除

使用

# 1.安装vsftpd软件包
ansible all -m yum -a 'name=vsftpd state=present'

# 2.删除vsftpd
ansible all -m yum -a 'name=vsftpd state=absent'

# 3.安装httpd服务,必须从epel仓库中安装(所有的被控都有这个epel仓库)
ansible all -m yum -a 'name=httpd state=present enablerepo=epel'

# 4.更新所有的软件包,唯独kernel程序不更新
ansible all -m yum -a 'name=* state=present exclude="kernel*"'

copy模块

控制端的文件,拷贝到被控端,实现替换

src:      控制端的源文件路径
dest:     被控端的文件路径
owner:    属主
group:    属组
mode:     权限
backup:   备份
validate: 验证
content:   往一个文件写入内容


# 1.更新nfs配置,将控制端的 exports.j2 文件同步到被控端的 /etc/exports
ansible all -m copy -a 'src=./exports.j2 dest=/etc/exports owner=root group=root mode=0644 backup=yes'

# 2.往一个文件中写入内容,如果文件不存在则创建
ansible all -m copy -a 'content="123" dest=/data/test.txt owner=root group=root mode="0600" backup=yes'


# 3.验证sudo配置是否正确(adhoc测试失败):
cat tt.yaml
- hosts: all
  tasks:
  - name: Copy a "sudoers" file on the remote machine for editing
    copy:
      src: ./sudoers
      dest: /etc/sudoers
      validate: /usr/sbin/visudo -csf %s

ansible-ploybook tt.yamy

systemd模块

name                # 服务名称
state               # 服务状态
  started           # 启动
  stopped           # 停止
  restarted         # 重启
  reloaded          # 重载
enabled              # 开启自启动
daemon_reload: yes  # 重新刷新daemon-reload

# 启动nfs并设置开机自启
ansible all -m systemd -a "name=nfs state=started enabled=yes"

# 停止nfs并关闭开机自启动
ansible all -m systemd -a "name=nfs state=stopped enabled=no"

file模块

# 创建文件、创建目录、授权
  file:
    path: 		在被控端创建的路径
    owner: 		属主
    group: 		属组
    mode: 		权限
	state: 		  类型
		touch:    文件
		directory: 目录
		link: 软链接
		hard:硬链接
	recurse: yes 递归授权


# 被控端需要有 www 用户
gropuadd -g 888 www
useradd -u 888 -g 888 www


# 创建一个/data/www 目录,授权为 www 身份
ansible webservers -m file -a 'path=/data/www owner=www group=www mode="0755" state=directory recurse=yes'

# 在 /data/www/ 目录中创建一个文件
ansible webservers -m file -a 'path=/data/www/books.html owner=www group=www mode="0644" state=touch'

group模块

name: 指定组名称
  gid: 指定gid
	state:
		present:创建  默认
		absent:删除


# 指定 gid 为 666 创建 www 组
ansible webservers -m group -a 'name=www gid=666 state=present'

# 创建 mysqldb 组为系统的 gid
ansible webservers -m group -a 'name=mysqldb system=yes state=present'

user模块

user:
  name: 				创建的名称
  uid: 				  指定uid
  group: 				指定基本组
  shell: 				登录shell类型默认/bin/bash
  create_home		是否创建家目录
	password			设定对应的密码,必须是加密后的字符串才行,否则不生效;
	system				系统用户

	groups: admins,dev  附加组
	append: yes			追加

  state: absent		删除
  remove: yes			家目录一起结束



# 创建 www 用户,指定 uid 666,基本组 www ,不创建家目录
ansible webservers -m user -a 'name=www uid=666 group=www shell=/sbin/nologin create_home=no'

# 创建db用户,基本组是root,附加组,adm,sys
ansible webservers -m user -a 'name=db group=root groups=adm,sys append=yes shell=/bin/bash create_home=yes'

# 创建一个ddd用户,密码123,需要正常登录系统
# 生成密码
ansible localhost -m debug -a "msg={{ '123' | password_hash('sha512','salt')}}"

ansible webservers -m user -a 'name=ddd password=$6$salt$jkHSO0tOjmLW0S1NFlw5veSIDRAVsiQQMTrkOKy4xdCCLPNIsHhZkIRlzfzIvKyXeGdOfCBoW1wJZPLyQ9Qx/1 shell=/bin/bash create_home=yes'

# 创建一个dev用户,并为其生成对应的秘钥
ansible webservers -m user -a 'name=dev generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa'

mount模块

src: 源设备路径,或网络地址;
  path: 挂载至本地哪个路径下;
  fstype: 设备类型; nfs
  opts:   挂载的选项
  state:  挂载还是卸载
    present			永久挂载,但没有立即生效
    absent			卸载,临时挂载+永久挂载
    mounted			临时(fstab)挂载
    unmounted		临时卸载

# 将 172.16.1.7 的 /data 目录挂载到 172.16.1.8 /mnt 目录
ansible 172.16.1.8 -m mount -a 'src=172.16.1.7:/data path=/opt fstype=nfs opts=defaults state=mounted'

cron模块

name: 		 描述信息,描述脚本的作用
minute: 	 分钟
hour:		   小时
weekday:	 周
user:		   该任务由哪个用户取运行;默认root
job: 		   任务


# 每天凌晨3点执行 /bin/bash /scripts/client_push_data_server.sh &>/dev/null
ansible webservers -m cron -a 'name="backups app data scripts" hour=03 minute=00 job="/bin/bash /scripts/client_push_data_server.sh &>/dev/null"'

# 删除 backups app data script  执行
ansible webservers -m cron -a 'name="backups app data scripts" hour=03 minute=00 job="/bin/bash /scripts/client_push_data_server.sh &>/dev/null" state=absent'

# 注释 backups app data script  执行
ansible webservers -m cron -a 'name="backups app data scripts" hour=03 minute=00 job="/bin/bash /scripts/client_push_data_server.sh &>/dev/null" disabled=yes'

get_url

get_url:
  url: 下载地址
  dest: 下载到本地的路径;
  mode: 权限;
  checksum:对资源做校验;

# 下载一个资源到本地/tmp目录;
ansible webservers -m get_url -a 'url=http://nginx.org/download/nginx-1.20.2.tar.gz dest=/tmp mode=0666'

# 对下载的资源做验证:
ansible webservers -m get_url -a 'url=http://nginx.org/download/nginx-1.20.2.tar.gz dest=/opt mode=0666 checksum=md5:3bcc5ccdc052c35d0d3c5557cf56c7d2'

unarchive模块

# unarchive解压
unarchive:
  src: 			  控制端的源文件
  dest: 			解压到被控端的路径
remote_src: yes	源文本是否在被控端,yes则在,no则不在

# 将控制端的压缩包,解压到被控端 remote_src: no
ansible webservers -m unarchive -a 'src=./test.tar.gz dest=/mnt'

# 将被控端的压缩包解压到被控端  remote_src: yes   config_vpn_new.zip
ansible webservers -m unarchive -a 'src=/tmp/test.tar.gz dest=/mnt remote_src=yes'

# archive 压缩
# 将被控端的/opt 打包到 /mnt 目录下,并命名为 opt.tar.gz
ansible webservers -m archive -a 'path=/opt dest=/mnt/opt.tar.gz format=gz'

selinux模块

selinux 防火墙模块:
ansible webservers -m selinux -a 'state=disabled'

firewalld模块

zone:		要操作的区域  默认public
	source:	来源地址
    service: 	 服务名称 http,https,sshd,......
	port:		端口
    permanent:	永久生效,但不会立即生效
	immediate:	临时生效;
    state: 		启用和关闭;
		disabled
		enabled

# 让被控端都放行80端口;
ansible webservers -m systemd -a 'name=firewalld state=started'
ansible webservers -m firewalld -a 'port=80/tcp immediate=yes state=present'

# 让被控端都放行https端口;
ansible webservers -m systemd -a 'name=firewalld state=started'
ansible webservers -m firewalld -a 'service=https immediate=yes state=present'

iptables

iptables:
	table: 					  表
    chain: 					链
    source: 				来源IP
	destination				目标IP
	destination_port  目标端口
	protocol	协议
    jump: DROP	动作
	action		如何添加规则
		insert:插入
		append:追加


# 来源IP是192.168.1.1 目标地址 1.1.1.1 目标端口 80  协议 tcp  则拒绝; 规则要写入第一行;
ansible webservers -m iptables -a 'table=filter chain=INPUT source=192.168.1.1/32 destination=1.1.1.1 destination_port=80 protocol=tcp jump=DROP action=insert'


# NAT:SNAT和DNAT:
	DNAT: 如果请求1.1.1:80端口,则DNAT到2.2.2.2:8800
	ansible webservers -m iptables -a 'table=nat chain=PREROUTING protocol=tcp destination=1.1.1.1 destination_port=80 jump=DNAT to_destination="2.2.2.2:8800"'

	DNAT: 如果请求1.1.1:81端口,则DNAT到3.3.3.3:8800
	ansible webservers -m iptables -a 'table=nat chain=PREROUTING protocol=tcp destination=1.1.1.1 destination_port=81 jump=DNAT to_destination="3.3.3.3:8800"'

SNAT:
	POSTROUTING
	iptables -t nat -I POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 5.5.5.5

ansible webservers -m iptables -a 'table=nat chain=POSTROUTING source=172.16.2.0/24 jump=SNAT to_source=6.6.6.6'
ansible webservers -m iptables -a 'table=nat chain=POSTROUTING source=172.16.3.0/24 jump=SNAT to_source=7.7.7.7 action=insert'

yum_repo

yum_repository
	name				  名称,文件名称
	description	  描述,必填
	baseurl				仓库的地址
	gpgcheck			验证开启
	gpgkey


ansible webservers -m yum_repository -a 'name=ansible_nginx description=xxx baseurl="http://nginx.org/packages/centos/$releasever/$basearch/" gpgcheck=yes gpgkey="https://nginx.org/keys/nginx_signing.key"'

hostname

hostname 修改主机名称:
    name: 	修改后的主机名称;

ansible webservers -m hostname -a 'name=web_cluster'

sysctl

sysctl	修改内核参数模块
- sysctl:
    name: vm.swappiness
    value: '5'
    state: present

ansible webservers -m sysctl -a 'name=net.ipv4.ip_forward value=1 state=present'

lineinfile

lineinfile	替换|追加|删除
    path: 					      被控端的路径
    regexp: '^Listen '		正则匹配语法格式
    line: Listen 8080			填充的内容
	state: absent					  删除
	insertafter: '^#Listen '
	insertbefore: '^www.*80/tcp'

# 替换httpd.conf文件中, ^Listen   为  Linsten 8080
ansible webservers -m lineinfile -a 'path=/etc/httpd/conf/httpd.conf regexp="^Listen" line="Listen 8080"'

# 给主机增加一个网关
ansible webservers -m lineinfile -a 'path=/etc/sysconfig/network-scripts/ifcfg-eth1 line="GATEWAY=172.16.1.200"'

# 删除主机的网关
ansible webservers -m lineinfile -a 'path=/etc/sysconfig/network-scripts/ifcfg-eth1 regexp="^GATEWAY" state=absent'

# 给主机增加一个网关,但需要增加到ONBOOT下面
ansible webservers -m lineinfile -a 'path=/etc/sysconfig/network-scripts/ifcfg-eth1 insertafter="ONBOOT=yes" line="GATEWAY=172.16.1.200"'

# 给主机增加一个网关,但需要增加到ONBOOT上面
ansible webservers -m lineinfile -a 'path=/etc/sysconfig/network-scripts/ifcfg-eth1 insertbefore="ONBOOT=yes" line="test=172.16.1.200"'