2017-06-01 36 views
1

我正在致力于Ansible playbook以执行我的一些任务。在我的一个任务中,我需要切换到特定的目录,然后使用sudo执行命令,但是我需要先切换到root用户来完成所有这些操作,否则它将无法工作。所以一般这是我做的不ansible:通过切换到root用户执行命令

[email protected]:/tmp/parallel-20140422$ sudo su 
[email protected]:/tmp/parallel-20140422# sudo ./configure && make && make install 

完成以上步骤之后,我看到GNU并行库安装到我的系统正常。但通过使用Ansible的以下步骤,我没有看到我的GNU库被安装。

- name: install gnu parallel 
    command: chdir=/tmp/parallel-20140422 sudo ./configure && make && make install 

现在我的问题是如何切换到root用户并执行特定的命令。我正在运行Ansible 1.5.4,看起来像我无法升级。我甚至低于尝试,但它仍然无法正常工作:

- name: install gnu parallel 
    command: chdir=/tmp/parallel-20140422 sudo ./configure && make && make install 
    sudo: true 
    sudo_user: root 

我使用下面的命令运行我的剧本:

ansible-playbook -e 'host_key_checking=False' setup.yml -u david --ask-pass --sudo -U root --ask-sudo-pass 
+0

我不确定关于1.5.4,但是在Ansible 2.x中,当你想执行任意shell表达式时,你应该使用'shell'而不是'command'。为什么在'root'帐户下使用'sudo',你已经拥有最大的权限? –

+0

是真正的使用sudo如果我已经切换到根。如果我已经切换到root用户,我可以更改该部分以不再使用sudo。 – john

+0

我知道命令模块工作正常bcoz我验证了其他任务,他们工作正常..不知何故这个任务的问题是我需要切换到root用户,然后只执行该命令。而且我不确定我该如何使用可靠的方法来做到这一点。 – john

回答

0

您需要become directive

例如,要启动一个服务为根:

- name: Ensure the httpd service is running 
    service: 
    name: httpd 
    state: started 
    become: true 

你也可以成为另一个用户,比如Apache用户:

- name: Run a command as the apache user 
    command: somecommand 
    become: true 
    become_user: apache 

对于你的情况,这将是:

- name: install gnu parallel 
    command: chdir=/tmp/parallel-20140422 sudo ./configure && make && make install 
    become: true 
+0

在正确的1.5.4中,我不相信吗?对?我无法升级看起来像 – 2017-06-07 20:41:05

0

从您的评论:

我知道命令模块工作正常bcoz我验证了其他任务,他们工作正常。

command模块可能是打工的命令,但在这个例子中,你使用的shell语法(&&)执行多个命令。此语法在command模块中不起作用(因为此模块直接从Python运行命令并且不支持组合命令)。

在这种情况下,您需要使用shell模块。

- name: install gnu parallel 
    shell: ./configure && make && make install 
    args: 
    chdir=/tmp/parallel-20140422 
    sudo: true 
    sudo_user: root