Ansible

一、Ansible 介绍

1.1什么是Ansible

Ansible是一个IT自动化的"配置管理工具",自动化主要体现在(Ansible集成了丰富模块,以及强大的功能组件,可以通过一个命令行完成一系列的操作。进而能减少我们重复性的工作,以提高工作的效率。

1.2 Ansible主要功能

  • 批量执行远程命令,可以对N多台主机同时进行命令的执行。
  • 批量配置软件服务,可以进行自动化的方式配置和管理服务。
  • 实现软件开发功能,jumpserver底层使用ansible来实现的自动化管理。
  • 编排高级的IT任务,Ansible的Playbook是一门编程语言,可以用来描绘一套IT架构。

1.3 Ansible的特点

  • 容易学习:无代理,不像saltstack 既要学客户端与服务端,还需要学习客户端与服务端中间通讯协议;

  • 操作灵活: Ansible有较多的模块,提供了丰富的功能、playbook则提供类似于编程语言的复杂功能;

  • 简单易用:体现在Ansible一个命令可以完成很多事情;

  • 安全可靠:因为Ansible使用了SSH协议进行通讯,既稳定也安全;

  • 移植性高:可以将写好的playbook拷贝至任意机器进行执行;

  • 幂等性:一个任务执行1遍和执行n遍效果一样,不会因为重复执行带来意外情况;

    缺点:
    幂等性: 每次的描述一种状态后,服务器会按照你所期望的状态去运行;出了问题无法回退; a --b
    需要重新在描述一次状态,然后执行,以实现回退的效果;b - a

    如果链接的主机较多,执行的速度会比较的慢; 串行执行; saltstack并行执行;

1.4 Ansible基础架构

Ansible架构中的控制节点、被控制节点、inventroy、ad-hoc、playbook.、connection Protocol是什么?

在这里插入图片描述
z

二、Ansible安装与配置

2.1 Ansible安装方式

2.1.1 rpm安装

首先确保有阿里epel源

[root@manager ~]# yum install ansible -y

[root@manager ~]# ansible --version # 安装
ansible 2.9.25
  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 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]



[root@manager ~]# ansible localhost -m ping  # 查看版本
localhost | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

2.1.2 pip安装

在这里插入图片描述

2.1.3 配置文件

[root@manager ~]# rpm -qc ansible
/etc/ansible/ansible.cfg # 默认主配置文件
/etc/ansible/hosts # 默认主机清单文件
	#inventory      = /etc/ansible/hosts			路径重新定义
	#inventory      = ./hosts					路径重新定义
	#library        = /usr/share/my_modules/
	#module_utils   = /usr/share/my_module_utils/
	#remote_tmp     = ~/.ansible/tmp  # 推送到远程的.py文件暂存路径
	#local_tmp      = ~/.ansible/tmp  # 本地暂存路径
	#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
	#forks          = 5					调整并行的主机数量
	#host_key_checking = False		# 打开配置,第一次连接不提示(不用输入yes/no)								
	#roles_path    = /etc/ansible/roles


配置文件的优先级:
# nearly all parameters can be overridden in ansible-playbook
# or with command line flags. ansible will read ANSIBLE_CONFIG,
# ansible.cfg in the current working directory, .ansible.cfg in
# the home directory or /etc/ansible/ansible.cfg, whichever it
# finds first


读取配置文件先后顺序

第一步读取:ANSIBLE_CONFIG
第二步读取:当前项目目录下的ansible.cfg
第三步读取:当前用户家目录下的 .ansible.cfg 
第四步读取: /etc/ansible/ansible.cfg

验证:

[root@manager ~]# export ANSIBLE_CONFIG=/tmp/ansible.cfg
[root@manager ~]# touch /tmp/ansible.cfg
[root@manager ~]# ansible --version
ansible 2.9.25
  config file = /tmp/ansible.cfg
[root@manager ~]# unset ANSIBLE_CONFIG	# 取消


为项目单独定义配置文件,非常的重要;
[root@manager ~]# mkdir project1
[root@manager ~]# cd project1/
[root@manager project1]# touch ansible.cfg
[root@manager project1]# ansible --version
ansible 2.9.25
  config file = /root/project1/ansible.cfg
  
  
# 为当前执行的用户家目录植入一个配置文件;
[root@manager ~]# touch ~/.ansible.cfg
[root@manager ~]# ansible --version
ansible 2.9.25
  config file = /root/.ansible.cfg


# 默认的配置文件加载路径,优先级是最低的
[root@manager project1]# rm -f ~/.ansible.cfg
[root@manager ~]# ansible --version
ansible 2.9.25
  config file = /etc/ansible/ansible.cfg

2.3 Ansible Inventory

2.3.1 Inventory是什么

Inventory 文件主要用来填写被管理主机以及主机组信息;(逻辑上定义);upstream默认Inventory文件为/etc/ansible/hosts;
当然也可以自定义一个文件,当执行ansible 命令时使用-i选项指定(Inventory 文件位置;
自定义主机清单方式

172.16.1.7   # 定义单个主机

[webservers]  # web主机组
10.0.0.7
10.0.0.8

[dbservers] # 主句库主机组
172.16.1.51
172.16.1.63
db-[99:101]-node.example.com


[test]  # 测试
www[001:006].example.com

查看上面的主机清单:

[root@manager ~]# ansible webservers --list-host
  hosts (2):
    10.0.0.7
    10.0.0.8

[root@manager ~]# ansible dbservers --list-host
  hosts (5):
    172.16.1.51
    172.16.1.63
    db-99-node.example.com
    db-100-node.example.com
    db-101-node.example.com

[root@manager ~]# ansible test --list-host
  hosts (6):
    www001.example.com
    www002.example.com
    www003.example.com
    www004.example.com
    www005.example.com
    www006.example.com

[root@manager ~]# ansible webservers -m ping 
The authenticity of host '10.0.0.8 (10.0.0.8)' can't be established.
ECDSA key fingerprint is SHA256:QuJ7qm0EadIP5Imbbeoz5J8v08TBfQnubgeXYt4DEpE.
ECDSA key fingerprint is MD5:33:02:fe:d5:af:56:4a:97:74:cb:08:74:ed:de:9c:3c.
Are you sure you want to continue connecting (yes/no)? The authenticity of host '10.0.0.7 (10.0.0.7)' can't be established.
ECDSA key fingerprint is SHA256:QuJ7qm0EadIP5Imbbeoz5J8v08TBfQnubgeXYt4DEpE.
ECDSA key fingerprint is MD5:33:02:fe:d5:af:56:4a:97:74:cb:08:74:ed:de:9c:3c.
Are you sure you want to continue connecting (yes/no)? yes
10.0.0.8 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added '10.0.0.8' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", 
    "unreachable": true
}


# 连接不上,这是因为我们没有登录或者免密连接

2.3.2 Inventory-密码连接方式

方式1. 指定主机P,指定主机端口,指定主机用户名、密码;


1.首先需要在主配置文件中打开 host_key_checking = False
2.编写清单文件
cat /etc/ansible/hosts
[webservers]
10.0.0.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=1
10.0.0.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=1


3.测试连接
[root@manager ~]# ansible webservers -m ping
10.0.0.8 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
10.0.0.7 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}



也可以这样

[webservers]
10.0.0.7 
10.0.0.8 

[webservers:vars]  # 定义个变量池
nsible_ssh_port=22 
ansible_ssh_user=root 
ansible_ssh_pass=1

方式2:
先免密,然后直接定义逻辑组即可完成通讯;

[root@manager ~]# ssh-keygen 
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.8
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.63
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.51


# 资产配置
[webservers]
10.0.0.7 
10.0.0.8 


[root@manager .ssh]# ansible webservers -m ping
10.0.0.7 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
10.0.0.8 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}



[root@manager ansible]# ansible dbservers -m ping
172.16.1.51 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
172.16.1.63 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

2.3.3 ansible 语句


inventory如何匹配主机组的方式;
[root@manager ~]# ansible all -m ping   # ping所有清单
[root@manager ~]# ansible "web*" -m ping
[root@manager ~]# ansible  "webservers:&dbservers" -m ping			# 并且;
[root@manager ~]# ansible  "webservers:dbservers"  -m ping			# 或者;
[root@manager ~]#  ansible  'webservers:!dbservers' -m ping   # 非
[root@manager ~]# ansible "~(web|db).*" -m ping

ansible常用参数:

ansible常用参数
-m:要执行的模块,默认为command
-a:指定模块的参数
-u:ssh连接的用户名,默认用root,ansible.cfg中可以配置
-b,--become:变成那个用户身份,不提示密码
-k:提示输入ssh登录密码,当使用密码验证的时候用
-s:sudo运行


-U:sudo到哪个用户,默认为root
-K:提示输入sudo密码,当不是NOPASSWD模式时使用
-C:只是测试一下会改变什么内容,不会真正去执行
-c:连接类型(default=smart)
-f:fork多少进程并发处理,默认为5-i:指定hosts文件路径,默认default=/etc/ansible/hosts
-I:指定pattern,对已匹配的主机中再过滤一次
-list-host:只打印有哪些主机会执行这个命令,不会实际执行
-M:要执行的模块路径,默认为/usr/share/ansible


-o:压缩输出,摘要输出
--private-key:私钥路径
-T:ssh连接超时时间,默认是10-t:日志输出到该目录,日志文件名以主机命名
-v:显示详细日志

3.2.4 使用普通用户管理被控制端

在这里插入图片描述
场景说明: ansible使用tom普通用户统一管理所有的被控端节点;
1.首先控制端,被控端,都需要有tom用户;
⒉将控制端tom用户的公钥推送到被控端tom用户下,使普通用户能进行免密码登录;
3.所有主机的tom用户都必须添加sudo权限。
4.修改控制端/etc/ansible/ansible.cfg主配置文件配置普通用户提权;

[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False

三、Ansible ad-hoc与常用模块

3.1 ad-hoc基本介绍

3.1.1 ad-hoc是什么

ad-hoc简而言之就是“临时命令”,执行完即结束,并不会保存;

  • 应用场景1:查看多台节点的进程是否存在;
  • 应用场景2:拷贝指定的文件至本地;

3.1.2 ad-hoc命令使用

命令示例: ansible 'groups' -m command -a 'df -h',含义如下图所示;
在这里插入图片描述

3.1.3 ad-hoc执行过程

1.加载自己的配置文件,默认/etc/angible/ansible.cfg;
2.查找对应的主机配置文件,找到要执行的主机或者组;
3.加载自己对应的模块文件,如command ;
4.通过 ansible将模块或命令生成对应的临时 py 文件,并将该文件传输至远程服务器对应执行用户$HOME/.ansib1e/tmp/ansible-tmp-number/xXX.PY;
5.执行用户家目录的.py文件;
·6.给文件+x执行;
7.执行并返回结果;
8.删除临时py文件,sleep 0退出;

3.1.4 ad-hoc执行状态

使用ad-hoc 执行一次远程命令,注意观察返回结果的颜色;

  • 绿色:代表被管理端主机没有被修改
  • 黄色:代表被管理端主机发现变更
  • 红色:代表出现了故障,注意查看提示

3.2 Ansible常用模块

ansible有着诸多的模块,虽然模块众多,但最为常用的模块也就20-30个左右;

ad-hoc: 模块:
	0.测试					shell  | command
	0.下载					get_url
	1.安装					yum  | yum_repository
	2.配置					copy | template
	3.初始化				    file	创建文件,创建目录,授权
	4.用户|组				user   group 
	4.启动					systemd 
	6.挂载					mount
	7.定时任务				cron
	8.防火墙				    firewalld | iptables
	9.文件内容修改			lineinfile
    10. mysql | haproxy

3.2.1 command模块

在这里插入图片描述

  1. creates 可以用于备份文件,如果备份文件存在,则不备份,否则备份。
  2. removes 判断该命令是否存在,如果存在就启动该命令或应用,如果不存在就不执行;

功能:在远程主机执行shell命令;此为默认模块,可忽略-m command选项;
注意:不支持管道命令

[root@manager ~]# ansible localhost -m command -a "chdir=/root echo $PWD"
localhost | CHANGED | rc=0 >>
/root


[root@manager ~]# ansible webservers -m command -a "chdir=/root echo $PWD"
10.0.0.7 | CHANGED | rc=0 >>
/root
10.0.0.8 | CHANGED | rc=0 >>
/root



[root@manager ~]# mkdir /tmp/test
[root@manager ~]# ansible localhost -m command -a "creates=/tmp/test ifconfig eth0"
localhost | SUCCESS | rc=0 >>
skipped, since /tmp/test exists


[root@manager ~]# ansible localhost -m command -a "removes=/tmp/test ifconfig eth0"
localhost | CHANGED | rc=0 >>
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.62  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::20c:29ff:fec3:3cac  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:c3:3c:ac  txqueuelen 1000  (Ethernet)
        RX packets 89911  bytes 48632993 (46.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 25410  bytes 17240124 (16.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

3.2.2 shell模块:

shell支持  |管道符号;
command并不支持该类符号;
什么命令都可以执行  (shell命令);

两个模块都是非幂等性。

3.2.3 yum 安装模块

安装:yum:
	name:			软件包名称
	state:			状态
		present		安装
		absent		删除
		latest		最新版
		
		enablerepo		通过哪个仓库获取
		disablerepo		不使用哪些仓库的包
		exclude			kernel排除

1.安装 vsftpd

[root@manager ~]# ansible webservers -m yum -a 'name=vsftpd state=present'

2.删除vsftpd

[root@manager ~]# ansible webservers -m yum -a "name=vsftpd state=absent"

3.安装httpd服务,必须从epel仓库中安装(所有的被控都有这个epel仓库)

[root@manager ~]# ansible webservers -m yum -a "name=httpd state=absent enablerepo=epel"

4.更新所有的软件包,唯独kernel程序不更新;

[root@manager ~]# ansible webservers -m yum -a 'name=* state=present exclude="kernel*"'

3.2.4 copy 配置模块

配置:copy:(控制端的文件,拷贝到被控端,实现替换;)
	src:   控制端的源文件路径;
	dest: 被控端的文件路径;
    owner: 属主
    group: 属组
    mode:  权限
	backup: 备份;
	validate:验证;
	content		
	

1.更新nfs配置,将控制端的exports.j2 文件同步到 被控端的 /etc/exports 
[root@manager ansible_project]# cat exports.j2 
/data 172.16.1.0/24(rw,sync, all_quash,anonuid=666, anongid=666)


ansible webservers -m copy -a 'src=./exports.j2 dest=/etc/exports owner=root group=root mode=0644 backup=yes' # 被控制端会生成一个备份文件,方便逆向操作

2.往一个文件中写入内容的;  rsync.pass    1
ansible webservers -m copy -a 'content="oldxu.net123" dest=/etc/rsync.pass owner=root group=root mode="0600" backup=yes


3.验证sudo配置是否正确(adhoc测试失败): 如果语法正确则推送,否则不推送
[root@manager project]# cat tt.yaml 
- hosts: webservers
  tasks:
  - name: Copy a "sudoers" file on the remote machine for editing
    copy:
      src: ./sudoers
      dest: /etc/sudoers
      validate: /usr/sbin/visudo -csf %s

3.2.5 systemd 控制模块

启动:systemd
	 name			服务名称
	 state			服务状态
		started		启动
		stopped		停止
		restarted	重启
		reloaded	重载
	enabled			开启自启动|  yes 启   no 不
	daemon_reload: yes 重新加载配置文件


1.启动服务,并加入开机自启动
ansible webservers -m systemd -a 'name=nfs state=started enabled=yes'

2.停止服务,并关闭开机自启动
ansible webservers -m systemd -a 'name=nfs state=stopped enabled=no'

3.2.6 file 创建文件及目录

初始化:file
	创建文件:
	创建目录:
	授权:

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

前置:
	[root@web01 ~]# useradd www -u 666
	[root@web01 ~]# useradd -u 666 -g 666 www

1.创建一个/data目录,授权为www身份
[root@manager ansible_project]# ansible webservers -m file -a 'path=/data owner=www group=www mode=0755 state=directory recurse=yes'


2./data目录中创建一个文件
[root@manager ansible_project]# ansible webservers -m file -a "path=/data/file owner=www group=www mode=0644 state=touch"


3.2.7 group 创建组

用户组:group
	name: 指定组名称
	gid: 指定gid
	system: 是否为系统组
	state:
		present:创建  默认
		absent:删除

		
[root@manager ~]# ansible webservers -m group -a "name=www gid=666 state=present"
[root@manager ~]# ansible webservers -m group -a 'name=mysqldb system=yes state=present'

3.2.8 user 创建用户

用户:user
	  user:
	    name: 				创建的名称
	    comment             描述
	    uid: 				指定uid
	    group: 				指定基本组
		shell: 				登录shell类型默认/bin/bash
		create_home			是否创建家目录
		password			设定对应的密码,必须是加密后的字符串才行,否则不生效;
		system				是否为系统用户
		
		groups: admins,dev  附加组
		append: yes			追加
	   
	    state: absent		删除
	    remove: yes			家目录一起结束
		
		generate_ssh_key
		ssh_key_bits
		ssh_key_file
1.创建jim用户,无家目录,不需要登录 组www uid 888
[root@manager ~]# ansible webservers -m user -a "name=jim uid=888 group=www create_home=no shell=/sbin/nologin"

2.创建db用户,基本组是root,附加组,adm,sys
[root@manager ~]# ansible webservers -m user -a "name=db group=root groups=adm,sys append=yes shell=/bin/bash create_home=yes"


3.创建一个ddd用户,密码123,需要正常登录系统;


生成加密密码
[root@manager ~]# ansible localhost -m debug -a "msg={{ '123' | password_hash('sha512','hello')}}"
localhost | SUCCESS => {
    "msg": "$6$hello$kQYOFoiIh2iUOccqsAP6h6MlzeB8krASgaVJrLlIsCbUaazEPu3VMrCsyG4rcMCg4BpVoQBHXfIulsexoyDGk1"

[root@manager ~]# ansible webservers -m user -a 'name=ddd shell=/bin/bash create_home=yes password=$6$hello$kQYOFoiIh2iUOccqsAP6h6MlzeB8krASgaVJrLlIsCbUaazEPu3VMrCsyG4rcMCg4BpVoQBHXfIulsexoyDGk1'  # 单引号



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


3.2.9 mount


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

1.172.16.1.7/data+目录挂载到  172.16.1.8 /opt目录;
ansible 172.16.1.8 -m mount -a 'src=172.16.1.7:/data path=/opt fstype=nfs opts=defaults state=mounted

3.3.0 cron 定时任务

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


1.每天凌晨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"'

[root@web01 ~]# crontab  -l
#Ansible: backups app data scripts
00 03 * * * /bin/bash /scripts/client_push_data_server.sh &>/dev/null


2.删除 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'


3.注释 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'


3.3.1 get_url 下载模块

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


1.下载一个资源到本地/tmp目录;
ansible webservers -m get_url -a 'url=http://fj.xuliangwei.com/config_vpn_new.zip dest=/tmp mode=0666'


2.对下载的资源做验证:
ansible webservers -m get_url -a 'url=http://fj.xuliangwei.com/config_vpn_new.zip dest=/opt mode=0666 checksum=md5:7107b0e2e01facb067842a6c4c7ffa31'

3.3.2 unarchive 解压与 archvie 压缩

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

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

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


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

3.3.3 selinux 关闭防火墙

selinux 防火墙模块:
	state:
		enforcing # 开启
		disabled  # 关闭
ansible webservers -m selinux -a 'state=disabled'

3.3.4 firewalld防火墙

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

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


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

3.3.5 iptables

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


1.来源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'


2.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'

3.3.6 yum_repository 创建yum源

建立yum仓库的模块:

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"'

3.3.7 hostenamectl 批量修改主机名称

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

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

3.3.8 sysctl 修改内核参数

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

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

3.3.9 lineinfile 修改文件内容

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

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

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

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

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

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

3.4.0 动态剔除haproxy 节点

- hosts: "webservers"
  serial: 1
  vars:
    - backend_name: web_cluste # 代理池名称

  tasks:
 # 下线节点
    - name: stop haproxy webcluster pool node
      haproxy:
        socket: /var/lib/haproxy/stats
        backend: "backend_name"
        state: disabled
        host: "{{ inventory_hostname }}"
      delegate_to: "{{ item }}"	
      loop: "{{ groups['lbservers']}}"

3.4.1 探测服务端口存活性

 # 检测nginx是否已经关闭,端口是否存活
    - name: check port state
      wait_for:
        port: "{{ service_port }}"
        state: stopped

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值