优化ansible执行playbook速度

这篇具有很好参考价值的文章主要介绍了优化ansible执行playbook速度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ansible对应版本信息

# ansible --version

ansible 2.9.27

  config file = /root/ansible/ansible.cfg

  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']

  ansible python module location = /usr/lib/python3.11/site-packages/ansible

  executable location = /usr/bin/ansible

  python version = 3.11.4 (main, Sep 20 2023, 00:00:00) [GCC 12.3.1 (openEuler 12.3.1-15.oe2309)]

  1. 查找playbook中耗时task

可以通过启用timer, profile_roles, profile_tasks回调插件

# cat ansible.cfg

[defaults]

inventory = /root/ansible/inventory

roles_path = /root/ansible/roles

remote_user = root

host_key_checking = False

gathering = explicit

ansible_python_interpreter=/usr/bin/python3

forks=50

interpreter_python = auto_legacy_silent

callback_whitelist = timer, profile_roles, profile_tasks

[privilege_escalation]

become=True

become_method=sudo

become_user=root

become_ask_pass=False

[ssh_connection]

ssh_args = -o ControlMaster=auto -o ControlPersist=60s

 执行playbook会出书任务执行耗时统计

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

servera                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

serverb                    : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Wednesday 17 January 2024  17:08:12 +0800 (0:00:30.809)       0:00:30.854 *****

===============================================================================

copy ------------------------------------------------------------------- 30.82s

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

total ------------------------------------------------------------------ 30.82s

Wednesday 17 January 2024  17:08:12 +0800 (0:00:30.809)       0:00:30.854 *****

===============================================================================

copy a.conf -----------------------------------------------------------------------------

2.禁用fact gathering

playbook中的默认会执行fact gathering 任务,该任务主要是收集节点信息和生成对应节点信息的环境变量。如果后边任务没有用到这些变量可以禁用该任务。

ansible.cfg中配置

[defaults]

gathering = explicit

playbook中禁用:

 gather_facts: False 

3.配置并发数

[defaults] 

forks=50

或者在执行playbook时添加

ansible-playbook test.yaml --forks 50

4.优化ssh配置

建立ssh连接是一个在后台运行的相对较慢的过程。当 playbook 中有更多任务并且执行任务的托管节点更多时,全局执行时间会显着增加。

ControlMaster

允许与远程主机ssh链接共用。这可以节省 ssh连接初始过程的时间,因为后续链接请求将使用第一个 ssh连接来执行任务。

ControlPersist

指示 ssh在后台保持空闲连接打开的时间。

[ssh_connection] 

ssh_args = -o ControlMaster=auto -o ControlPersist=60s

5.禁用主机密钥检查

[defaults] 

host_key_checking = False

默认情况下,Ansible 检查并验证 SSH 主机密钥,以防止服务器欺骗和中间人攻击。这也很消耗时间。

6.Use pipelining

当 Ansible 使用 SSH 时,后台会建立多个ssh链接,用于复制文件、脚本和其他执行命令可以通过启用管道参数(默认情况下禁用)来减少 ssh连接数

# ansible.cfg

pipelining = True

7.Use execution strategies

默认情况下,Ansible 会等待每个主机完成一个任务,然后再转到下一个任务,这称为线性策略。如果您对任务或托管节点没有依赖关系,则可以将策略更改为 free,这允许 Ansible 在托管主机上执行任务直到任务结束,而无需等待其他主机完成其任务:

- hosts: production servers

strategy: free

tasks:

8.异步任务

当任务执行时,Ansible 会等待其完成,然后再关闭与受管节点的连接。 当您的任务执行时间较长(例如磁盘备份、包安装等)时,这可能会成为瓶颈,因为它会增加全局执行时间。 如果以下任务不依赖于这个长时间运行的任务,您可以使用异步模式和适当的轮询间隔来告诉 Ansible 不要等待并继续执行下一个任务:

---

- name: mkfs

  hosts: nodes

  tasks:    

    - name: mkfs

      shell: "mkfs -f /dev/sda1"

      async: 120 # Maximum allowed time in Seconds

      poll: 05 # Polling Interval in Seconds

9.任务合并

安装软件包尽量放到一个任务中

#下边安装三个软件包,分别在2个任务中执行

- name: Install httpd

  yum:

name: httpd

state: present

- name: Install mysql

    yum:

name: mysql

state: present

 #2个软件包可以放在一个循环任务中执行

- name: Install Pacakages

yum:

    name: "{{ item }}"

    state: present

  loop:

    - httpd

    - mysql

 #更好方式是

- name: Install httpd and mysql

    yum:

    name:

      - httpd

      - mysql

    state: present

10.避免使用copy同步目录

当您有多个文件要复制到同一目录中时,请同步模块,而不是使用多个复制模块或循环:

- name: Copy data

  synchronize:

    src: /opt/data

    dest: /opt/data

11.模板使用

您可以使用多个 lineinfile 和 blockinfile 任务来管理和配置单个文件。 这种方法创建了一个很长的剧本。 当存在配置偏差时,您必须使用不同的正则表达式编辑此 lineinfile 任务。 但是,您可以使用 Jinja2 模板创建任意级别的复杂文件,并使用模板模块(或过滤器)来配置受管节点。

Your Jinja2 template: nginxd.conf.j2

# nginx configuration for wp-test

server {

    root /var/www/{{ website_root_dir }};

    index index.php index.html index.htm;

    server_name {{ website_name }}.com www.{{ website_name }}.com;

    access_log /var/log/nginx/access_{{ website_name }}-com.log;

    error_log /var/log/nginx/error_{{ website_name }}-com.log;

...<output removed>...

    ssl_certificate /etc/letsencrypt/live/{{ website_name }}.com/fullchain.pem; # managed by Certbot

    ssl_certificate_key /etc/letsencrypt/live/{{ website_name }}.com/privkey.pem; # managed by Certbot

    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

模板模块将变量(代码 {{ website_root_dir }})替换为剧本中提供的值:

---

- name: Configure the nginx Web Server

  hosts: web_servers

  become: True

  vars:

    website_name: myawesomeblog

    website_root_dir: /var/www/myawesomeblogdata

  tasks:

    - name: Copy nginx configuration

      template:

        src: nginxd.conf.j2

        dest: /etc/nginx/sites-enabled/{{ website_name }}.conf

12.尽量使用内部接口,避免使用shell和commad

您可以使用 Ansible shell 或命令模块来运行基本的 Linux 命令。 强烈建议您使用适当的模块,并在最坏的情况下使用这些 shell/命令模块。 shell(或命令)模块将简单地执行命令而不进行任何验证,并且大多数时候,您需要处理幂等性和错误检查。例如,下面的第一个任务(使用 shell)只是覆盖文件的内容,而不检查或验证,但第二个任务(使用复制模块)仅在需要时更改文件,并且它还更新目标文件的权限和所有权 。

    - name: Create file using shell module

      shell: 'echo "Hello" > /tmp/foo.conf'

      

    - name: Create file with permission using file module

      ansible.builtin.copy:

        content: "Hello"

        dest: /tmp/foo.conf

        owner: root

        group: root

        mode: '0644'

13.语法优化

在playbook中使用适当的模块和模块参数可以节省大量时间并避免复杂化。文章来源地址https://www.toymoban.com/news/detail-803466.html

到了这里,关于优化ansible执行playbook速度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ansible playbook编写

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

    2024年02月14日
    浏览(33)
  • [ansible] playbook运用

        2.1 基础变量的定义与引用 在yaml文件中,我们可以在初始配置的模块中用var去定义变量的存在,变量的格式为key:value,以此来确定该变量在剧本中的存在   2.2 引用fact信息中的变量   首先我们知道  使用 ansible 组  -m setup   可以收集该组中所有的节点信息 , 所以setup中

    2024年02月20日
    浏览(36)
  • Ansible之Playbook

    1.简介 Playbook 也通常被⼤家翻译成剧本。 可以认为它是Ansible ⾃定义的⼀⻔语⾔(可以将 Playbook ⽐作Linux 中的 shell,⽽ Ansible 中的 Module 可以⽐作为 Linux 中的各种命令。) 2.Play的定义 PlayBook遵循YAML 的语法格式。 由于Playbook 是由⼀个或者多个Play组成,那么如果我们熟悉Play的写

    2024年02月11日
    浏览(37)
  • [ansible] playbook角色

    Roles又称为角色,playbook被称为剧本。Roles角色是自1.2版本之后引入的新特性,用于层次性、结构化的组织剧本   roles能够根据层次型结构自动装载变量文件、任务集、以及触发的动作等,要使用roles只需要在剧本中使用include命令引入即可 简单的来说,roles就是分别将变量、文

    2024年02月21日
    浏览(42)
  • Ansible剧本--Playbook

    在ansible中,类似“脚本”的文件被称作“剧本”,英文称为playbook,用于配置、部署和管理被控节点 只需要把模块按照顺序编排在playbook剧本中,ansible就会按照剧本一步一步的执行,最终达到我们需要实现的效果 playbook是由一个或多个\\\'play\\\'组成的列表,当我们在工作中需要不

    2024年01月19日
    浏览(37)
  • Ansible Playbook 常用变量

    以下是 Ansible Playbook 常用变量 ansible_connection : 指定连接类型(如 ssh、winrm) ansible_user : 指定远程用户 ansible_ssh_pass : 指定远程用户密码 ansible_become : 指定是否切换为超级用户 ansible_become_user : 指定切换到的用户 ansible_become_pass : 指定超级用户密码 ansible_host : 指定远程主机的

    2024年02月11日
    浏览(41)
  • Ansible playbook ----- 剧本

    playbooks 本身由以下各部分组成 (1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 (2)Variables:变量 (3)Templates:模板 (4)Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作 (5)Roles:角色 //示例: vim test1.yaml ---    

    2024年02月10日
    浏览(42)
  • 使用Ansible中的playbook

    目录 1.Playbook的功能 2.YAML 3.YAML列表 4.YAML的字典 5.playbook执行命令 6.playbook的核心组件 7.vim 设定技巧 示例 playbook 是由一个或多个play组成的列表 Playboot 文件使用YAML来写的 #简介# 是一种表达资料序列的格式,类似XML #特点# 1、可读性好 2、和脚本语言交互性号 3、易于实现 4、适用

    2024年02月06日
    浏览(33)
  • Ansible之playbook剧本

    playbook 是 ansible 用于配置,部署,和管理被控节点的剧本。通过 playbook 的详细描述,执行其中的一系列 tasks ,可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的一系列 to-do-list ,而被控节点必须要完成。也可以这么理解,playbook 字面意思,即剧

    2024年02月09日
    浏览(38)
  • ansible的playbook剧本

    (1)Tasks:任务,即通过 task 调用 ansible 的模块将多个操作组织在一个 playbook 中运行 (2)Variables:变量 (3)Templates:模板 (4)Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作 (5)Roles:角色 ==Ansible在执行完某个任务之后并不会立即去执行对应的han

    2024年02月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包