一、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是什么?
二、Ansible安装与配置
2.1 Ansible安装方式
2.1.1 rpm安装
首先确保有阿里epel源
[root@manager ~]
[root@manager ~]
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 ~]
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
2.1.2 pip安装
2.1.3 配置文件
[root@manager ~]
/etc/ansible/ansible.cfg
/etc/ansible/hosts
配置文件的优先级:
读取配置文件先后顺序
第一步读取: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]
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 ~]
hosts (2):
10.0.0.7
10.0.0.8
[root@manager ~]
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 ~]
hosts (6):
www001.example.com
www002.example.com
www003.example.com
www004.example.com
www005.example.com
www006.example.com
[root@manager ~]
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 ~]
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-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]
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]
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模块
- creates 可以用于备份文件,如果备份文件存在,则不备份,否则备份。
- 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"'
|