课堂笔记(ansible安装、模块、剧本) -10.23.note
架构:将邮件服务、网站服务、存储服务等结合起来组成一个完整的架构
Ansible 不需要客户端的代理,只需要使用 ssh 就能够进行连接通信
控制节点:部署了 Ansible的机器叫做控制节点,在上面进行运行任务
被管理节点:自动化任务去执行的对象服务器
Inventory:主机清单,要管理的主机都写在主机清单中
playbook:使用 ymal语言编写的,用于在被管理节点上执行的脚本
准备环境
三台 Linux 服务器,一台控制节点,两台被控节点
1、初始化配置
(1)在服务器上 安装 Ansible 、python:
apt install -y ansible python3 python3-passlibsystemctl start dbus
systemctl enable dbusapt install -y curl wget sshpass(2)配置客户端IP,在客户端上安装 ssh 、python3:
apt install -y ssh python3
2、书写hosts 文件:
(1)init 格式:
mkdir /etc/ansible
vim /etc/ansible/hosts //默认路径
[LIN]
192.168.10.[11:13]
[LIN:vars]
ansible_ssh_pass = "Skills39!"
ansible_python_interpreter = /usr/bin/python3(2)yaml 格式:
mkdir -p /data/linux
vim /data/linux/inventory.yaml
---
all:
hosts:
192.168.10.11:
192.168.10.12:
192.168.10.13:
...
在 yaml 中 ,以段横杆开头的的是列表
ansible all --list-hosts //列出主机清单 ping 测试:
ansible LIN -m ping
选项:
-k: 手动输入 客户端ssh密码
-u: 手动指定 客户端用户名ansible LIN -m ping -u elysia -k·列出配置文件 支持的选项
ansible-config init·忽略 ssh 指纹检查:
vim /etc/ansible/ansible.cfg
[defaults]
inventory = /etc/ansible/hosts
library = /usr/share/ansible
forks = 50
remote_user = elysia
sudo_user = root
remote_port = 22
host_key_checking = False
timeout = 60
log_path = /var/log/ansible.log
·手动指定 hosts文件:
ansible all -m ping -i /data/linux/inventory.yaml -u elysia -k
·每次都手动指定过于麻烦,可以写进 hosts yaml文件中:
all:
hosts:
LIN1:
ansible_host: 192.168.10.11
ansible_user: elysia
ansible_pass: Skills39!
ansible_port: 22
LIN2:
ansible_host: 192.168.10.12
ansible_user: elysia
ansible_pass: Skills39!
ansible_port: 22
LIN3:
ansible_host: 192.168.10.13
ansible_user: elysia
ansible_pass: Skills39!
ansible_port: 22然后直接就能够运行:
cp inventory.yaml /etc/ansible/hosts
ansible -m ping all -u elysia -k3、创建剧本:
模块是在管理上,由二进制去运行的代码管理单位
任何开发语言,理论上都能为ansible提供模块
(1)ping 剧本
· 创建一个剧本:
---
- name: PING PlayBook
hosts: all
remote_user: elysia
tasks:
- name: Ping the Hosts
ping:
·运行:
ansible-playbook 01-ping.yml -u elysia -k
# Skills39!# 在执行剧本之前,ansible 会检查客户端的环境,以保证幂等性
(2)echo “ Hello world! ” 剧本:
---
- name: PING PlayBook
hosts: all
remote_user: elysia
tasks:
- name: Ping the Hosts
ping:
- name: Print hello world
debug:
msg: "Hello world!"
·运行:
ansible-playbook 01-ping.yml -u elysia -k
# Skills39!
4、将 key 传输给客户端,这样就无需手动输入密码:、
使用 copy 模块不建议,建议使用 ssh_key 专用的模块
---
- name: Scp SSH Key public
hosts: all
tasks:
- name: Crete .ssh directory
file:
path: ~/.ssh
state: directory
mode: 0700
- name: Scp SSH Key pubilc
copy:
src: ~/.ssh/id_rsa.pub
dest: ~/.ssh/authorized_keys
mode: 0600
·运行:
ansible-playbook 02-ssh.yml -u elysia -k
接下来再配置,将不用再输入密码
·颜色:
1、绿色:执行成功,但是没有对 被控端进行修改
2、黄色:执行成功,但是对 被控端 造成了修改
3、红色:执行失败
如果模块有 state ,尽量要加 state
5、安装配置 apache2:
红帽:yum
debian:apt
package 模块:自动调用linux系统的apt 或者 yum
---
- name: setup apache2
hosts: all
tasks:
- name: Install apache2
apt:
name: apache2
state: present
update_cache: false
#update_cache: noansible-playbook 03-apt_apache2.yml
执行以上的剧本,执行会失败
因为普通用户没有权限
需要提权:
(1)命令提权:
ansible-playbook 03-apt_apache2.yml -b -K --become-method=su
(2)在剧本中提权:
vim 03-apt_apache2.yml提权:
通过变量传递:
mkdir /etc/ansible/group_vars
vim /etc/ansible/all.yml //以all 或者以组的名字命名
ansible_user: elysia
ansible_become: True
ansible_become_method: su
ansible_become_password: Skills39!然后就可以直接运行了,all.yml 会被直接调用:
在剧本中添加:
gather_facts: False
能够跳过 环境、信息 收集
手动引用变量文件:
vars_files /etc/ansible/group/vars/all.yml如何获取帮助:
1、Linux 中 ansible 自带的文档:ansible-doc -l(列出linux中ansible内置模块)
ansible-doc -l | grep copy
模块尽量写全名,为了避免有相同简写的模块
'''
两种方法:
方法一:
直接copy Ansible主控端上的源,到被控端
方法二:
使用 ansible.builtin.apt_repository 模块
'''vim /etc/fstab
将 noauto 改为 auto
systemctl daemon-reload handlers 写在所有任务之后
当 notify 任务执行后,就会通知去执行 handlers 任务
当有多个任务都触发 handlers 操作时,handlers 只会触发一次
handlers 会等待所有任务执行完,才会执行notify 之后,能够加一个参数,使 handlers 立即执行可以在一个剧本中书写两个或多个 playbook- 命令行中:
1.
ansible all -b -m ansible.builtin.file -a 'dest=/etc/apt/sources.list.d/media_cdrom0.list state=a
bsent'
命令行中不能使用冒号,要使用等于号
