Ansible 有条件地设置成为用户

Ansible 有条件地设置成为用户,ansible,Ansible,我试图在一个循环中关闭数据库,问题是一些数据库作为不同的用户运行,而另一些数据库只是作为oracle运行。我以oracle用户的身份登录并运行playbook,如果数据库以oracle用户的身份运行,它将正常运行。如果它以其他用户的身份运行,我希望成为该用户(oracle用户有权这样做) 这是我的主要剧本: [oracle@ansctrlsrv.localdomainepd3]$cat test.yml --- - hosts: testdrive tasks: - set_fact

我试图在一个循环中关闭数据库,问题是一些数据库作为不同的用户运行,而另一些数据库只是作为oracle运行。我以oracle用户的身份登录并运行playbook,如果数据库以oracle用户的身份运行,它将正常运行。如果它以其他用户的身份运行,我希望成为该用户(oracle用户有权这样做)

这是我的主要剧本:

[oracle@ansctrlsrv.localdomainepd3]$cat test.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 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"
    ]