欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > 一篇精通Ansible之playbook

一篇精通Ansible之playbook

2025/1/20 8:35:46 来源:https://blog.csdn.net/huaz_md/article/details/141108698  浏览:    关键词:一篇精通Ansible之playbook

华子目录

  • 前言
  • `playbook`概念
    • `playbook`结构理解
    • `playbook`核心元素
    • `playbook`特点与优势
  • `playbook`基本语法
  • `ansible-playbook`命令
  • ansible总结
  • 查看主机清单
  • ansible配置文件
  • 单个play
    • 语法检测
    • 运行
  • 多个play
  • 查看模块doc
  • 变量
    • 事实变量
    • 导入变量文件
    • 字典变量
  • 机密数据管理
    • 在`playbook`中导入变量文件
      • 导入加密变量文件和普通文件
  • register
  • 流程控制
    • ansible中的循环机制`loop`
    • when
    • `notify`与`handlers`
    • ignore_errors
    • block,rescue,always
  • changed_when
  • 包含文件与导入文件
  • 角色
    • 列出角色
    • 运行角色
    • 安装collection
    • 列出colection
  • `pre_tasks` `post_tasks`
  • 总结

前言

  • Ansible中,playbooks剧本)是用来定义一系列task任务的文件,可以实现自动化部署、配置和管理服务器等操作
  • 本文主要介绍playbook剧本的组成以及编写

playbook概念

  • playbook是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活
  • playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础
  • playbook实质就是一个文件,有着特定的组织格式,它采用的语法格式是yamlYet Another Markup Language
  • playbook是由一个或多个play组成的列表

playbook结构理解

  • 集合:多个模块集合体

  • 在这里插入图片描述

  • 任务清单playbook

    • 一个playbook中可以有多个playplaybookplay的集合体)
    • 一个play中可以有多个任务task(每个play可以单独指定主机范围)(task只能在其所属play指定的主机上执行)(每个task当中可以存在多个ansible操作模块
    • 在这里插入图片描述
  • 除了playbook之外,还有playbook需要的模板,文件,变量文件等等不能全都放在playbook中,否则会使得playbook变得臃肿。我们就需要单独进行存放

  • 最后,我们会把playbookplaybook需要的模板,文件,变量文件等等进行打包。形成一个角色role

  • 在这里插入图片描述

playbook核心元素

在这里插入图片描述

  • hosts主机列表远程主机列表
  • task任务集:通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行
  • variables变量:用来存储数据,可以在playbook中被引用。这些变量可以是全局的,也可以是针对特定主机或主机组的。使用变量可以使playbook更加灵活和可重用
  • templates模板:一种用来生成配置文件或者其他文本文件机制。在Ansible中,你可以使用Jinja2模板引擎来创建模板文件。这些模板文件中可以包含变量、条件语句、循环等,使得你可以根据不同的情况生成不同的文本内容
  • handlers处理器:一种特殊类型任务,它们仅在特定条件下触发。通常用于在一组任务执行完成后执行诸如修改配置文件重启服务之类的操作。当服务配置文件changed被修改需要重启服务进行重新加载时,触发执行的操作
    • handlersnotity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
  • roles角色:用来组织playbooks中任务的结构化方式。一个role包含了一组相关的任务、变量、handlers、文件等内容,可以使得playbooks更加模块化、可重用和易于维护
  • tags标签,指定某条任务执行,用于选择运行playbook中的部分代码
  • remote_user:在远程主机哪个用户身份执行;

playbook特点与优势

  • 声明式:用户只需描述期望的系统状态,而非具体的操作步骤,Ansible 负责确定如何达到这一状态
  • 幂等性Playbook 设计为可重复执行,即使在系统已处于预期状态时,再次运行也不会产生副作用
  • 可读性强yaml 格式和简洁的结构使得Playbook易于编写和维护
  • 模块丰富Ansible 提供了大量的模块,覆盖了从系统配置到云资源管理的广泛需求
  • 跨平台:支持多种操作系统环境,适配不同的自动化需求

playbook基本语法

playbook使用yaml语法格式,后缀可以是yaml,也可以是yml

  • 第一种写法:
[root@server ~]# vim test.yaml
---         #yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: first-play     #定义一个play的名称,可省略hosts: all          #  -表示一个块序列的节点,注意:横杠后面有空格,可以写主机名,主机组名,多个主机名使用逗号隔开remote_user: root    #指定在进行远程操作时使用root用户进行操作become: true     #是否提权become_user: root    #提权的用户为roottasks:        #使用tasks关键字指明要进行操作的任务列表,之后的行都属于tasks键值对中的值- name: PING!!!    #每个任务都以-开头,每个任务都有自己的名字(名字自定义),任务名使用name关键字进行指定ping:        #ansible中的ping模块- name: make directory!!!     #第二个任务名(任务名自定义)file:       #ansible中的file模块path: /root/data     state: directory

在这里插入图片描述

  • 注意:键值对之间必须要有一个空格

  • 第二种写法:(推荐写法

[root@server ~]# vim test1.yaml
---                #  ---表示文档开始
- name: first-play     #定义一个play的名称,可省略hosts: node1.example.com              #  -表示一个块序列的节点,注意:横杠后面有空格,可以写主机名,主机组名,多个主机名使用逗号隔开remote_user: root              #指定在进行远程操作时使用root用户进行操作become: true     #是否提权become_user: root    #提权的用户为rootvars:             #表示下面是定义的变量filename: file1          #变量的形式,key: valuevars_files:   #导入变量文件,相当于include。对于导入的变量文件中的变量,直接使用即可- /home/student/data-secret/secret.yml  #加密变量文件- ./user.yml        #普通变量文件tasks:                 #使用tasks关键字指明要进行操作的任务列表,之后的行都属于tasks键值对中的值- name: touch file!!!          #第一个任务名(任务名自定义)file: path=/root/{{ filename }} state=touch    #file为ansible的模块,file:后接模块参数(使用=号)

在这里插入图片描述

  • 使用 {{ key }} 引用变量的
  • name下面接模块名

ansible-playbook命令

[root@server ~]# ansible-playbook   [options]   playbook.yml
参数说明
-i指定inventory文件的路径,用于指定要管理的主机清单
-k用来交互输入ssh密码
-K用来交互输入sudo(普通用户)密码
-u指定用户
-l指定要运行剧本的主机或主机组
-e命令行中指定变量,当与剧本中的变量名重复时,会覆盖剧本中变量
-t指定要运行的标签,只运行带有指定标签的任务
--syntax-check检查yaml文件的语法是否正确
--step执行tasks中的任务,需要手动确认是否往下执行
--list-tasks列出剧本中的所有任务
--list-hosts检查生效的主机
--start-at-task指定从某个task开始运行,如--start-at-task='install httpd'
-C测试运行playbook,但不显示测试结果
[root@server ~]# ansible-playbook playbook.yaml --syntax-check   #检查yaml文件的语法是否正确[root@server ~]# ansible-playbook playbook.yaml --list-task    #列出task任务[root@server ~]# ansible-playbook playbook.yaml --list-hosts     #检测生效的主机[root@server ~]# ansible-playbook -C playbook.yaml   #-C测试运行(没有运行结果)
  • 执行 playbook 剧本
[root@server ~]# ansible-playbook playbook.yaml

ansible总结

  • ansible中,ansible.cfghosts文件是ansible的默认配置文件,如果在当前目录运行ansible指令的时候,当前目录下有ansible.cfghosts文件,就会加载当前目录的。如果当前目录下没有ansible.cfghosts文件,ansible就会加载/etc/ansible/ansible.cfg/etc/ansible/hosts文件

查看主机清单

[student@workstation ~]$ ansible-navigator inventory -i 清单文件目录 -m stdout --graph[student@workstation ~]$ ansible-inventory --graph

ansible配置文件

  • 自动生成配置文件
[student@workstation ~]$ ansible-config init --disabled > ansible.cfg  #在当前目录下生成ansible配置文件
  • 手动编辑
[student@workstation ~]$ vim ansible.cfg
[defaults]
inventory=inventory   #定义主机清单
collections_path=mycollections 
roles_path=roles
remote_user=root   #在受管主机上登录的用户名称
ask_pass=false   #是否询问ssh密码
vault_password_file=secret.txt  #存放密码的文件[privilege_escalation]    #权限升级
become=true       
become_method=sudo     #提升权限的方法
become_ask_pass=false  #是否为become_method提示输入密码
become_user=root     #切换到的用户

单个play

  • 每一个play管理一部分主机

  • 一个play管理一部分主机

在这里插入图片描述

语法检测

[student@workstation playbook-basic]$ ansible-navigator run -m stdout site.yml --syntax-check #语法检测

运行

[student@workstation playbook-basic]$ ansible-navigator run -m stdout site.yml #运行ansible脚本,对于幂指型重复运行不会有影响。但是对command,shell,raw这样的非幂指型有影响

多个play

[student@workstation playbook-multi]$ vim intranet.yml
---
- name: enable intranet serviceshosts: serverabecome: true  #提权become_user: root  #提权为root用户tasks:- name: latest version of httpd and firewalld installedansible.builtin.dnf:name:- httpd     #使用列表的形式,安装多个软件包- firewalldstate: latest- name: test html page is installedansible.builtin.copy:content: "welcome to the example.com intranet\n"  #复制的内容,\n表示换行dest: /var/www/html/index.html   #复制到的位置- name: firewalld startedansible.builtin.service:   #开启firewalldname: firewalldstate: startedenabled: true- name: firewall permit httpdansible.posix.firewalld:service: http   #服务名permanent: true  #设置为永久性state: enabled  #放行httpimmediate: yes  #不用重启,立即生效- name: httpd startedansible.builtin.service:name: httpd   #服务名state: started  #设置为开启enabled: true  #开机自启动- name: test intranet web serverhosts: localhost   #本机become: false   #是否提升权限tasks:- name: connect to intranet web serveransible.builtin.uri:url: http://servera.lab.example.com  #访问的网址return_content: yes  #是否返回内容status_code: 200  #判断是否访问成功
[student@workstation playbook-review]$ vim internet.yml
---
- name: enable internet web servicehosts: serverb.lab.example.combecome: truetasks:- name: firewalld httpd mariadb php php-mysqlnd installed   #安装多个软件包ansible.builtin.dnf:name:- firewalld- httpd- mariadb-server- php- php-mysqlndstate: latest- name: firewalld enabled  #启动防火墙ansible.builtin.service:name: firewalldstate: startedenabled: true- name: permit httpd   #放行http服务ansible.posix.firewalld:service: httpstate: enabledpermanent: trueimmediate: yes- name: httpd enabled   #httpd开机自启动ansible.builtin.service:name: httpdstate: startedenabled: true- name: mariadb enabled  #mariadb开机自启动ansible.builtin.service:name: mariadbstate: startedenabled: true- name: copy index.php   #copy文件并设置文件权限ansible.builtin.copy:src: index.phpdest: /var/www/html/index.phpmode: 0644- name: test web serverhosts: workstationbecome: falsetasks:- name: connect to serveransible.builtin.uri:url: http://serverb.lab.example.comstatus_code: 200

查看模块doc

[student@workstation playbook-multi]$ ansible-doc --list | grep uri
debug                                          Print statements during exec...
uri                                            Interacts with webservices
[student@workstation playbook-multi]$ ansible-doc -l | grep uri
debug                                          Print statements during exec...
uri                                            Interacts with webservices
[student@workstation playbook-multi]$ ansible-doc uri   #查看uri模块的详细信息

变量

在这里插入图片描述

  • playbook中定义变量
[student@workstation data-variables]$ vim playbook.yml
---
- name: deploy and start apache httpd servicehosts: webservervars:       #在yml文件中定义变量web_pkg: httpdfirewall_pkg: firewalldweb_service: httpdfirewall_service: firewalldpython_pkg: python3-PyMySQLrule: httptasks:- name: install packagesansible.builtin.dnf:  #安装软件包name:- "{{ web_pkg }}"   #引用变量- "{{ firewall_pkg }}"- "{{ python_pkg }}"state: latest- name: firewalld enabled #启动firewalldansible.builtin.service:name: "{{ firewall_service }}"state: startedenabled: true- name: firewalld rule to http #放行防火墙规则ansible.posix.firewalld:service: "{{ rule }}"state: enabledpermanent: trueimmediate: yes- name: copy file to http #创建网页文件ansible.builtin.copy:content: "Example web content\n"dest: /var/www/html/index.html- name: httpd enabled  #启动httpd服务ansible.builtin.service:name: "{{ web_service }}"state: startedenabled: true- name: verify http service  #http服务检测是否正常hosts: workstationbecome: falsetasks:- name: look http serveransible.builtin.uri:url: http://servera.lab.example.comstatus_code: 200  #检测是否为200,不是200会报错

事实变量

  • 事实变量:收集到的远程主机的主机名,ip地址等等

  • setup模块自动在playbook执行时被触发,并且收集到的信息默认就被存储在Ansible变量中(ansible_facts变量)

[student@workstation data-variables]$ ansible all -m setup   #会在当前目录下寻找清单文件中的所有主机的事实
  • 如何引用事实变量

在这里插入图片描述

[student@workstation data-facts]$ vim dispaly_facts.yml
---
- name: display ansible factshosts: webservertasks:- name: display all factsansible.builtin.debug:msg: "{{ ansible_facts['fqdn'] }}"

在这里插入图片描述

导入变量文件

  • 使用vars_files参数
[student@workstation data-secret]$ vim create_users.yml
---
- name: create userhosts: devserversbecome: trueremote_user: devopsvars_files:   #该加密变量文件密码是redhat (文件变量列表可以有多个,也可以有一个)- /home/student/data-secret/secret.yml  #加密变量文件- ./user.yml        #普通变量文件tasks:- name: creating user from secret.ymlansible.builtin.user:name: "{{ username }}"  #直接引用变量即可password: "{{ pwhash }}"- name: create useransible.builtin.user: name: "{{ user }}"  #直接引用变量即可password: "{{ passwd }}"

字典变量

  • 变量值也可以时字典类型
---
- name: Deploy /etc/hosts file  # Playbook 名称hosts: all  # 目标主机组,指定该 Playbook 应用到所有主机vars:hosts:  # 定义 hosts 变量,包括主机名称和 IP 地址的列表- { name: 'host1', ip: '192.168.1.2' }  # 定义主机1的信息- { name: 'host2', ip: '192.168.1.3' }  # 定义主机2的信息- { name: 'host3', ip: '192.168.1.4' }  # 定义主机3的信息tasks:- name: Deploy /etc/hosts from template  # 任务名称template:src: templates/hosts.j2  # 指定模板文件路径(相对于 templates 目录)dest: /etc/hosts  # 指定模板文件复制到远程主机的目标路径

机密数据管理

  • 第一种方式创建机密文件,密码可能容易忘记
[student@workstation ~]$ ansible-vault create secret.yml  #创建机密文件,需要设置密码
hello world[student@workstation ~]$ cat secret.yml   #发现内容已加密
  • 第二种方式:先创建密码文件,再创建机密文件,机密文件的密码在密码文件中
[student@workstation ~]$ echo huazi > password.txt[student@workstation ~]$ ansible-vault create --vault-password-file=password.txt secret.yml
hello world
  • 查看机密文件内容
[student@workstation ~]$ ansible-vault view secret.yml
Vault password:            #这里需要输入密码
hello world
  • 查看机密文件内容时,指定密码文件
[student@workstation ~]$ ansible-vault view --vault-password-file=password.txt secret.yml
hello world
  • 编辑机密文件(相当于vim)(不能使用vim直接编辑,因为使用vim进入后是密文)
[student@workstation ~]$ ansible-vault edit secret.yml
Vault password:   #这里需要输入密码才能进入编辑模式
#指定密码文件,进入机密文件中
[student@workstation ~]$ ansible-vault edit --vault-password-file=password.txt secret.yml
  • 解密机密文件
[student@workstation ~]$ ansible-vault decrypt --vault-password-file=password.txt secret.yml
Decryption successful      #解密成功
[student@workstation ~]$ cat secret.yml  #可以正常查看内容
hello world
  • 将普通文件加密为机密文件
[student@workstation ~]$ ansible-vault encrypt --vault-password-file=password.txt secret.yml
Encryption successful   #加密成功
[student@workstation ~]$ cat secret.yml  #发现为加密内容
  • 重置密码
[student@workstation ~]$ ansible-vault rekey secret.yml
Vault password:    #huazi   原密码
New Vault password:  #redhat  新密码
Confirm New Vault password:   #redhat  新密码
Rekey successful
[student@workstation ~]$ ansible-vault view secret.yml
Vault password:   #redhat  新密码
hello world

playbook中导入变量文件

  • 使用vars_files

导入加密变量文件和普通文件

  • 导入文件后,文件中的变量直接引用即可
[student@workstation data-secret]$ ansible-vault view --vault-password-file=password.txt secr   et.yml     #查看加密文件内容
username: ansibleuser1
pwhash: $6$jfnHouVKUTFMM1pm$39OVTp0ZL8FX.QbD1GoUCP12pNrTC2XzX9Ec0UhzwAM76A.B.Yrk8S.8xiSSnAc.>[student@workstation data-secret]$ cat user.yml #查看普通文件内容
user: huazi
passwd: "{{ '123456' | password_hash('sha512') }}"  #密码要经过加密才能使用
[student@workstation data-secret]$ vim create_users.yml
---
- name: create userhosts: devserversbecome: trueremote_user: devopsvars_files:   #该加密变量文件密码是redhat (文件变量列表可以有多个,也可以有一个)- /home/student/data-secret/secret.yml  #加密变量文件- ./user.yml        #普通变量文件tasks:- name: creating user from secret.ymlansible.builtin.user:name: "{{ username }}"  #直接引用变量即可password: "{{ pwhash }}"- name: create useransible.builtin.user: name: "{{ user }}"  #直接引用变量即可password: "{{ passwd }}"
  • 由于在create_users.yml中导入了机密文件,所以在执行create_users.yml文件时,需要--vault-password-file指定密码文件
[student@workstation data-secret]$ echo redhat > password.txt[student@workstation data-secret]$ ansible-navigator run -m stdout create_users.yml --vault-password-file=password.txt

register

  • register定义的变量会接受模块运行后的所有结果,包括状态,屏幕回显等等。与模块同级,放在模块后面
[student@workstation data-facts]$ vim check_httpd.yml
---
- name: check serverhosts: webservertasks:- name: checkansible.builtin.command: "systemctl is-active httpd"register: result             #register声明变量- name: dispalyansible.builtin.debug:var: result.stdout    #使用  变量名.stdout  打印systemctl is-active httpd的屏幕回显

流程控制

ansible中的循环机制loop

Ansible 中的循环机制主要通过几个关键元素实现

  • 常用itemloop关键字,loop放在模块的最后面,与模块同级
[student@workstation control-flow]$ vim play.yml
---
- name: print msghosts: servera.lab.example.comvars:list:    #定义变量列表,list为列表名,one two three为列表中的值- one- two- threetasks:- name: printansible.builtin.debug:var: "item"  loop: "{{ list }}"
[student@workstation control-flow]$ ansible-navigator run -m stdout play.ymlPLAY [print msg] ***************************************************************TASK [Gathering Facts] *********************************************************
ok: [servera.lab.example.com]TASK [print] *******************************************************************
ok: [servera.lab.example.com] => (item=one) => {"ansible_loop_var": "item","item": "one"
}
ok: [servera.lab.example.com] => (item=two) => {"ansible_loop_var": "item","item": "two"
}
ok: [servera.lab.example.com] => (item=three) => {"ansible_loop_var": "item","item": "three"
}PLAY RECAP *********************************************************************
servera.lab.example.com    : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

案例:使用loop安装多个软件包

[student@workstation control-flow]$ vim playbook.yml
---
- name: mariadb server is runninghosts: database_devvars:mariadb_packages:- mariadb-server- python3-PyMySQLtasks:- name: installansible.builtin.dnf:name: "{{ item }}"state: presentloop: "{{ mariadb_packages }}"

when

  • Ansible 中,提供的唯一一个通用的条件判断是 when 指令,当 when 指令的返回值为 true 时,则该任务执行,否则不执行该任务
  • when指令中的变量名不需要手动加上 {{ }}
[student@workstation control-flow]$ vim playbook.yml
---
- name: mariadb server is runninghosts: servera.lab.example.comvars:mariadb_packages:- mariadb-server- python3-PyMySQLtasks:- name: installansible.builtin.dnf:name: "{{ item }}"state: presentloop: "{{ mariadb_packages }}"when: ansible_facts['fqdn'] == "huazi" #当不满足这个条件时,返回false,不执行- name: start serviceansible.builtin.service:name: mariadbstate: startedenabled: true
[student@workstation control-flow]$ ansible-navigator run -m stdout playbook.ymlPLAY [mariadb server is running] ***********************************************TASK [Gathering Facts] *********************************************************
ok: [servera.lab.example.com]TASK [install] *****************************************************************
skipping: [servera.lab.example.com] => (item=mariadb-server)  #skipping表示条件不满足,跳过了
skipping: [servera.lab.example.com] => (item=python3-PyMySQL)TASK [start service] ***********************************************************
ok: [servera.lab.example.com]PLAY RECAP *********************************************************************
servera.lab.example.com    : ok=2    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

notifyhandlers

  • notify下的名字必须和handlers中的name的名字相同。

  • handlers会等上面任务执行完成后再执行

  • notify放在模块的最后,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。

  • 在系统中,我们修改了服务器的配置文件,这时候就需要重启服务,就可以使用到handlers。配合notify使用

  • handlers等价于playbook中的tasks的位置

[student@workstation control-flow]$ vim plalbook.yml
---
- name: restart http servicehosts: servera.lab.example.comtasks:- name: httpd installed  #安装httpdansible.builtin.dnf:name: httpdstate: present- name: httpd started  #启动httpdansible.builtin.service:name: httpdstate: startedenabled: true- name: reset index.html   #修改网页内容ansible.builtin.copy:content: "huazi\n"dest: /var/www/html/index.htmlnotify: restart httpdhandlers:- name: restart httpd   #重启httpdansible.builtin.service:name: httpdstate: restarted

ignore_errors

ignore_errors: yes表示当该任务执行失败时,忽略当前任务,继续向下执行

[student@workstation control-flow]$ vim plalbook.yml
---
- name: restart http servicehosts: servera.lab.example.comtasks:- name: httpd installedansible.builtin.dnf:name: http     #将服务名写错state: presentignore_errors: yes  #当该任务执行失败后,继续向下执行- name: httpd startedansible.builtin.service:name: httpdstate: startedenabled: true- name: reset index.htmlansible.builtin.copy:content: "huazi\n"dest: /var/www/html/index.htmlnotify: restart httpdhandlers:- name: restart httpdansible.builtin.service:name: httpdstate: restarted
[student@workstation control-flow]$ ansible-navigator run -m stdout plalbook.ymlPLAY [restart http service] ****************************************************TASK [Gathering Facts] *********************************************************
ok: [servera.lab.example.com]TASK [httpd installed] *********************************************************
fatal: [servera.lab.example.com]: FAILED! => {"changed": false, "failures": ["No package http available."], "msg": "Failed to install some of the specified packages", "rc": 1, "results": []}
...ignoringTASK [httpd started] ***********************************************************
ok: [servera.lab.example.com]TASK [reset index.html] ********************************************************
ok: [servera.lab.example.com]PLAY RECAP *********************************************************************
servera.lab.example.com    : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1

block,rescue,always

  • 如果block里面的任务成功执行,则忽略后面的rescue里面的任务,但影响always里面的任务
  • block,rescue,alwaystasks参数的下一级,但在模块上一级block,rescue,always有一个同级name参数,用于描述任务

changed_when

changed_when: false表示实际上远程主机没有被更改

包含文件与导入文件

  • 包含文件是一个动态操作,在playbook运行期间,ansible会在内容到达时处理所包含的内容
  • 导入文件是一个静态操作,在运行开始之前ansible在最初解析playbook预处理导入的内容

import_tasks import_playbook include_tasks

[student@workstation projects-file]$ cat playbook.yml
---
- name: confiure web serverhosts: servera.lab.example.comtasks:- name: include the environment task fileinclude_tasks: tasks/environment.ymlvars:package: httpdservice: httpd- name: import theimport_tasks: tasks/firewall.ymlvars:firewall_pkg: firewalldfirewall_svc: firewalldrule:- http- httpsname: import the placeholderimport_tasks: tasks/placeholder.ymlvars:file: /var/www/html/index.html- name: import test playimport_playbook: plays/test.ymlvars:url: 'http://servera.lab.example.com'

角色

  • 角色本质上也是一个目录

  • 简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们

在这里插入图片描述

Roles 内各目录含义解释:

  • files:用来存放由 copy 模块或 script 模块调用的文件
  • templates:用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件
  • tasks:此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件
  • handlers:此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作
  • vars:此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量
  • defaults:此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量
  • meta:此目录应当包含一个 main.yml 文件,用于定义此角色的特殊设定及其依赖关系
[student@workstation role-create]$ ansible-galaxy init myvhost     #在当前目录下创建myvhost角色[student@workstation role-create]$ ll
drwxr-xr-x. 10 student student 154 Aug 17 17:21 myvhost

Ansible中,ansible-galaxy 命令是一个用于管理Ansible角色的工具。通过该命令,你可以安装、删除、列出或搜索Ansible Galaxy中的角色。在你提供的命令中:

ansible-galaxy role install -r roles/requirements.yml -p roles/

这个命令执行了以下操作:

  • ansible-galaxy role install:这是安装角色的子命令。
  • -r roles/requirements.yml:这个选项指定了一个包含角色需求列表的文件(YAML格式)。Ansible Galaxy将从这个文件中读取需要安装的角色及其版本(如果指定了的话)。这里的文件路径是roles/requirements.yml,意味着Ansible将在当前目录的roles子目录下查找这个文件。
  • -p roles/:这个选项指定了安装角色的目标目录。在这个例子中,所有安装的角色都将被放置在当前目录的roles子目录下。这是一个很好的做法,因为它可以帮助你组织和管理你的项目中的Ansible角色。

列出角色

[devops@workstation ansible]$ ansible-galaxy role list
# /home/devops/ansible/roles
- balancer, (unknown version)
- phpinfo, (unknown version)

运行角色

[devops@workstation ansible]$ vim selinux.yml
---
- name: setup selinux policyhosts: allvars:selinux_policy: targetedselinux_state: enforcingroles:  #任务在角色中,所以在playbook中只需设定任务需要的vars参数和指定roles- redhat.rhel_system_roles.selinux
[devops@workstation ansible]$ ansible-navigator run -m stdout selinux.yml

安装collection

ansible-galaxy collection install 包路径 --force

列出colection

ansible-galaxy collection list

pre_tasks post_tasks

  • pre_tasks:在playbook执行tasks之前执行
  • post_tasks:在所有tasks执行后执行
  • tasks具有相同的性质

总结

  • when中的变量不用{{ }}包裹
  • debugvar参数的变量不用{{ }}包裹
  • .j2文件中的变量需要用{{}}包裹
  • firewalld模块和mount模块用的是ansible.posix集合
  • filesystem模块和parted模块和lvol模块和lvg模块用的是community.general集合
  • 其他常用模块用的是ansible.builtin集合

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com