自动化运维管理工具 Ansible-----【inventory 主机清单和playbook剧本】

慈云数据 2024-05-13 技术支持 82 0

目录

一、inventory 主机清单

1.1inventory 中的变量

1.1.1主机变量

1.1.2组变量

1.1.3组嵌套

二、Ansible 的脚本 ------ playbook(剧本)

2.1 playbook介绍

2.2playbook格式

2.3playbooks 的组成

2.4playbook编写

2.5运行playbook

2.5.1ansible-playbook命令使用

​2.6playbook定义、引用变量

2.7指定远程主机sudo切换用户

2.8when条件判断

2.8.1调用command模块shutdown服务

2.8.2调用service模块关闭httpd服务

2.9迭代

2.9.1批量创建目录

2.9.2批量创建文件

2.9.3批量创建目录、批量创建多个用户,并加入指定的组


环境准备

服务器类型IP地址需要安装的组件
Ansible管理服务器192.168.246.7Ansible
被管理客户端192.168.246.8
被管理客户端192.168.246.10

一、inventory 主机清单

Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内

如果是名称类似的主机,可以使用列表的方式表示各个主机
vim /etc/ansible/hosts
[webservers]
192.168.246.8:2222			#冒号后定义远程连接端口,默认是ssh的22端口
192.168.246.1[1:5]			#范围是:192.168.246.11到192.168.246.15
[dbservers]
db-[a:f].example.org		#支持匹配 a~f

1.1inventory 中的变量

Inventory变量名含义
ansible_hostansible连接节点时的IP地址
ansible_port连接对方的端口号,ssh连接时默认为22
ansible_user

连接对方主机时使用的主机名。

不指定时,将使用执行ansible或ansible-playbook命令的用户

ansible_passwd连接时的用户的ssh密码,仅在未使用密钥对验证的情况下有效
ansible_ssh_private_key_file指定密钥认证ssh连接时的私钥文件
ansible_ssh_common_args提供给ssh、sftp、 scp命令的额外参数
ansible_become允许进行权限提升
ansible_become_method指定提升权限的方式,例如可使用sudo/su/runas等方式
ansible_become_user提升为哪个用户的权限,默认提升为root
ansible_become_password提升为指定用户权限时的密码

1.1.1主机变量

​写法1:
[webservers]
192.168.246.8 ansible_port=22 ansible_user=root ansible_password=abc123
192.168.246.10 ansible_port=22 ansible_user=root ansible_password=abc123
#webservers组中被控制端192.168.246.8的端口号为22登录时用户是root密码为abc123
写法2:
[webservers]
192.168.246.1[1:2] ansible_port=22 ansible_user=root ansible_password=abc123
#如果是名称类似的主机,可以使用列表的方式标识各个主机
#不建立将密码直接写入配置,不安全
写法3:
[webservers]
192.168.246.8:22
192.168.246.10:1212
#默认ssh管理时的端口为22,若不是22则直接在被管理ip后加冒号和对应端口号

写法一:修改端口

写法二:

1.1.2组变量

[webservers:vars]     
ansible_user=root
ansible_password=abc123
#表示webservers 组内所有主机定义变量控制时使用root账户密码为abc123
[all:vars]       
ansible_port=22
#表示为所有组的所有主机定义变量使用ssh远程管理时都是22端口

修改被控制端口为1212

再去ansible主机检测

1.1.3组嵌套

[nginx]   #nginx组
192.168.246.8
192.168.246.9
[httpd]   #httpd组
192.168.246.11
192.168.246.12
#组内嵌为web
[web:children]
nginx
httpd
#表示web组的成员即children的直译‘孩子’包括nginx和httpd组

进行检测

二、Ansible 的脚本 ------ playbook(剧本)

2.1 playbook介绍

playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的详细描述,执行其中的tasks,可以让远端主机达到预期的状态。

playbook是由一个或多个”play”组成的列表。 当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。

ansible通过不同的模块实现相应的管理,管理的方式通过定义的清单文件(hosts)所管理的主机包括认证的方式连接的端口等。所有的功能都是通过调用不同的模块(modules)来完成不同的功能的。不管是执行单条命令还是play-book都是基于清单文件。

1.playbook 是一个由yml语法编写的文本文件,它由play和task 两部分组成。

play:主要定义要操作主机或者主机组

task: 主要定义对主机或主机组具体执行的任务,可以是一个任务,也可以是多个任务(模块)

playbook是由一个或多个模块组成的,使用多个不同的模块,共同完成一件事情。

Playbook通过yaml语法识别描述的状态文件,扩展名是yaml

Ansible Playbook(剧本)是Ansible 的核心组件之一,是一种以 YAML 格式编写的自动化任务描述文件。

  • 每个 Playbook 由一个或多个 Play 组成。
  • 在每个 Play 下面,通过 tasks 关键字来定义一组任务。
  • 每个任务由一个或多个模块组成,用于在远程主机上实现自动化部署、配置和管理等操作

    2.2playbook格式

    playbook由YMAL语言编写。YMAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。

    一个剧本里面可以有多个play,每个play只能有一个tasks,每个tasks可以有多个name。

    yaml三板斧

    (1)缩进:yaml使用一个固定的缩进风格表示层级结构,每个缩进由两个空格组成,不能使用tab键

    (2)冒号: 以冒号结尾的除外,其他所有冒号后面所有必须有空格。

    (3)短横线:表示列表项,使用一个短横线加一个空格作为一个列表项,多个项使用同样的缩进级别作为同一列表。

    2.3playbooks 的组成

    • Tasks:任务,即通过 task 调用 ansible 的模块将多个操作组织在一个playbook 中运行
    • Variables:变量
    • Templates:模板
    • Handlers:处理器,当 changed 状态条件满足时,(notify)触发执行的操作。
    • Roles:角色

      2.4playbook编写

      注意修改sshd的端口

      vim test1.yaml
      ---     #yaml文件以---开头,以表明这是一个yaml文件,可省略
      - name: first play     #定义一个play的名称,可省略
        gather_facts: false    #设置不进行facts信息收集,这可以加快执行速度,可省略
        hosts: webservers    #指定要执行任务的被管理主机组,如多个主机组用冒号分隔
        remote_user: root    #指定被管理主机上执行任务的用户
        tasks:     #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行
         - name: test connection    #自定义任务名称
           ping:     #使用 module: [options] 格式来定义一个任务
         - name: disable selinux
           command: '/sbin/setenforce 0'    #command模块和shell模块无需使用key=value格式
           ignore_errors: True     #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务
         - name: disable firewalld
           service: name=firewalld state=stopped    #使用 module: options 格式来定义任务,option使用key=value格式
         - name: install httpd
           yum: name=httpd state=latest
         - name: install configuration file for httpd
           copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf    #这里需要一个事先准备好的/opt/httpd.conf文件
           notify: "restart httpd"    #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
         - name: start httpd service
           service: enabled=true name=httpd state=started
        handlers:     #handlers中定义的就是任务,此处handlers中的任务使用的是service模块
         - name: restart httpd    #notify和handlers中任务的名称必须一致
           service: name=httpd state=restarted
      ##Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。

      ---
      - name: install httpd
        gather_facts: false
        hosts: web-z1
        remote_user: root
        tasks:
          - name: test ping
            ping:
          - name: disable firewalld
            service: name=firewalld state=stopped
          - name: install httpd
            yum: name=httpd state=latest
          - name: install configuration file for httpd
            copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
            notify: "restart httpd"
          - name: start httpd service
            service: enabled=true name=httpd state=started
        handlers:
          - name: restart httpd
            service: name=httpd state=restarted

      解释:

      ---
      #ymal文件开头,可不写
      - name: test
      #定义play名称,可不写
        gather_facts: false
      #设置不进行facts信息收集,这可以加快执行速度,可省略默认开启
        hosts: webservers
      #要执行的组或者主机,webservers为组名需要在/etc/ansible/hosts中配置
        remote_user: root
      #执行时所使用的用户
        tasks:
      #定义任务列表,列表中任务按顺序执行
         - name: test ping
      #自定义name的任务名称
           ping:
      #第一个任务执行内容为使用ping模块ping,webservers组的主机
         - name: test selinux
           command: /sbin/setenforce 0
      #第二个任务执行内容为使用command模块关闭selinux
           ignore_errors: false
      #若出现错误,忽略继续运行下面的任务,默认为true出错立即停止playbooks
         - name: test stop firewalld
           service: name=firewalld state=stopped
      #第三个任务执行内容为使用service模块关闭firewalld防火墙
         - name: test yum
           yum: name=httpd state=latest
      #第四个任务执行内容为使用yum模块安装httpd服务状态为latest
         - name: test copy
           copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
      #第五个任务为使用copy模块将ansible上的/etc/httpd.conf文件拷贝到指定组的主配置文件下替换,注意此处需要在ansible的/opt目录上有一个httpd.conf的模版否则会报错
           notify: "restart httpd"
      #如果上面的copy任务成功,则调用handlers模块的restart httpd,注意要与下面handlers的name名称相同
         - name: test start httpd
           service: enabled=yes name=httpd state=started
      #第六个任务执行内容为使用service模块启动httpd服务并设置开机自启
        handlers:
         - name: restart httpd
           service: name=httpd state=restarted
      #handlers模块,若notify成立则执行此模块内容调用service模块重启httpd服务。注意使用name名称调用

      验证httpd服务是否开启

      2.5运行playbook

      运行playbook
      ansible-playbook test1.yaml
      补充参数:
      -k(–ask-pass):用来交互输入ssh密码
      -K(-ask-become-pass):用来交互输入sudo密码
      -u:指定用户
      ansible-playbook test1.yaml --syntax-check    #检查yaml文件的语法是否正确
      ansible-playbook 文件.yaml --list-task       #检查tasks任务
      ansible-playbook test1.yaml --list-hosts      #检查生效的主机
      ansible-playbook test1.yaml --start-at-task='install httpd'     #指定从某个task开始运行

      2.5.1ansible-playbook命令使用

      ansible-playbook用于运行剧本,-C测试运行结果,并不是真的执行任务

       ansible-playbook test.yaml -C
      ansible-playbook test.yaml --syntax-check

      ansible-playbook test.yaml --list-task

      ansible-playbook test.yaml --list-hosts

      ansible-playbook test.yaml --start-at-task='install httpd'

      2.6playbook定义、引用变量

      ---
      - name: second play
        hosts: dbservers
        remote_user: root
        vars:                 #定义变量
         - groupname: mysql   #格式为 key: value
         - username: nginx
        tasks:
         - name: create group
           group: name={{groupname}} system=yes gid=306    #使用 {{key}} 引用变量的值
         - name: create user
           user: name={{username}} uid=306 group={{groupname}} 
         - name: copy file
           copy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt    #在setup模块中可以获取facts变量信息
      ansible-playbook test1.yaml -e "username=nginx"     #在命令行里定义变量

      ---
      - name: second play
        hosts: web-z1
        remote_user: root
        vars:
      #使用变量模块
          - groupname: testgroup
      #定义变量groupname的值为testgroup
          - username: testuser
      #定义变量username的值为testuser
       tasks:
          - name: create group
            group: name={{groupname}} gid=111
      #第一个任务使用group模块调用定义的groupname变量创建组
         - name: create user
            user: name={{username}} uid=10086 group={{groupname}}
      #第二个任务使用user模块调用定义的username变量创建用户指定uid和组

      ansible-playbook  一种定义的任务方式,在编写 playbook 时可以使用变量来传数据

      playbook引用变量指的是在playbook中使用变量代理静态常量值,来实现动态的配置过程 ,通过引用变量 ,可以使playbook更具有灵活性和可重复性

      {{name}}来引用变量

      2.7指定远程主机sudo切换用户

      远端主机查看用户

      ansible管理端主机操作

      ---
      - hosts: 192.168.246.8
        remote_user: ky66    #2.6版本以后的参数,之前是sudo,意思为切换用户运行
        become: yes          #指定sudo用户为root
        become_user: root

      执行playbook时:ansible-playbook test04.yml -K

      [root@localhost ~]#vim /etc/sudoers
      不仅在playbook文件中设置sudo提权  还需要在对应的主机上实现sudo提权
      [root@localhost playbook]#ansible-playbook test04.yaml -k -K
      -k 指定ssh的登录密码
      -K 大写需要输入用户的登录密码

      要给ky66用户提权,这个也要提权,不然就会报错哦

      ​echo "ky66 ALL=(ALL) ALL" >> /etc/sudoers

      2.8when条件判断

      在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。

      when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务

      2.8.1调用command模块shutdown服务

      ---
      - hosts: web-z1
        remote_user: root
        tasks:
          - name: shutdown host
            command: /sbin/shutdown -r now
            when: ansible_default_ipv4.address == "192.168.246.8"
             #when指令中的变量名不需要手动加上 {{}} 或者用它when: inventory_hostname == ""
      

      when用来进行条件判断的关键字 ,其作用只在你指定条件下会执行下面的任务,当条件为真时,任务就会被执行,否则任务将被跳过

      2.8.2调用service模块关闭httpd服务

      ---
      - hosts: web-z1
        remote_user: root
        tasks:
          - name: test when
            service: name=httpd state=stopped
            when: ansible_default_ipv4.address == "192.168.246.8"
        #当内置的变量ipv4.address等于192.168.246.8时调用service模块关闭httpd服务

      2.9迭代

      Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环

      2.9.1批量创建目录

      ---
      - name: play1
        hosts: web-z1
        gather_facts: false
        tasks:
          - name: create directories
            file:
              path: "{{item}}"
              state: directory
            with_items:
              - /mnt/nangjing
              - /mnt/hefei

      2.9.2批量创建文件

      ---
      - name: play1
        hosts: web-z1
        gather_facts: false
        tasks:
          - name: create file
            file:
              path: "{{item}}"
              state: touch
            with_items:
              - /mnt/a.txt
              - /mnt/b.txt

      远程主机查看

      2.9.3批量创建目录、批量创建多个用户,并加入指定的组

      ---
      - name: play1
        hosts: web-z1
        gather_facts: false
        tasks:
          - name: create directories
            file:
              path: "{{item}}"
              state: directory
            with_items:          #等同于 loop:
              - /tmp/test1
              - /tmp/test2
          - name: add users
            user: name={{item.name}} state=present groups={{item.groups}}
            with_items:
              - name: test1
                groups: wheel
              - name: test2
                groups: root

      远端主机查看

      总结:

      inventory主机清单管理
      主机清单配置文件   /etc/ansible/hosts
       
      格式:
      [组名]
      主机IP[:ssh端口]     #默认是 22 端口
      主机名[:ssh端口]
      主机IP[0:255]        #设置连续的主机列表范围
      主机名[a:z]    ansible_port=     ansible_user=    ansible_password=           #设置主机变量
       
      [组名:vars]             #设置组变量
      ansible_port=
      ansible_user=
      ansible_password=
       
      [大组名:children]       #设置嵌套组
      组名1
      组名2
      组名3
       
       
      playbook剧本
      vim XXX.yaml  XXX.yml
      ---
      - name:                 #设置play的名称
        hosts:                #指定执行此play的远程主机组
        remote_user:          #指定执行此play的用户
        #become:              #设置是否sudo切换
        #become_user:         #指定sudo切换的用户
        gather_facts:         #设置是否收集facts信息 yes|no|true|false
        vars:                 #设置自定义变量
        tasks:                #指定此play的任务列表
        - name:                  #定义任务的名称
          模块名: 模块参数       #定义任务要使用的模块和参数(键值对格式)
        - name:  
          模块名: 模块参数
          ignore_errors: true    #忽略此任务的失败
        - name:  
          模块名: 模块参数
          notify: '任务名'       #定义此任务执行结果为changed状态时要触发的handlers任务
        - name:  
          模块名: 模块参数
          when:                  #定义条件表达式(== != > >= 
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon