代码之家  ›  专栏  ›  技术社区  ›  jlb

ansible playbook:无法以root用户身份启动服务

  •  1
  • jlb  · 技术社区  · 6 年前

    我一天中的大部分时间都在想这个问题,我尽我所能都没有成功,即使在系统管理员的帮助下。(请注意,我根本不是一个可靠的专家,我今天发现了这一点)

    上下文:我试图通过gitlab运行实现java服务的连续集成。管道将在推送过程中运行测试、打包jar,然后运行一个可用的剧本来停止现有服务、替换jar,然后再次启动服务。我们在google cloud中有这样的产品,它运行得很好。我正试图在这之前添加一个额外的步骤,在localhost上执行同样的操作。

    我只是不明白为什么ansible无法执行“sudo service XXXX stop | start”。我只知道

    致命:[本地主机]:失败=&燃气轮机;{“changed”:false,“failed”:true,“module\u stderr”:“抱歉,请重试。\n[sudo via ansible,key=nbjplyhtvodoeqooejtlnhxhqubbjy]密码:\n密码:\n密码:1次错误的密码尝试\n”,“module\u stdout”:“,”msg“:”module FAILURE“,”rc“:1}

    以下是我所称的gitlab管道阶段:

    indexer-integration:
    stage: deploy integration
    script:
       - ansible-playbook -i ~/git/ansible/inventory deploy_integration.yml --vault-password-file=/home/gitlab-runner/vault.txt
     when: on_success
    

    金库txt包含vault加密密码。下面是deploy\u集成。yml公司

    ---
    - name: deploy integration saleindexer
      hosts: localhost
      gather_facts: no
      user: test-ccc #this is the user that I created as a test
      connection: local
      vars_files:
         - /home/gitlab-runner/secret.txt  #holds the sudo password
      tasks:
        - name: Stop indexer
          service: name=indexer state=stopped
          become: true
          become_user: root
        - name: Clean JAR
          become: true
          become_user: root
          file:
             state: absent
             path: '/PATH/indexer-latest.jar'
        - name: Copy JAR
          become: true
          become_user: root
          copy:
              src: 'target/indexer-latest.jar'
             dest: '/PATH/indexer-latest.jar'
        - name: Start indexer
            service: name=indexer state=started
          become: true
          become_user: root
    

    用户“test ccc”是我创建的另一个用户(组根的一部分,在sudoer文件中),以确保它不是与gitlab runner用户相关的问题(因为这里显然没有人能记住该用户xD的sudo密码)

    我试过很多好东西,包括

    shell: echo 'password' | sudo -S service indexer stop
    

    在命令行中工作。但如果由ansible执行,我得到的只是一条提示消息,要求我输入sudo密码

    谢谢

    按评论请求编辑:机密。txt具有:

     ansible_become_pass: password 
    

    在命令行中使用该用户时(su用户/sudo服务启动…)并提示输入密码,效果良好。我认为问题在于,要么ansible总是提示输入密码,要么密码没有正确传递给任务。 sshd\u config有一行“permitrotlogin yes”

    1 回复  |  直到 6 年前
        1
  •  0
  •   jlb    6 年前

    好的,多亏了techraf的回复(现已删除),我注意到

    user: test-ccc 
    

    实际上是无用的,所有内容仍然由“gitlab runner”用户运行。所以我:

    • 将我的所有操作都放在脚本后期构建中。上海

    • 将gitlab Runner添加到sudoers中,并为该脚本提供nopassword

      gitlab runner ALL=(ALL)NOPASSWD:/home/PATH/postbuild。上海

    • 从ansible任务中删除了有关传递密码和机密的所有内容,并改为使用:

      shell:sudo-S/home/PATH/postbuild。上海

    这样就可以执行脚本,停止/启动服务。即使使用service:name=indexer state=started并为用户提供NOPASSWD:ALL仍然会导致错误(我对问题的评论中的错误),我也会将此标记为已回答。如果有人能在评论中阐明这一点。。。。