文章目录
- [0. 老男孩思想-男女性需求差异](#0. 老男孩思想-男女性需求差异)
- [1. 手动指定客户机密码](#1. 手动指定客户机密码)
- [2. 批量更新主机名](#2. 批量更新主机名)
-
- [2.1 hostname模块](#2.1 hostname模块)
- [2.2 添加主机清单变量](#2.2 添加主机清单变量)
- [2.3 编写批量修改主机名剧本](#2.3 编写批量修改主机名剧本)
- [2.4 修改hosts文件](#2.4 修改hosts文件)
- [2.5 分发hosts文件剧本](#2.5 分发hosts文件剧本)
- [3. ansible的并行进程数](#3. ansible的并行进程数)
- [4. 分组设置主机密码-主机清单分组变量](#4. 分组设置主机密码-主机清单分组变量)
- [5. 案例:ansible批量管理案例400台机器](#5. 案例:ansible批量管理案例400台机器)
- [6. ansible循环](#6. ansible循环)
-
- [6.1 标准循环 (with_items)](#6.1 标准循环 (with_items))
-
- [6.1.1 添加多个用户](#6.1.1 添加多个用户)
- [6.2 字典列表循环](#6.2 字典列表循环)
-
- [6.2.1 添加多个用户,并添加uid、group](#6.2.1 添加多个用户,并添加uid、group)
- [7. ansible判断](#7. ansible判断)
-
- [7.1 根据系统类型安装软件](#7.1 根据系统类型安装软件)
- [7.2 根据register变量判断系统类型](#7.2 根据register变量判断系统类型)
- [8. jinja2模板](#8. jinja2模板)
-
- [8.1 分发keepalived配置文件](#8.1 分发keepalived配置文件)
-
- [8.1.1 编写keepalived配置文件j2模板](#8.1.1 编写keepalived配置文件j2模板)
- [8.1.2 编写分发文件剧本](#8.1.2 编写分发文件剧本)
- [8.2 分发NFS配置文件](#8.2 分发NFS配置文件)
-
- [8.2.1 为nfs主机组添加分组变量](#8.2.1 为nfs主机组添加分组变量)
- [8.2.2 编写nfs配置文件的j2模板](#8.2.2 编写nfs配置文件的j2模板)
- [8.2.3 编写分发配置文件剧本](#8.2.3 编写分发配置文件剧本)
- [8.3 分发rsync服务的配置文件](#8.3 分发rsync服务的配置文件)
-
- [8.3.1 编写rsync主机组分组变量](#8.3.1 编写rsync主机组分组变量)
- [8.3.2 编写rsync服务配置文件的j2模板](#8.3.2 编写rsync服务配置文件的j2模板)
- [8.3.3 编写分发剧本](#8.3.3 编写分发剧本)
- [8.4 分发多个nginx域名配置文件](#8.4 分发多个nginx域名配置文件)
-
- [8.4.1 编写web主机组分组变量](#8.4.1 编写web主机组分组变量)
- [8.4.2 编写nginx域名配置文件的j2模板](#8.4.2 编写nginx域名配置文件的j2模板)
- [8.4.3 编写分发配置文件剧本](#8.4.3 编写分发配置文件剧本)
- [9. 思维导图](#9. 思维导图)
0. 老男孩思想-男女性需求差异
女生对待性的方面往往不如男生强烈,特别是28岁以上的女生;只有满足女生其他生理和心理需求,对方才会把性交给你保管,所以说性是她喜欢你之后附属给你的东西。而男生恰恰相反,常常就是想到性然后就有了性的冲动,进而喜欢上一个女生。 ---老男孩

1. 手动指定客户机密码
- 当服务机密码认证失败后,可以手动指定客户机的用户名和密码
shell
[root@m02 /server/ans/playbooks]# cat hosts
......
[bak]
172.16.1.41 ansible_user=root ansible_port=22 ansible_password=SKX2554.
......
- 测试
shell
[root@m02 /server/ans/playbooks]# ansible -i hosts bak -m ping
......
172.16.1.41 | SUCCESS => {
"changed": false,
"ping": "pong"
}
2. 批量更新主机名
2.1 hostname模块
hostname
模块 用于管理目标主机的系统主机名(hostname)。它可以修改 临时主机名 和 永久主机名。
- 模块参数:
- name:新主机名
- use:生效范围
- runtime:临时生效
- persistent:永久生效
2.2 添加主机清单变量
shell
[root@m02 /server/ans/playbooks]# cat hosts
[lb]
172.16.1.5 hostname=lb01.oldboy.cn
172.16.1.6 hostname=lb02.oldboy.cn
[web]
172.16.1.7 hostname=web01.oldboy.cn
172.16.1.8 hostname=web02.oldboy.cn
172.16.1.9 hostname=web03.oldboy.cn
[db]
172.16.1.51 hostname=db01.oldboy.cn
172.16.1.52 hostname=db02.oldboy.cn
[nfs]
172.16.1.31 hostname=nfs01.oldboy.cn
[bak]
172.16.1.41 ansible_user=root ansible_port=22 ansible_password=SKX2554. hostname=backup.oldboy.cn
[data:children]
db
nfs
bak
2.3 编写批量修改主机名剧本
shell
[root@m02 /server/ans/playbooks]# cat 07.hostname.yaml
- hosts: all
gather_facts: false
tasks:
- name: 1.修改主机名
hostname:
name: "{{ hostname }}"
- name: 2.检查主机名
shell: "hostname"
register: host #注册变量,记录执行命令的结果
- name: 3.输出主机名
debug:
msg: "{{ host.stdout }}"
- 测试:
shell
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 07.hostname.yaml
......
TASK [1.修改主机名] *********************************************************************************************
ok: [172.16.1.9]
ok: [172.16.1.6]
fatal: [172.16.1.52]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 172.16.1.52 port 22: No route to host", "unreachable": true}
ok: [172.16.1.7]
ok: [172.16.1.8]
ok: [172.16.1.31]
ok: [172.16.1.5]
ok: [172.16.1.51]
ok: [172.16.1.41]
TASK [2.检查主机名] *****************************************************************************************
changed: [172.16.1.9]
changed: [172.16.1.8]
changed: [172.16.1.7]
changed: [172.16.1.6]
changed: [172.16.1.5]
changed: [172.16.1.51]
changed: [172.16.1.31]
changed: [172.16.1.41]
TASK [3.输出主机名] *********************************************************************************************
ok: [172.16.1.5] => {
"msg": "lb01.oldboy.cn"
}
ok: [172.16.1.6] => {
"msg": "lb02.oldboy.cn"
}
ok: [172.16.1.7] => {
"msg": "web01.oldboy.cn"
}
ok: [172.16.1.8] => {
"msg": "web02.oldboy.cn"
}
ok: [172.16.1.9] => {
"msg": "web03.oldboy.cn"
}
ok: [172.16.1.51] => {
"msg": "db01.oldboy.cn"
}
......
2.4 修改hosts文件
shell
[root@m02 /server/ans/playbooks]# sed -rn -i '/^172/s# (.*)# \1 \1.oldboy.cn#gp' /etc/hosts
[root@m02 /server/ans/playbooks]# cat /etc/hosts
172.16.1.5 lb01 lb01.oldboy.cn
172.16.1.6 lb02 lb02.oldboy.cn
172.16.1.7 web01 web01.oldboy.cn
172.16.1.8 web02 web02.oldboy.cn
172.16.1.9 web03 web03.oldboy.cn
172.16.1.31 nfs01 nfs01.oldboy.cn
172.16.1.41 backup backup.oldboy.cn
172.16.1.51 db01 db01.oldboy.cn
172.16.1.61 m01 m01.oldboy.cn
2.5 分发hosts文件剧本
shell
[root@m02 /server/ans/playbooks]# cat 07.hosts.yaml
- hosts: all
gather_facts: false
tasks:
- name: 1.分发hosts文件
copy:
src: /etc/hosts
dest: /etc/hosts
- 测试:
shell
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 07.hosts.yaml
......
3. ansible的并行进程数
- ansible默认并发执行的主机数是5
- 选项:
- -f,表示ansible的并发进程数,默认是5
4. 分组设置主机密码-主机清单分组变量
- 编辑主机清单,添加分组变量
shell
[root@m02 /server/ans/playbooks]# cat hosts
[lb]
172.16.1.5 hostname=lb01.oldboy.cn
172.16.1.6 hostname=lb02.oldboy.cn
[web]
172.16.1.7 hostname=web01.oldboy.cn
172.16.1.8 hostname=web02.oldboy.cn
172.16.1.9 hostname=web03.oldboy.cn
[db]
172.16.1.51 hostname=db01.oldboy.cn
172.16.1.52 hostname=db02.oldboy.cn
[nfs]
172.16.1.31 hostname=nfs01.oldboy.cn
[bak]
172.16.1.41 ansible_user=root ansible_port=22 ansible_password=SKX2554. hostname=backup.oldboy.cn
[data:children]
db
nfs
bak
[web:vars]
password=SKX2554.
[db:vars]
password=SKX2555.
- 编写批量更新主机密码剧本:
shell
[root@m02 /server/ans/playbooks]# cat 08.passwd.yaml
- hosts: web,db
become: yes ## 需要 root 权限
tasks:
- name: 1.更新主机密码
user:
name: root
password: "{{ password | password_hash('sha512') }}"
5. 案例:ansible批量管理案例400台机器
- 这些机器密码不相同
[ansible批量管理案例400台机器项目](https://www.yuque.com/lidao996/sre/kva28zochq01n7l6)
6. ansible循环
6.1 标准循环 (with_items)
- 剧本选项:
- with_items
- loop
- 两个选项用法相同
6.1.1 添加多个用户
- 剧本:
shell
[root@m02 /server/ans/playbooks]# cat 09.add_users.yaml
- hosts: all
tasks:
- name: 1.添加多个用户
user:
name: "{{ item }}" # 该变量名不能改变
state: present
with_items: #循环的变量值
- oldboy01
- oldboy02
- oldboy03
- 测试并检查:
shell
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 09.add_users.yaml
......
[root@m02 /server/ans/playbooks]# ansible -i hosts all -m shell -a "tail -n 3 /etc/passwd"
......
172.16.1.7 | CHANGED | rc=0 >>
oldboy01:x:3001:3001::/home/oldboy01:/bin/bash
oldboy02:x:3002:3002::/home/oldboy02:/bin/bash
oldboy03:x:3003:3003::/home/oldboy03:/bin/bash
172.16.1.8 | CHANGED | rc=0 >>
oldboy01:x:3002:3002::/home/oldboy01:/bin/bash
oldboy02:x:3003:3003::/home/oldboy02:/bin/bash
oldboy03:x:3004:3004::/home/oldboy03:/bin/bash
......
6.2 字典列表循环
- 循环列表是字典结构
- 参数值是item的子标签
6.2.1 添加多个用户,并添加uid、group
- 剧本:
shell
[root@m02 /server/ans/playbooks]# cat 10.add_users.yaml
- hosts: all
tasks:
- name: 1.添加用户组
group:
name: "{{ item.name }}"
gid: "{{ item.gid }}"
state: present
loop:
- { name: oldboy01, gid: 2010 }
- { name: oldboy02, gid: 2011 }
- { name: oldboy03, gid: 2012 }
- name: 2.添加多个用户,并指定uid,group
user:
name: "{{ item.name }}"
uid: "{{ item.uid }}"
group: "{{ item.name }}"
state: present
loop:
- { name: oldboy01, uid: 2010 }
- { name: oldboy02, uid: 2011 }
- { name: oldboy03, uid: 2012 }
- 执行并测试:
shell
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 10.add_users.yaml
......
[root@m02 /server/ans/playbooks]# ansible -i hosts all -m shell -a 'tail -n 4 /etc/passwd'
......
172.16.1.6 | CHANGED | rc=0 >>
skx:x:3001:3001::/home/skx:/sbin/nologin
oldboy01:x:2010:2010::/home/oldboy01:/bin/bash
oldboy02:x:2011:2011::/home/oldboy02:/bin/bash
oldboy03:x:2012:2012::/home/oldboy03:/bin/bash
172.16.1.8 | CHANGED | rc=0 >>
skx:x:3001:3001::/home/skx:/sbin/nologin
oldboy01:x:2010:2010::/home/oldboy01:/bin/bash
oldboy02:x:2011:2011::/home/oldboy02:/bin/bash
oldboy03:x:2012:2012::/home/oldboy03:/bin/bash
......
7. ansible判断
在 Ansible 中,判断(条件控制)主要通过
when
语句实现,它允许你根据变量、事实(facts)或任务执行结果来决定是否执行某个任务或模块。
变量值 is match("pattern")
:使用 正则表达式 匹配字符串
7.1 根据系统类型安装软件
- 系统类型可由facts变量获取
shell
[root@m02 /server/ans/playbooks]# cat 11.install_soft.yaml
- hosts: all
gather_facts: true
tasks:
- name: 1.判断是否是红帽系统
yum:
name: cowsay,sl,nmap #可以安装多个软件
state: latest
when: ( ansible_distribution is match("Kylin|Rocky") )
- name: 2.判断是否是Ubuntu系统
apt:
name: cmatrix,nyancat
state: latest
update_cache: yes
when: ( ansible_distribution is match("Ubuntu|Debian") )
- 执行并测试:
shell
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 11.install_soft.yaml
......
TASK [1.判断是否是红帽系统] *************************************************************************************
changed: [172.16.1.6]
changed: [172.16.1.5]
changed: [172.16.1.7]
changed: [172.16.1.9]
changed: [172.16.1.8]
changed: [172.16.1.51]
changed: [172.16.1.41]
changed: [172.16.1.31]
changed: [172.16.1.52]
TASK [2.判断是否是Ubuntu系统] ***********************************************************************************
skipping: [172.16.1.5] # 根据when选项判断,不符合会直接跳过
skipping: [172.16.1.6]
skipping: [172.16.1.7]
skipping: [172.16.1.8]
skipping: [172.16.1.9]
skipping: [172.16.1.51]
skipping: [172.16.1.52]
skipping: [172.16.1.31]
skipping: [172.16.1.41]
......
[root@m02 /server/ans/playbooks]# ssh web01 animalsay 孙克旭很强
Authorized users only. All activities may be monitored and reported.
_______
< 孙克旭很强 >
-------
\ _
\ (_)
\ ^__^ / \
\ (oo)\_____/_\ \
(__)\ ) /
||----w ((
|| ||>>
7.2 根据register变量判断系统类型
shell
[root@m02 /server/ans/playbooks]# cat 11.install_soft_register.yaml
- hosts: all
gather_facts: false
tasks:
- name: 1.获取主机版本
shell: "hostnamectl |grep 'Operating System' |awk -F ':' '{print $2}'|xargs"
register: os_name
- name: 2.输出变量信息
debug:
msg: "{{ os_name.stdout }}"
- name: 3.判断是否是红帽系统
yum:
name: cowsay,sl,nmap
state: latest
when: ( os_name.stdout is match ("Kylin|Rocky") )
- name: 4.判断是否是Ubuntu系统
apt:
name: cmatrix,nyancat
state: latest
when: ( os_name.stdout is match ("Ubuntu|Debian") )
8. jinja2模板
Jinja2 是 Ansible 使用的强大模板引擎,它允许你在配置文件中动态插入变量、使用控制结构和过滤器。
8.1 分发keepalived配置文件
8.1.1 编写keepalived配置文件j2模板
shell
[root@m02 /server/ans/playbooks/files]# cat keepalived.conf.j2
global_defs {
router_id {{ansible_hostname}} # ansible变量
}
{% if ansible_hostname in ["lb01","lb01.oldboy.cn"] %} #j2的判断语句
vrrp_script check_lb.sh {
script /server/scripts/check_lb.sh
interval 2
weight 1
user root
}
{% endif %}
vrrp_instance lb_vip_3 {
{% if ansible_hostname in ["lb01","lb01.oldboy.cn"] %}
state MASTER
priority 100
#lidao master
{% elif ansible_hostname in ["lb02","lb02.oldboy.cn"] %}
state BACKUP
priority 50
#lidao backup
{% endif %}
interface ens33
virtual_router_id 51
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24 dev ens33 label ens33:1
}
{% if ansible_hostname in ["lb01","lb01.oldboy.cn"] %}
track_script {
check_lb.sh
}
{% endif %}
}
8.1.2 编写分发文件剧本
- 使用template模板
shell
[root@m02 /server/ans/playbooks]# cat 12.keepalived.yaml
- hosts: lb
gather_facts: true #j2模板需要facts变量
tasks:
- name: 1.install #下载keepalived
yum:
name: keepalived
state: present
- name: 2.conf #分发keepalived配置文件
template:
src: ./files/keepalived.conf.j2
dest: /etc/keepalived/keepalived.conf
backup: true
- name: 3.start #启动keepalived
systemd:
name: keepalived
enabled: true
state: restarted
8.2 分发NFS配置文件
8.2.1 为nfs主机组添加分组变量
shell
# 注意路径
[root@m02 /server/ans/playbooks/group_vars]# cat nfs.yaml
# nfs共享目录
nfs_dirs:
- /nfsdata/
- /nfs/pics
- /nfs/blog
- /nfs/zrlog
8.2.2 编写nfs配置文件的j2模板
shell
[root@m02 /server/ans/playbooks/files]# cat exports.j2
{% for dir in nfs_dirs %} #变量名是分组变量
#nfs服务端目录 {{ dir }}
{{dir}} 172.16.1.0/24(rw,all_squash)
{% endfor %}
8.2.3 编写分发配置文件剧本
shell
[root@m02 /server/ans/playbooks]# cat 13.nfs_exports.yml
- hosts: nfs
tasks:
- name: template exports file #分发nfs配置文件
template:
src: ./files/exports.j2
dest: /etc/exports
backup: true
- 执行并检查:
shell
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 13.nfs_exports.yml
......
[root@m02 /server/ans/playbooks]# ssh nfs01 cat /etc/exports
Authorized users only. All activities may be monitored and reported.
#nfs服务端目录 /nfsdata/
/nfsdata/ 172.16.1.0/24(rw,all_squash)
#nfs服务端目录 /nfs/pics
/nfs/pics 172.16.1.0/24(rw,all_squash)
#nfs服务端目录 /nfs/blog
/nfs/blog 172.16.1.0/24(rw,all_squash)
#nfs服务端目录 /nfs/zrlog
/nfs/zrlog 172.16.1.0/24(rw,all_squash)
8.3 分发rsync服务的配置文件
8.3.1 编写rsync主机组分组变量
shell
[root@m02 /server/ans/playbooks/group_vars]# cat bak.yaml
# rsync配置文件中的模块名称和路径
rsync_module:
- { name: "data", dir: "/data" }
- { name: "backup", dir: "/backup" }
- { name: "blog", dir: "/nfs/backup/blog" }
8.3.2 编写rsync服务配置文件的j2模板
shell
[root@m02 /server/ans/playbooks/files]# cat rsyncd.conf.j2
fake super = yes
uid = rsync
gid = rsync
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
#hosts allow = 10.0.0.0/24
#hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#####################################
{% for dir in rsync_module %}
[{{dir.name}}]
comment = by skx
path = {{ dir.dir }}
{% endfor %}
8.3.3 编写分发剧本
shell
[root@m02 /server/ans/playbooks]# cat 14.rsync.yaml
- hosts: bak
gather_facts: false
tasks:
- name: 1.分发rsync配置文件
template:
src: ./files/rsyncd.conf.j2
dest: /etc/rsyncd.conf
backup: true
- 测试:
shell
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 14.rsync.yaml
......
[root@m02 /server/ans/playbooks]# ssh backup cat /etc/rsyncd.conf
Authorized users only. All activities may be monitored and reported.
fake super = yes
uid = rsync
gid = rsync
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
#hosts allow = 10.0.0.0/24
#hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#####################################
[data]
comment = by skx
path = /data
[backup]
comment = by skx
path = /backup
[blog]
comment = by skx
path = /nfs/backup/blog
8.4 分发多个nginx域名配置文件
8.4.1 编写web主机组分组变量
shell
[root@m02 /server/ans/playbooks/group_vars]# cat web.yaml
# nginx域名
domain:
- bird
- game
- blog
8.4.2 编写nginx域名配置文件的j2模板
shell
[root@m02 /server/ans/playbooks/files]# cat oldboy.conf.j2
server {
listen 80;
server_name {{ item }}.oldboy.cn;
root /app/code/{{ item }};
# 设置错误日志
error_log /var/log/nginx/{{ item }}.oldboy.cn-error.log notice;
# 设置访问日志
access_log /var/log/nginx/{{ item }}.oldboy.cn-access.log main;
location / {
index index.html;
}
}
8.4.3 编写分发配置文件剧本
shell
[root@m02 /server/ans/playbooks]# cat 15.nginx_conf.yaml
- hosts: web
gather_facts: false
tasks:
- name: 1.分发配置文件
template:
src: ./files/oldboy.cn.conf.j2
dest: /tmp/{{ item }}.oldboy.cn.conf
loop: "{{ domain }}"
- 执行:
shell
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 15.nginx_conf.yaml
......
PLAY [web] ******************************************************************************************************
TASK [1.分发配置文件] *******************************************************************************************
changed: [172.16.1.9] => (item=bird)
changed: [172.16.1.7] => (item=bird)
changed: [172.16.1.8] => (item=bird)
changed: [172.16.1.9] => (item=game)
changed: [172.16.1.8] => (item=game)
changed: [172.16.1.7] => (item=game)
changed: [172.16.1.9] => (item=blog)
......
9. 思维导图
https://kdocs.cn/join/gpuxq6r?f=101\r\n邀请你加入共享群「老男孩教育Linux运维99期-孙克旭」一起进行文档协作