我是一個新的 ansible 用戶,從 shell 腳本集合切換到 ansible playbook。我目前的使用者管理系統僅當使用者已被授予對該伺服器類別、位置和環境的存取權限(或其中任何一個設定為通配符/任意)時才允許將使用者新增至系統。
伺服器類別、位置和環境以(僅根可讀/可寫入)檔案的形式本機儲存在客戶端伺服器本身上,如下所示:
LD_CLASS="app"
LD_LOC="dfw"
LD_ENV="prod"
我發現了一些我認為與我想要的類似的範例,我仍然不確定如何從 ansible 用戶端獲取變量,以及如何確保在添加之前滿足所有 3 個類別、位置和環境要求用戶。我設想一個像這樣的變數文件:
users:
-name: user1
uid: 60001
gid: 60001
class: app
location: any
env: dev
-name: user2
uid: 60002
gid: 60002
class: app
location: dfw
env: prod
根據從我正在配置的 ansible 用戶端收集的變量,用戶模組條目看起來像這樣(請注意偽代碼,因為我不確定如何實際完成此操作):
- user:
name: '{{ item.name }}'
state: '{ (If $LD_LOC matches location variable, or is set to any) & ($LD_ENV matches env variable, or is set to any) & ($LD_CLASS matches class variable, or is set to any) } present{% else %}absent{% endif %}'
uid: '{{ item.uid }}'
with_items: users
我不想依賴 ansible 角色,而是從 ansible 用戶端本身獲取類別、位置和環境數據,至少部分是因為這是我們目前擁有的系統,它可以幫助我們輕鬆過渡到 ansible,同時保留一些資訊現有且熟悉的工具。我正在尋找的可能嗎?
答案1
有一個功能叫當地事實在安西布爾:
修改您的「屬性」文件,如下所示,將其儲存在 中
/etc/ansible/facts.d/server_meta.fact
,並根據需要套用權限:[settings] ld_class=app ld_loc=dfw ld_env=prod
然後運行您的劇本並參考
state
參數中的這些事實:state: "{{ (ansible_local.server_meta.settings.ld_loc == 'dfw' and ansible_local.server_meta.settings.ld_class == 'app' and ansible_local.server_meta.settings.ld_env == 'prod' ) | ternary('present', 'absent') }}"