Ansible-inventory和playbook

文章目录

    • 一、inventory 主机清单
      • 1、列表表示
      • 2、inventory 中的变量
      • 3、变量
        • 3.1 主机变量
        • 3.2 组变量
        • 3.3 组嵌套
    • 二、playbook剧本
      • 1、playbook的组成
      • 2、编写剧本
        • 2.1 剧本制作
        • 2.2 准备nginx.conf
        • 2.3 运行剧本
        • 2.4 查看webservers服务器
        • 2.5 补充参数
      • 3、剧本定义、引用变量
        • 3.1 剧本制作
        • 3.2 运行剧本
        • 3.3 查看dbservers服务器
        • 3.4 在命令行定义变量运行剧本
        • 3.5 查看dbservers服务器
      • 4、when条件判断剧本
        • 4.1 剧本制作
        • 4.2 运行剧本
        • 4.3 查看远程服务器
      • 5、迭代剧本
        • 5.1 剧本制作
        • 5.2 执行剧本
        • 5.3 查看验证

一、inventory 主机清单

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

1、列表表示

  • 如果是名称类似的主机,可以使用列表的方式标识各个主机。
#编辑主机清单配置文件
vim /etc/ansible/hosts
[webservers]
192.168.10.1[2:5]
#表示12-15的地址范围,(可以使用[ ]表示连续的主机范围值)

image-20240507150557652

image-20240507151205164

#编辑主机清单配置文件
vim /etc/ansible/hosts
[webservers]
192.168.10.12:1128
#指定远程连接端口号为1128
#冒号后定义远程连接端口,默认是 ssh 的 22 端口

image-20240507151809100

image-20240507152131207

#编辑主机清单配置文件
vim /etc/ansible/hosts
[dbservers]
db-[a:f].example.org
#支持匹配 a~f  

2、inventory 中的变量

Inventory变量名含义
ansible_hostansible连接节点时的IP地址
ansible_port连接对方的端口号,ssh连接时默认为22
ansible_user连接对方主机时使用的主机名。不指定时,将使用执行ansible或ansible-playbook命令的用户
ansible_password连接时的用户的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提升为指定用户权限时的密码

3、变量

3.1 主机变量
#修改主机清单配置文件
vim /etc/ansible/hosts
[dbservers]
192.168.10.13 ansible_port=22 ansible_user=root ansible_password=123
#通过远程主机的用户账号和密码进行登录,而不是使用ssh协议(每个主机可以设置不同的变量)

ansible dbservers -a 'date'
#远程主机执行date命令

image-20240507160113785

image-20240507160229999

image-20240507160547272

3.2 组变量
#修改主机清单配置文件
vim /etc/ansible/hosts
[dbservers:vars]
#表示为 webservers 组内所有主机定义变量
ansible_user=root
ansible_password=123

[all:vars]
#表示为所有组内的所有主机定义变量
ansible_port=22

image-20240507160918257

image-20240507161246665

image-20240507161329208

3.3 组嵌套
#修改主机清单配置文件
vim /etc/ansible/hosts
[liu:children]
#表示为 [liu:children] 组内所有主机定义变量(组嵌套)
webservers
dbservers

[liu:vars]
#表示为所有组内的所有主机定义变量
ansible_user=root
ansible_password=123

image-20240507162230025

image-20240507162320609

二、playbook剧本

1、playbook的组成

playbooks 本身由以下各部分组成

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

2、编写剧本

  • 编辑关闭防火墙和核心防护playbook剧本
#编辑yaml脚本,详细解释看上面文档
vim playbook.yaml
---
- name: first play for install nginx
  #gather_facts: false
  hosts: webservers
  remote_user: root
  tasks:
   - name: disable firewalld
     service: name=firewalld state=stopped
   - name: disable selinux
     command: '/sbin/setenforce 0'
     ignore_errors: yes

ansible-playbook playbook.yaml
#执行yaml脚本

image-20240507180331184

image-20240507180828554

2.1 剧本制作
vim playbook.yaml
---
#yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: first play for install nginx
#定义一个play的名称,可省略
  #gather_facts: false
  #设置不进行facts信息收集,这可以加快执行速度,可省略
  hosts: webservers
  #指定要执行任务的被管理主机组,如多个主机组用冒号分隔
  remote_user: root
  #指定被管理主机上执行任务的用户
  tasks:
  #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行
   - name: disable firewalld
   #自定义任务名称
     service: name=firewalld state=stopped
     #关闭防火墙
     #使用 module: options 格式来定义任务,option使用key=value格式
   - name: disable selinux
   #自定义任务名称
     command: '/sbin/setenforce 0'
     #关闭核心防护
     #command模块和shell模块无需使用key=value格式
     ignore_errors: yes
     #ignore_errors: True(或者使用true)
     #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务,,继续执行后续任务
   - name: install nginx
   #自定义任务名称
     yum:
     #安装nginx服务
       name: nginx
       state: latest
   - name: install configuration file for nginx
    #自定义任务名称
     copy:
     #复制配置文件到指定目录
       src: /opt/nginx.conf
       #这里需要事先准备好/opt/nginx.conf文件
       dest: /etc/nginx/conf/nginx.conf
       #远程主机目标路径要存在
     notify: "restart nginx"
     #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作,即重启nginx服务
   - name: start nginx service
    #自定义任务名称
     service: enabled=true name=nginx state=started
     #开启服务
  handlers:
  #handlers中定义的就是任务,此处handlers中的任务使用的是service模块
   - name: restart nginx
   #notify和handlers中任务的名称必须一致
     service: name=nginx state=restarted
     #重启nginx服务   
     

vim playbook.yaml
---
- name: first play for install nginx
  #gather_facts: false
  hosts: webservers
  remote_user: root
  tasks:
   - name: disable firewalld
     service: name=firewalld state=stopped
   - name: disable selinux
     command: '/sbin/setenforce 0'
     ignore_errors: yes
   - name: install nginx
     yum:
       name: nginx
       state: latest
   - name: install configuration file for nginx
     copy:
       src: /opt/nginx.conf
       #需要事先准备nginx.conf配置文件
       dest: /etc/nginx/conf/nginx.conf
       #远程主机目标目录要存在
     notify: "restart nginx"
   - name: start nginx service
     service: enabled=true name=nginx state=started
  handlers:
   - name: restart nginx
     service: name=nginx state=restarted

image-20240507184533299

Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。

2.2 准备nginx.conf
cd /opt
#切换目录

#上传nginx.conf配置文件

image-20240507185223998

2.3 运行剧本
ansible-playbook playbook.yaml
#执行yaml脚本  

image-20240507185429331

image-20240507190431888

image-20240507190343424

2.4 查看webservers服务器
ansible webservers -m shell -a 'ss -natp | grep nginx' 
#查看远程主机nginx服务进程

image-20240507191314806

2.5 补充参数
----------------------------------------------------------------------------------------------------------
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
----------------------------------------------------------------------------------------------------------
ansible-playbook playbook.yaml --syntax-check
#检查yaml文件的语法是否正确

ansible-playbook playbook.yaml --list-task
#检查tasks任务

ansible-playbook playbook.yaml --list-hosts
#检查生效的主机

ansible-playbook playbook.yaml --start-at-task='install nginx'
#指定从某个task开始运行

image-20240507191826056

image-20240507191909564

3、剧本定义、引用变量

3.1 剧本制作
#编辑yaml剧本
vim deam01.yaml
---
- name: xin jian yong hu
 #自定义任务名称
  hosts: dbservers
  #指定要执行任务的被管理主机组
  remote_user: root
  #指定被管理主机上执行任务的用户
  vars:
  #定义任务列表
    - username: liu
     #格式为 key: value
  tasks:
  #定义任务列表
    - name: create user
    #自定义任务名称
      user:
        name={{username}}
        #使用 {{key}} 引用变量的值
        uid=330
    - name: copy file
    #自定义任务名称
      copy:
        content="{{ansible_default_ipv4}}"
        #指定写入文件的内容
        dest=/opt/xxxx.txt
        #远程主机目标路径

image-20240507222452599

3.2 运行剧本
 ansible-playbook deam01.yaml
 #运行剧本

image-20240507223420320

3.3 查看dbservers服务器
ansible dbservers -a 'grep "liu" /etc/passwd'
#查看创建的用户信息

ansible dbservers -a 'cat /opt/xxxx.txt'
#查看新建的文件内容

image-20240507224046769

3.4 在命令行定义变量运行剧本
ansible-playbook deam01.yaml -e "username=yanfen"
#命令行定义变量剧本

image-20240507224951750

image-20240507225035404

3.5 查看dbservers服务器
ansible dbservers -a 'grep "yanfen" /etc/passwd'
#查看命令行指定创建的用户

image-20240507225340270

4、when条件判断剧本

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

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

4.1 剧本制作
#编辑剧本
vim deam03.yaml
---
- name: host
  hosts: all
  remote_user: root
  tasks:
    - name: shutdown host
      command: /sbin/shutdown -r now
      when: ansible_default_ipv4.address == "192.168.10.13"
      #只在主机192.168.10.13上执行command
      

#when指令中的变量名不需要手动加上{{}}
#when: inventory_hostname == "<主机名>"

image-20240507231435745

4.2 运行剧本
ansible-playbook deam03.yaml
#运行剧本

image-20240507231626873

4.3 查看远程服务器
  • 执行后,仅有指定主机重启,执行ping模块查看
ansible all -m ping
#ping远程主机

image-20240507232135839

5、迭代剧本

  • Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环。
5.1 剧本制作
#编辑yaml剧本(迭代)
vim deam04.yaml
---
- name: play
#自定义任务名称
  hosts: all
  gather_facts: false
  tasks:
    - name: create directories
    #自定义任务名称
      file:
      #使用
        path: "{{ item }}"
        #每次迭代中,{{ item }} 变量会被替换为列表中的当前项,从而允许 file 模块为这些路径创建目录
        state: directory
      loop:
      #迭代一个列表
        - /data/xx01
        - /data/xx02
    - name: add users
    #自定义原始任务名称
      user:
        name: "{{ item.name }}"
        state: present
        groups: "{{ item.group }}"
      with_items:
      #等同于loop:
        - name: xx01
          group: wheel
        - name: xx02
          group: root
          #或使用以下格式
#      with_items:
#        - {name:'xx01', groups:'wheel'}
#        - {name:'xx01', groups:'root'}

vim deam04.yaml
---
- name: play
  hosts: all
  gather_facts: false
  tasks:
    - name: create directories
      file:
        path: "{{ item }}"
        state: directory
      loop:
      #等同于with_items:
        - /data/xx01
        - /data/xx02
    - name: add users
      user:
        name: "{{ item.name }}"
        state: present
        groups: "{{ item.group }}"
      with_items:
      #等同于loop:
        - name: xx01
          group: wheel
        - name: xx02
          group: root
          #或使用以下格式
#      with_items:
#        - {name:'xx01', groups:'wheel'}
#        - {name:'xx01', groups:'root'}

image-20240507235057153

5.2 执行剧本
ansible-playbook deam04.yaml
#运行脚本

image-20240507235502360

5.3 查看验证
ansible all -a 'ls -l /data'
#查看被控制节点创建的文件

ansible all -m shell -a 'id xx01'
#查看远程服务器节点用户xx01的信息

ansible all -m shell -a 'id xx02'
#查看远程服务器节点用户xx02的信息

image-20240508000043215

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/606676.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java爬虫代理ip(java爬虫代码示例)

java爬虫代理ip 在编写java爬虫时&#xff0c;经常会遇到需要使用代理IP来访问目标网站的情况。这时候&#xff0c;我们就需要编写代码来实现代理IP的功能。接下来&#xff0c;我们将为大家介绍如何在java爬虫中使用代理IP&#xff0c;以及给出相应的代码示例。 首先&#xff…

聚观早报 | 苹果新款iPad Pro发布;国产特斯拉4月交付量

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 5月9日消息 苹果新款iPad Pro发布 国产特斯拉4月交付量 iOS 18新功能爆料 真我GT Neo6续航细节 三星Galaxy Z F…

Linux——守护进程化(独立于用户会话的进程)

目录 前言 一、进程组ID与会话ID 二、setsid() 创建新会话 三、daemon 守护进程 前言 在之前&#xff0c;我们学习过socket编程中的udp通信与tcp通信&#xff0c;但是当时我们服务器启动的时候&#xff0c;都是以前台进程的方式启动的&#xff0c;这样很不优雅&#xff0c…

限时优惠||新算法转让(一种基于数学的元启发式算法)新的群智能算法转让,新的元启发式算法转让(独家发售)【仅售1份】

新算法 ||新算法转让、新的元启发式算法转让 ||一种基于数学开发的超隐喻的元启发式算法新算法 限时发售、限量1份 1️⃣完整的封装代码 2️⃣配套完整的灵感及数据 3️⃣测试集&#xff08;3个&#xff09; &#xff08;1&#xff09;cec2017&#xff08;10、30、50和100维&a…

搞笑聊天截图,几分钟一条原创爆款,多平台发布

利用男女搞笑聊天截图制作原创 这种在抖音很常见相信你也刷到过&#xff0c;这种视频做起来很简单&#xff0c;但是他的点赞很高&#xff0c;只需要搭配好文案就OK&#xff0c; 这种视频通过课程完成之后都是原创视频&#xff0c;我们可以去发抖音&#xff0c;进行中视频变现…

Linux 操作系统网络编程2

1、TCP服务器编写流程 头文件&#xff1a; #include <sys/socket.h> 1.1 创建套接字 函数原型&#xff1a; int socket(int domain, int type, int protocol); 参数&#xff1a; domain: 网域 AF_INET &#xff1a; IPv4 AF_INET6 &a…

docker-compose安装 人大金仓数据库

下载官网安装包 将安装包重命名为: kingbase.tar 再导入镜像仓库 docker load -i kingbase.tar目录创建data文件夹创建docker-compose文件 version: 3 services: kingbase: image: kingbase:v1 container_name: kingbaseports: - "54321:54321" volumes: -…

Core_Air724UG学习

产品描述 Core_Air724UG核心板是基于Air724UG cat1模板制作的开发实验板。 该模块支持Lua二次开发或AT指令&#xff0c;方便开发者根据自己的需求灵活选择。 Core_Air724UG核心板专注于小型化&#xff0c;PCB尺寸4246mm&#xff0c;有12x22哥标准2.54mm排针管脚&#xff0c;其…

IT项目管理-大题【太原理工大学】

一、根据进度网络写出时间参数表、关键路径、总工期 此类题一般是给一个表&#xff0c;问三问。 第一问会问某个活动的时间参数&#xff0c;但我们需要把整个表都求出来&#xff0c;否则单求一个很困难&#xff08;如果你就是不想求整张表也行&#xff0c;不是硬性要求&#xf…

HR招聘面试,如何测评候选人的执行力和岗位胜任力

执行力是人才测评中的重要组成&#xff0c;尤其是对于小微企业那就更加重要了&#xff0c;几乎每个岗位都需要员工有独挡一面的能力&#xff0c;没有执行力的员工是无法在中小企业生存的&#xff0c;那么对于大型企业来说&#xff0c;是不是执行力不重要&#xff1f;非也&#…

JAVA链表相关习题2

1.反转一个单链表。 . - 力扣&#xff08;LeetCode&#xff09; //2在1前面 //1在3前面 //ListNode curhead.next //head.nextnull(翻转后头节点变为最后一个节点) // while(cur ! null) { //记录 当前需要翻转节点的下一个节点 ListNode curNext cu…

谷粒商城实战(022 业务-订单模块-服务调用)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第267p-第p270的内容 远程调用 订单服务调用客户服务的查询收货地址信息方法 1.在订单服务里添加EnableFeignClients 来开启远程调用功能 2.…

【Scala---04】函数式编程 『 函数 vs 方法 | 函数至简原则 | 函数式编程』

文章目录 1. 函数 vs 方法1.1 方法(1) 定义方法(2) 运算符即方法 1.2 函数(1) 定义函数(2) 匿名函数 1.3 方法转为函数1.4 可变参数&默认参数 2. 函数至简原则3. 函数式编程3.1 函数式编程思想3.3 函数柯里化&闭包3.5 递归 & 尾递归 4. 补充4.1 访问元祖元素4.2 &g…

TCP 连接,一端断电和进程崩溃有什么区别?

TCP 连接&#xff0c;一端断电和进程崩溃有什么区别&#xff1f; 前言主机崩溃进程崩溃有数据传输的场景客户端主机宕机&#xff0c;又迅速重启客户端主机宕机&#xff0c;一直没有重启 总结 前言 有的小伙伴在面试腾讯的时候&#xff0c;遇到了这么个问题&#xff1a; 这个属…

一键审计 web 日志(teler)

在 web 系统遭受攻击之后&#xff0c;通常要审计 web 日志来寻找蛛丝马迹&#xff0c;那么有没有可以满足需求的自动化工具呢&#xff1f;今天就来尝试一款开源工具 teler&#xff0c;项目地址&#xff1a; https://github.com/kitabisa/teler/ 先来看一张作者测试图&#xff1…

NPDP|传统行业产品经理如何跨越鸿沟,从用户角度审视产品

随着科技的飞速发展和互联网的普及&#xff0c;产品经理的角色已经从单纯的产品规划者逐渐转变为全方位的用户体验设计者。对于传统行业的产品经理来说&#xff0c;这是一个挑战与机遇并存的时代。他们不仅要面对激烈的市场竞争&#xff0c;还要学会如何跨越与新兴科技行业之间…

一行Python代码可以做什么,超出你想象

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 揭秘编程语言的灵活性 在编程的世界里&#xff0c;简洁就是力量。Python以其优雅和简洁而著称&#xff0c;让开发者能够用更少的代码做更多的事。但这并不意味着功能上的妥协——Python的强大之处在于它允许在一行代…

【基于 PyTorch 的 Python 深度学习】5 机器学习基础(3)

前言 文章性质&#xff1a;学习笔记 &#x1f4d6; 学习资料&#xff1a;吴茂贵《 Python 深度学习基于 PyTorch ( 第 2 版 ) 》【ISBN】978-7-111-71880-2 主要内容&#xff1a;根据学习资料撰写的学习笔记&#xff0c;该篇主要介绍了单 GPU 加速和多 GPU 加速&#xff0c;以及…

今年做电商,视频号小店绝对是明智之举,未来风口就在这里

大家好&#xff0c;我是电商笨笨熊 电商一直是近几年的热门创业方向&#xff1b; 但是面对众多电商平台&#xff0c;对于普通玩家的我们来说&#xff0c;该怎么选择呢&#xff1f; 今年来说&#xff0c;我会更愿意选择视频号小店。 作为一个腾讯推出的电商项目&#xff0c;…

LeetCode例题讲解:移动044

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0] 输出…