簡體   English   中英

在第一個節點上運行 ansible

[英]Running ansible on the first node

我正在嘗試配置一系列 Web 服務器。 我的庫存文件中有以下內容:

web_servers:
  hosts:
    1.2.3.4:
    1.2.3.5:

我想確保第一個主機 (1.2.3.4) 上創建了一個 cron 作業。 但它必須是那個特定的主機。

這是我的 ansible yaml:

- name: Creates a backup cron file under /etc/cron.d
  cron:
    name: App Backups
    weekday: "*"
    minute: "0"
    hour: "2"
    user: app
    job: "/scripts/backups.sh"
    cron_file: app-backup

我已經嘗試添加run_once: true以及when: inventory_hostname == groups['web_servers'][0]和其他幾個變體,但每次代碼都在錯誤的節點上運行。 我懷疑它隨機選擇一個節點 - 也許第二個節點已經運行得更快了?

必須有某種方法來確保它始終在 1.2.3.4 上運行。 我不想在劇本中對主機文件進行硬編碼,因為它將用於設置多個環境,並且 IP 會因環境而異。

有人可以幫我理解如何讓任務只在第一個節點上運行嗎?

聽起來第一個節點應該在它自己的組中,然后您可以在播放中定位它:

web_servers:
  hosts:
    1.2.3.4:
    1.2.3.5:

cron_runner:
  hosts:
    1.2.3.4:
- hosts: cron_runner

  tasks:
    - name: Creates a backup cron file under /etc/cron.d
      cron:
        name: App Backups
        weekday: "*"
        minute: "0"
        hour: "2"
        user: app
        job: "/scripts/backups.sh"
        cron_file: app-backup

默認情況下,Ansible 在任何主機上開始下一個任務之前,在受播放影響的所有主機上運行每個任務,使用 5 個分叉。

在您的第一場比賽中,使用本地主機中的第一個主機保存一個變量,並在您的第二場比賽中使用該變量。

- hosts: localhost

  tasks:
  - name: Get the first host
    set_fact:
      ip_server: "{{ groups['webservers'][0] }}"

- hosts: "{{ hostvars['localhost']['ip_server'] }}"

  tasks:
  - name: Creates a backup cron file under /etc/cron.d
    cron:
      name: App Backups
      weekday: "*"
      minute: "0"
      hour: "2"
      user: app
      job: "/scripts/backups.sh"
      cron_file: app-backup

問: 讓任務只在第一個節點上運行。

web_servers:
  hosts:
    1.2.3.4:
    1.2.3.5:

A:Playbook的關鍵字順序控制hosts的排序

引用劇本關鍵字

order:控制用於執行播放的主機的排序。 可能的值為庫存(默認)、已排序、reverse_sorted、reverse_inventory 和 shuffle。

默認情況下,順序是庫存,即播放中的第一個主機是庫存中的第一個主機。 使用run_once

引用任務關鍵字

run_once:布爾值,將繞過主機循環,強制任務嘗試在第一個可用主機上執行,然后將任何結果和事實應用於同一批次中的所有活動主機。

例如,劇本

- hosts: webservers
  tasks:
    - debug:
        msg: "Creates a backup cron on {{ inventory_hostname }}"
      run_once: true

msg: Creates a backup cron on 1.2.3.4

測試主機的順序並查看其他選項。 鑒於庫存

shell> cat hosts
webservers:
  hosts:
    1.2.3.4:
    1.2.3.5:
    1.2.3.3:

劇本顯示所選訂單的第一個主持人

- hosts: webservers
  order: inventory
  tasks:
    - debug:
        msg: "inventory: {{ inventory_hostname }}"
      run_once: true

- hosts: webservers
  order: reverse_inventory
  tasks:
    - debug:
        msg: "reverse_inventory: {{ inventory_hostname }}"
      run_once: true

- hosts: webservers
  order: sorted
  tasks:
    - debug:
        msg: "sorted: {{ inventory_hostname }}"
      run_once: true

- hosts: webservers
  order: reverse_sorted
  tasks:
    - debug:
        msg: "reverse_sorted: {{ inventory_hostname }}"
      run_once: true

- hosts: webservers
  order: shuffle
  tasks:
    - debug:
        msg: "shuffle: {{ inventory_hostname }}"
      run_once: true

給(略)

  msg: 'inventory: 1.2.3.4'
  msg: 'reverse_inventory: 1.2.3.3'
  msg: 'sorted: 1.2.3.3'
  msg: 'reverse_sorted: 1.2.3.5'
  msg: 'shuffle: 1.2.3.5'

問: 無論出於何種原因,它都不適合我。

A:在這種情況下,將任務委派給組中的第一個主持人。 請參閱委派任務 例如

    - debug:
        msg: "Creates a backup cron on {{ inventory_hostname }}"
      run_once: true
      delegate_to: groups.webservers.0

ok: [1.2.3.4 -> groups.webservers.0] => 
  msg: Creates a backup cron on 1.2.3.4

為了他人的利益,我最終使用了與上述建議完全不同的東西:

- name: Creates a backup cron file under /etc/cron.d
  cron:
    name: App Backups
    weekday: "*"
    minute: "0"
    hour: "2"
    user: app
    job: "/scripts/backups.sh"
    cron_file: app-backup
  when: ansible_hostname is regex (".*[A-za-z]1$")

就我而言,我知道第一台服務器將以數字 1 結尾。所以我對ansible_hostname變量進行了正則表達式匹配。

我意識到上述任何建議都不會提到,因為我沒有提到系統命名約定,但鑒於上述方法對我不起作用,我想為那些可能處於類似情況的人提供這種替代方案情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM