Ansible 有条件地设置成为用户
我试图在一个循环中关闭数据库,问题是一些数据库作为不同的用户运行,而另一些数据库只是作为oracle运行。我以oracle用户的身份登录并运行playbook,如果数据库以oracle用户的身份运行,它将正常运行。如果它以其他用户的身份运行,我希望成为该用户(oracle用户有权这样做) 这是我的主要剧本: [oracle@ansctrlsrv.localdomainepd3]$cat test.ymlAnsible 有条件地设置成为用户,ansible,Ansible,我试图在一个循环中关闭数据库,问题是一些数据库作为不同的用户运行,而另一些数据库只是作为oracle运行。我以oracle用户的身份登录并运行playbook,如果数据库以oracle用户的身份运行,它将正常运行。如果它以其他用户的身份运行,我希望成为该用户(oracle用户有权这样做) 这是我的主要剧本: [oracle@ansctrlsrv.localdomainepd3]$cat test.yml --- - hosts: testdrive tasks: - set_fact
---
- hosts: testdrive
tasks:
- set_fact:
db_list: "{{ lookup('file', 'vars/' ~ inventory_hostname ~ '.dblist')|from_yaml }}"
- name: Shutdown running databases
include_tasks: shutdowndb.yml
loop: "{{ db_list }}"
---
- debug: msg='Shutting down {{ item }}'
- name: Execute shutdown
shell: id "{{ item }}"
register: shutdown_output
become: "{{ item is search('ebs') | ternary('yes','no') }}"
become_user: "{{ item }}"
- debug: msg="{{ shutdown_output.stdout }}"
数据库列表如下:
[oracle@ansctrlsrv.localdomainepd3]$cat vars/dbsrv.localdomain.dblist
- ebs1
- ebs2
- ndb1
[oracle@ansctrlsrv.localdomainepd3]$cat关机db.yml
---
- hosts: testdrive
tasks:
- set_fact:
db_list: "{{ lookup('file', 'vars/' ~ inventory_hostname ~ '.dblist')|from_yaml }}"
- name: Shutdown running databases
include_tasks: shutdowndb.yml
loop: "{{ db_list }}"
---
- debug: msg='Shutting down {{ item }}'
- name: Execute shutdown
shell: id "{{ item }}"
register: shutdown_output
become: "{{ item is search('ebs') | ternary('yes','no') }}"
become_user: "{{ item }}"
- debug: msg="{{ shutdown_output.stdout }}"
[oracle@ansctrlsrv.localdomainepd3]$cat库存
[testdrive]
dbsrv.localdomain
[oracle@ansctrlsrv.localdomainepd3]$ansible playbook-i库存测试.yml
---
- hosts: testdrive
tasks:
- set_fact:
db_list: "{{ lookup('file', 'vars/' ~ inventory_hostname ~ '.dblist')|from_yaml }}"
- name: Shutdown running databases
include_tasks: shutdowndb.yml
loop: "{{ db_list }}"
---
- debug: msg='Shutting down {{ item }}'
- name: Execute shutdown
shell: id "{{ item }}"
register: shutdown_output
become: "{{ item is search('ebs') | ternary('yes','no') }}"
become_user: "{{ item }}"
- debug: msg="{{ shutdown_output.stdout }}"
任务[执行关机]***
致命:[dbsrv1.localdomain]:失败!=>{“changed”:false,“module_stderr”:“与dbsrv1.localdomain的共享连接已关闭。\r\n”,“module_stdout”:“msg”:“module FAILURE\n有关确切错误,请参阅stdout/stderr”,“rc”:1}…忽略
我在另一个线程上尝试了这个问题,但最终解决了,所以在我自己意识到一些问题后,我尝试了另一个方法,比如无法使用循环运行代码块,等等。
谢谢你的帮助
固定线路
shell: id "{{ item }}"
语法正确(仅在必要时使用shell
)
下面是剧本
- hosts: testdrive
tasks:
- set_fact:
db_list: "{{ lookup('file', 'vars/' ~ inventory_hostname ~ '.dblist')|from_yaml }}"
- name: Shutdown running databases
include_tasks: shutdowndb.yml
loop: "{{ db_list }}"
使用包含的任务
$ cat shutdowndb.yml
- debug:
msg:
- "shell: {{ 'shutdown.sh ' ~ item }}"
- "become: {{ item is search('ebs')|ternary('yes', 'no') }}"
- "become_user: {{ item }}"
给予
问:“为什么whoami命令仍然给oracle而不是ebs1?” 答:简短回答:因为
been
未设置为True
调试
1) 是否有可能成为db\u列表中的所有用户?对
- hosts: test_01
become: no
remote_user: admin
vars:
db_list: ['ebs1', 'ebs2', 'ndb1']
tasks:
- command: whoami
become_user: "{{ item }}"
become: true
register: result
loop: "{{ db_list }}"
- debug:
msg: "{{ result.results|json_query('[].stdout') }}"
给予
2) 搜索
和三元
是否正常工作?对
- debug:
msg: "{{ item is search('ebs')|ternary(true, false) }}"
loop: "{{ db_list }}"
给予
3) 变成
和变成用户
工作正常吗?。对
- command: whoami
become_user: "{{ item }}"
become: "{{ item is search('ebs')|ternary(true, false) }}"
register: result
loop: "{{ db_list }}"
- debug:
msg: "{{ result.results|json_query('[].stdout') }}"
给予
我不知道如何让三元运算符工作,因此现在不会出现错误:变成:{{{'no'if item!='ebs'else'yes'}}“
。我输入了命令:“whoami”
以查看been是否工作,它仍然打印oracle
,而不是ebs1
。再次感谢您的帮助。问题可能是变成而不是字符串。请尝试。|三元(True,False)
。看起来BENG可以同时接受True/False或yes/no。因为这不会给出错误,所以我现在就使用它:BENG:{{if item!=“ebs”else“yes”}
您能否帮助解释为什么whoami命令仍然使用oracle
而不是ebs1
。我添加了逐步调试。我不能为你做更多了。如果你有什么特别的问题,请提出一个新问题。非常感谢。我想你说的都是对的,这是我最后犯的另一个错误。张贴了另一个问题。为此开展工作:
"msg": [
"ebs1",
"ebs2",
"admin"
]