一、安装部署ansible

 

yum install -y ansible

 


 

二、向目标端批量推送公钥

准备两个yml文件

send-pubkey.yml

- hosts: all
  remote_user: root   # 连接远程主机的用户,密码就是文件中设置好的 ansible_ssh_pass 的值
  vars_files:
    - foo.yml    # 设置用户名密码 由于我是root用户且密码全为 123456  ansible_ssh_pass: 123456
  tasks:
  - name: Set authorized key taken from file
    authorized_key:    # 发送公钥的模块
      user: root            # 给这个用户发送公钥
      state: present
      key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"    # 发送本地用户的公钥路径

foo.yml(对端主机的密码)

ansible_ssh_pass: 123456

编辑/etc/ansible/hosts,维护要推送公钥的主机列表

[RemoteHost]
192.168.1.1
192.168.1.2
192.168.1.3

编辑/etc/ansible/ansible.cfg,不检测对方公钥

[defaults]
host_key_checking = False  #取消注释

在ansible服务器生成公钥

ssh-keygen
一直回车即可

执行ansible命令推送公钥

ansible-playbook -i /etc/ansible/hosts send-pubkey.yml

 


 

 

三、ansible命令简单使用

1、在目标端执行shell命令:

ansible RemoteHost -m shell -a 'ls ~/'

命令解释:
RemoteHost:默认在/etc/ansible/hosts里维护的目标组
-m shell:指定使用shell模块
-a 'ls ~/':执行 ls ~/ 命令

返回结果:

192.168.20.1 | CHANGED | rc=0 >>
anaconda-ks.cfg
Python-3.7.2
Python-3.7.2.tgz

 

2、把本地创建一个shell脚本推送到目标端:

vim /tmp/test.sh

#!/bin/bash
echo `date`
ansible RemoteHost -m copy -a 'src=/tmp/test.sh dest=/tmp/test.sh mode=0755'
命令解释:
RemoteHost:默认在/etc/ansible/hosts里维护的目标组
-m copy:指定使用copy模块
-a 'src=/tmp/test.sh dest=/tmp/test.sh mode=0755'  源地址src,目标地址dest,给文件设置755权限

返回结果:

192.168.20.1 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "1a6e4af02dba1bda6fc8e23031d4447efeba0ade", 
    "dest": "/tmp/test.sh", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "edfaa4371316af8c5ba354e708fe8a97", 
    "mode": "0755", 
    "owner": "root", 
    "size": 48, 
    "src": "/root/.ansible/tmp/ansible-tmp-1704436813.57-147687-110384761720795/source", 
    "state": "file", 
    "uid": 0
}

3、执行目标端脚本

ansible RemoteHost -m shell -a 'sh /tmp/test.sh'

返回结果:

192.168.20.1 | CHANGED | rc=0 >>
Fri Jan 5 14:42:47 CST 2024

 


 

 

四、ansible-play 剧本使用示例

1、创建yaml文件

vim test1.yaml

2、写剧本

---     #yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: first play     #定义一个play的名称,可省略
  gather_facts: false    #设置不进行facts信息收集,这可以加快执行速度,可省略
  hosts: RemoteHost    #指定要执行任务的被管理主机组,如多个主机组用冒号分隔
  remote_user: root    #指定被管理主机上执行任务的用户
  tasks:     #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行
   - name: test ping    #自定义任务名称
     ping:     #指定ping模块,服务器ping目标端是否通畅
     ignore_errors: True     #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务
   - name: copy file      #把服务器文件推送到目标端
     copy: 'src=/tmp/test.sh dest=/tmp/test.sh mode=0755'
   - name: restart filebeat
     service: name=filebeat state=restarted

3、执行剧本

ansible-playbook test1.yaml

 4、执行结果:

PLAY [first play] *********************************************************************************************************
TASK [test ping] **********************************************************************************************************
ok: [192.168.20.1]

TASK [copy file] **********************************************************************************************************
changed: [192.168.20.1]

TASK [restart filebeat] ***************************************************************************************************
changed: [192.168.20.1]

PLAY RECAP ****************************************************************************************************************

192.168.20.1                : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 

五、ansible-play 变量

1、全局变量--重启目标端的filebeat服务,{{app}}是变量名,需要传参

---     #yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: test     #定义一个play的名称,可省略
  gather_facts: false    #设置不进行facts信息收集,这可以加快执行速度,可省略
  hosts: test    #指定要执行任务的被管理主机组,如多个主机组用冒号分隔
  remote_user: root    #指定被管理主机上执行任务的用户
  tasks:     #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行
   - name: restart filebeat
     service: name={{app}} state=restarted

执行剧本时通过-e传参

ansible-playbook playbook-test.yml -e "app=filebeat"

 

2.1、剧本变量--通过vars关键字设置变量

---     #yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: test     #定义一个play的名称,可省略
  gather_facts: false    #设置不进行facts信息收集,这可以加快执行速度,可省略
  hosts: test    #指定要执行任务的被管理主机组,如多个主机组用冒号分隔
  remote_user: root    #指定被管理主机上执行任务的用户
  vars:
    app: filebeat
  tasks:     #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行
   - name: restart filebeat
     service: name={{app}} state=restarted

2.2、剧本变量--通过vars_files关键字设置变量,需要提前写好vars_files文件

定义vars_files文件
##定义vars_files
[root@clinet test1]# cat vars_file.yml
users:
  bjones:
    first_name: bob
    last_name: jons
    home_dirs: /users/bjones
  
  acook:
    first_name: Anne
    last_name: Cook
    home_dirs: /users/accok
 
 
##yml文件
[root@clinet test1]# cat vars.yml
- hosts: db
  vars_files:
    - /root/ansibel-test/test1/vars_file.yml                      #最好为绝对路径
  
  tasks:
    - name: debug message..
      debug:
        msg: 
          - '{{ users["bjones"] ["first_name"]}}'               #两个[]之间以空格分隔

 

3.1、资产变量之主机变量--只针对这一台主机生效

[test]
192.168.20.1 app=filebeat

3.2、资产变量之主机组变量--针对这个主机组中的所有主机生效

[test]
192.168.20.1
192.168.20.2
[test:vars]
app=filebeat

4、Facts变量

Facts变量不包含在前文中介绍的全局变量、剧本变量及资产变量之内
  Facts变量不需要我们人为去声明变量名及赋值
  它的声明和赋值完全由Ansible 中的Facts模块帮我们完成
  类似于资产变量中的主机变量,它收集了有关被管理服务器的
  操作系统的版本、服务器的IP地址、主机名,磁盘的使用情况、CPU个数、内存大小
  等等有关被管理服务器的私有信息
  在每次PlayBook运行的时候都会发现在PlayBook执行前都会有一个Gathering Facts的过程
  这个过程就是收集被管理服务器的Facts信息过程

手动收集本机Facts变量(-c指定连接类型)
  ansible all -i localhost, -c local -m setup

过滤Facts变量
  通过刚刚的手动收集Facts,我们发现facts 信息量很大
  能不能有针对性的显示我们想要的信息呢?  
  可以通过使用Facts 模块中的filter参数去过滤我们想要的信息

仅获取服务器的内存情况信息(memory)
  ansible 10.11.67.19 -i hosts -m setup -a “filter=memory”
  仅获取服务器的磁盘挂载情况
  ansible 10.11.67.19 -i hosts -m setup -a “filter=mount”

Playbook中使用Facts变量
  默认情况下,在执行PlayBook的时候,它会去自动的获取每台被管理服务器的facts信息,可以像使用其他变量一样,去使用facts 变量
  —
  - name: print facts variable
  hosts: all
  tasks:
  - name: print facts variable
  debug:
  msg: “The default IPV4 address is {{ ansible_default_ipv4.address }}”

在PlayBook中去关闭Facts 变量的获取
  gather_facts: no
  若在整个PlayBook 的执行过程中,完全未使用过Facts 变量,此时我们可以将其关闭,以加快PlayBook的执行速度
  —
  - name: a play example
  hosts: all
  # 关闭 facts 变量收集功能
  gather_facts: no
  remote_user: root
  tasks:

 

5、注册变量

注册变量往往用于保存一个task任务的执行结果, 以便于debug时使用
  或者将此次task任务的结果作为条件,判断是否执行其他task任务
  注册变量在PlayBook中通过register关键字去实现。
- hosts: db:web
  
  tasks:
    - name: debug message..
      shell: netstat -ntpl
      register: system_info
 
    - name: get_info
      debug:
        msg:
          - '{{ system_info}}'

执行结果:

[root@clinet test1]# ansible-playbook vars.yml
PLAY [db:web] ********************************************************************************************************
 
TASK [Gathering Facts] ***********************************************************************************************
ok: [10.10.10.134]
ok: [10.10.10.135]
ok: [10.10.10.136]
 
TASK [debug message..] ***********************************************************************************************
changed: [10.10.10.134]
changed: [10.10.10.135]
changed: [10.10.10.136]
 
TASK [get_info] ******************************************************************************************************
ok: [10.10.10.135] => {
    "msg": [
        {
            "changed": true, 
            "cmd": "netstat -ntpl", 
            "delta": "0:00:00.009932", 
            "end": "2022-10-28 16:38:44.957768", 
            "failed": false, 
            "rc": 0, 
            "start": "2022-10-28 16:38:44.947836", 
            "stderr": "", 
            "stderr_lines": [], 
            "stdout": "Active Internet connections (only servers)\nProto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    \ntcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1523/sshd           \ntcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1702/master         \ntcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      957/rpcbind         \ntcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1558/nginx: master  \ntcp6       0      0 :::22                   :::*                    LISTEN      1523/sshd           \ntcp6       0      0 ::1:25                  :::*                    LISTEN      1702/master         \ntcp6       0      0 :::111                  :::*                    LISTEN      957/rpcbind         \ntcp6       0      0 :::80                   :::*                    LISTEN      1558/nginx: master  ", 
            "stdout_lines": [
                "Active Internet connections (only servers)", 
                "Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    ", 
                "tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1523/sshd           ", 
                "tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1702/master         ", 
                "tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      957/rpcbind         ", 
                "tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1558/nginx: master  ", 
                "tcp6       0      0 :::22                   :::*                    LISTEN      1523/sshd           ", 
                "tcp6       0      0 ::1:25                  :::*                    LISTEN      1702/master         ", 
                "tcp6       0      0 :::111                  :::*                    LISTEN      957/rpcbind         ", 
                "tcp6       0      0 :::80                   :::*                    LISTEN      1558/nginx: master  "
            ]
        }
    ]
}
ok: [10.10.10.136] => {
    "msg": [
        {
            "changed": true, 
            "cmd": "netstat -ntpl", 
            "delta": "0:00:00.021772", 
            "end": "2022-10-28 16:38:45.896962", 
            "failed": false, 
            "rc": 0, 
            "start": "2022-10-28 16:38:45.875190", 
            "stderr": "", 
            "stderr_lines": [], 
            "stdout": "Active Internet connections (only servers)\nProto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    \ntcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      997/rpcbind         \ntcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1533/sshd           \ntcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1716/master         \ntcp6       0      0 :::111                  :::*                    LISTEN      997/rpcbind         \ntcp6       0      0 :::22                   :::*                    LISTEN      1533/sshd           \ntcp6       0      0 ::1:25                  :::*                    LISTEN      1716/master         ", 
            "stdout_lines": [
                "Active Internet connections (only servers)", 
                "Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    ", 
                "tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      997/rpcbind         ", 
                "tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1533/sshd           ", 
                "tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1716/master         ", 
                "tcp6       0      0 :::111                  :::*                    LISTEN      997/rpcbind         ", 
                "tcp6       0      0 :::22                   :::*                    LISTEN      1533/sshd           ", 
                "tcp6       0      0 ::1:25                  :::*                    LISTEN      1716/master         "
            ]
        }
    ]
}
ok: [10.10.10.134] => {
    "msg": [
        {
            "changed": true, 
            "cmd": "netstat -ntpl", 
            "delta": "0:00:00.008834", 
            "end": "2022-10-28 16:38:45.406496", 
            "failed": false, 
            "rc": 0, 
            "start": "2022-10-28 16:38:45.397662", 
            "stderr": "", 
            "stderr_lines": [], 
            "stdout": "Active Internet connections (only servers)\nProto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    \ntcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1557/nginx: master  \ntcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1525/sshd           \ntcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1117/rpcbind        \ntcp6       0      0 :::80                   :::*                    LISTEN      1557/nginx: master  \ntcp6       0      0 :::22                   :::*                    LISTEN      1525/sshd           \ntcp6       0      0 ::1:25                  :::*                    LISTEN      1701/master         \ntcp6       0      0 :::111                  :::*                    LISTEN      1117/rpcbind        ", 
            "stdout_lines": [
                "Active Internet connections (only servers)", 
                "Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    ", 
                "tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1557/nginx: master  ", 
                "tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1525/sshd           ", 
                "tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1117/rpcbind        ", 
                "tcp6       0      0 :::80                   :::*                    LISTEN      1557/nginx: master  ", 
                "tcp6       0      0 :::22                   :::*                    LISTEN      1525/sshd           ", 
                "tcp6       0      0 ::1:25                  :::*                    LISTEN      1701/master         ", 
                "tcp6       0      0 :::111                  :::*                    LISTEN      1117/rpcbind        "
            ]
        }
    ]
}
 
PLAY RECAP ***********************************************************************************************************
10.10.10.134               : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
10.10.10.135               : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
10.10.10.136               : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 

变量的优先级

当一个变量同时在全局变量、剧本变量和资产变量中定义时,优先级最高的是全局变量;其次是剧本变量;最后才是资产变量。