课堂笔记(ansible安装、模块、剧本) -10.23.note

noteId: 464B5B37E1544904A4C46E078F17B97A · 原始路径:/ALL/Ansible 自动化管理/Ansible 配置合集/Ansible 自动化管理-Linux/课堂笔记(ansible安装、模块、剧本) -10.23.note · 图片:3 · 附件待处理:0

 
架构:将邮件服务、网站服务、存储服务等结合起来组成一个完整的架构
 
Ansible 不需要客户端的代理,只需要使用 ssh 就能够进行连接通信
 
控制节点:部署了 Ansible的机器叫做控制节点,在上面进行运行任务
被管理节点:自动化任务去执行的对象服务器
Inventory:主机清单,要管理的主机都写在主机清单中
playbook:使用 ymal语言编写的,用于在被管理节点上执行的脚本
 
准备环境
三台 Linux 服务器,一台控制节点,两台被控节点
 
 
 
 
 
1、初始化配置
(1)在服务器上 安装 Ansible 、python:
apt install -y ansible python3 python3-passlib
 
 
systemctl start dbus
systemctl enable dbus
 
apt 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 -k
 
 
 
3、创建剧本:
 
模块是在管理上,由二进制去运行的代码管理单位
任何开发语言,理论上都能为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: no
ansible-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
 
 
ansible all -b -m ansible.builtin.file -a 'dest=/etc/apt/sources.list.d/media_cdrom0.list state=a
bsent'  
命令行中不能使用冒号,要使用等于号