[英]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.