2017-03-02 37 views
0

我有一個作爲Oracle用戶在數據庫上執行一些預先檢查的手冊。遠程節點是AIX服務器,因此我創建了一個通過劇本運行的shell腳本。限制在遠程節點上使用sudoers的Ansible腳本模塊

--- 
- hosts: db 
    var_files: 
    - ansible_var.yml 

    tasks: 
    - name: "DB Checks" 
    become: True 
    become_user: oracle 
    script: "{ db_prechk }" 

在AIX服務器上,我增加了以下條目sudoers文件

ansible ALL=(oracle) NOPASSWD: /tmp/ansible-tmp-*/db_prechecks.sh 

但劇本失敗,出現錯誤,它的等待特權升級提示。

如果以root用戶身份運行,則運行良好。但是我們不希望Ansible控制器和遠程節點之間的無密碼根。所以我們在控制器和遠程節點上創建了一個合適的用戶並交換了SSH密鑰。

這也運行,如果在sudoers條目只是

ansible ALL=(oracle) NOPASSWD: ALL 

我們不想這樣通過ansible用戶ID完全訪問oracle用戶ID了。

我在詳細模式下運行了playbook,可以看到Ansible正在將腳本複製到remote_tmp目錄並正在執行它作爲oracle用戶標識。在那種情況下,sudoers行應該允許它運行?

+1

有時/ tmp目錄安裝有NOEXEC。看看/ etc/fstab – bodo

+0

@bodo這並不能解釋爲什麼它使用'NOPASSWD:ALL'。 – techraf

回答

1

如果你看一下詳細模式輸出,你會看到實際的命令從您在sudoers文件中指定的一個不同:

< 127.0.0.1> SSH:EXEC SSH -o ForwardAgent = yes -o StrictHostKeyChecking = no -o UserKnownHostsFile =/dev/null -o IdentitiesOnly = yes -o ControlMaster = auto -o ControlPersist = 60s -o StrictHostKeyChecking = no -o Port = 2202 -o'IdentityFile =「/ Users/techraf/devos/testground/debian/.vagrant/machines/debian/virtualbox/private_key「'-o KbdInteractiveAuthentication = no -o PreferredAuthentications = gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication = no -o User = ansible -o ConnectTimeout = 120 -o ControlPath = /使用rs/techraf/.ansible/cp/ansible-ssh-%h-%p-%r -tt 127.0.0.1'/ bin/sh -c'''''sudo -H -S -n -u oracle/bin/sh -c'''''''''''''''''''echo BECOME-SUCCESS-xoamupogqwtteubvedoscaghzmfascsr;     /tmp/ansible-tmp-1488508771.72-271591203197790/db_prechecks.sh '「' 」'「 '」' 「'」 '「' 」」 & &睡眠0' 「'」'

所以在sudo -u oracle之後執行的是/bin/sh -c

我設法過濾工作字符串:

ansible ALL=(oracle) NOPASSWD: /bin/sh -c echo BECOME-SUCCESS*; * /tmp/ansible-tmp-*/db_prechecks.sh* 

但它是建立在試驗和錯誤。我不確定爲什麼*需要在;/tmp/...之間以及最後,否則它不起作用。

在這兩個地方Ansible增加了多餘的空格字符,這似乎是原因,因爲向shell命令添加空格(在sudoers文件中指定)的確影響到sudo的能力。

您可能會?代替*嘗試,我會測試後

+0

我嘗試使用'?'和'[a-z]',但它不起作用。我回到了'*'並會繼續檢查 – kottapar