簡體   English   中英

將傳遞變量傳遞給主機的Ansible劇本:雙引號

[英]Issue passing variable to Ansible playbook for hosts: with double quotes

我正在嘗試編寫一本開始扮演角色劇本並將其主機列表傳遞給它的劇本。 “主”劇本中有一些負載平衡邏輯,我不想在每個角色劇本中都重復,也無法放入site.yml中。

inventory.yml


[webservers]
Web1
Web2
Web3
Web4

master.yml

---
- name: Split Inventory into Odd/Even
  hosts: all
  gather_facts: false

  tasks:

    - name: Set Group Odd
      set_fact:
        group_type: "odd"
      when: (inventory_hostname.split(".")[0])[-1] | int is odd

    - name: Set Group Even
      set_fact:
        group_type: "even"
      when: (inventory_hostname.split(".")[0])[-1] | int is even 

    - name: Make new groups "odd" or "even"
      group_by:
        key: "{{ group_type }}"

- name: Perform Roles on Odd 

  include: webservers.yml hosts={{ groups['odd'] | join(' ')}}


- name: Perform Roles on Even 

  include: webservers.yml hosts={{ groups['even'] | join(' ')}}

webservers.yml


- name: Perform Tasks on Webservers
  hosts: webservers:&"{{ hosts | replace('\"','')}}"
  roles:
    - pause

join('')將主機列表展平為一個字符串,每個字符串之間用空格隔開。 當我運行劇本時,它將主機列表傳遞給webservers.yml,但是它在開頭和結尾添加了雙引號,導致webservers.yml不執行任何操作,因為沒有主機匹配。 我假設replace('\\“','')會刪除字符串周圍的引號,但事實並非如此,這是來自webservers.yml的示例輸出:

[WARNING]: Could not match supplied host pattern, ignoring: Web4"

[WARNING]: Could not match supplied host pattern, ignoring: "Web2

有任何想法嗎? hosts:處理過濾是否不同?

我覺得您錯誤地使用了角色和戲劇。 執行任務時,請勿更改主機列表,否則將執行此任務或角色。 基本上,只有玩(帶有“主持人:...,任務:...,角色:...”的東西)才能控制運行位置。

很少有例外,例如您可以與代表團一起玩等等。 但是對於您而言,任何嘗試使用任務或角色來控制主機列表的嘗試只會帶來痛苦和仇恨(朝着自己,朝旁,等等)。

要正確執行此操作,只需將另一個劇本添加到您的劇本中(該劇本是一個劇本列表)。

這是您的代碼,略有修改。

---
- name: Split Inventory into Odd/Even
  hosts: all
  gather_facts: false

  tasks:

    - name: Set Group Odd
      set_fact:
        group_type: "odd"
      when: (inventory_hostname.split(".")[0])[-1] | int is odd

    - name: Set Group Even
      set_fact:
        group_type: "even"
      when: (inventory_hostname.split(".")[0])[-1] | int is even 

    - name: Make new groups "odd" or "even"
      group_by:
        key: "{{ group_type }}"


- name: Doing odd things
  hosts: odd
  gather_facts: false
  tasks:
   - name: Perform Roles
     include: webservers.yml


- name: Doing even things
  hosts: even
  gather_facts: false
  tasks:
   - name: Perform Roles
     include: webservers.yml

可以看到,我剛剛將一個劇本分配給了兩個組(“奇數”和“偶數”)。 動態組在劇本的劇本之間保留,並且在這一點上與任何其他組都沒有區別。

PS請勿使用“ include”,而應使用“ import_tasks”(在較新版本的ansible中,includes很危險,請盡量避免使用它們。)

暫無
暫無

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

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