使用ansible shell模块时,如何使aws命令可用于sh?

时间:2019-05-12 13:51:00

标签: amazon-web-services ansible sh aws-cli

由于aws_s3模块将所有存储桶键放平,因此我尝试使用aws cli运行以下任务。但是,我不断收到aws: not found错误。
aws cli已正确安装,因为从主机运行完全相同的命令可以正常工作。

我的任务:

- name: Try list
  shell: aws s3 ls "{{ s3_bucket }}"

完整错误:

fatal: [cassandra-node-1]: FAILED! => {
    "changed": true, 
    "cmd": "aws s3 ls \"cassandra-snapshotter-test2\"", 
    "delta": "0:00:00.002900", 
    "end": "2019-05-12 13:48:25.705324", 
    "invocation": {
        "module_args": {
            "_raw_params": "aws s3 ls \"cassandra-snapshotter-test2\"", 
            "_uses_shell": true, 
            "argv": null, 
            "chdir": null, 
            "creates": null, 
            "executable": null, 
            "removes": null, 
            "stdin": null, 
            "warn": true
        }
    }, 
    "msg": "non-zero return code", 
    "rc": 127, 
    "start": "2019-05-12 13:48:25.702424", 
    "stderr": "/bin/sh: 1: aws: not found", 
    "stderr_lines": [
        "/bin/sh: 1: aws: not found"
    ], 
    "stdout": "", 
    "stdout_lines": []
}

为什么我不能从Ansible任务中运行aws cli?

1 个答案:

答案 0 :(得分:3)

此主机上的sh解释器无法使用AWS二进制文件。

从Shell会话运行

$ which aws

查找awscli的位置。

确保此目录包含在PATH环境变量中

$ echo $PATH

如果不是,则可以配置服务器以在打开外壳程序时将其包括在内

# bash
$ echo 'export PATH=$PATH:/path/to/awscli/dir'  >> ~/.bash_profile

# KSH/sh
$ echo 'export PATH=$PATH:/path/to/awscli/dir'  >> ~/.profile

或者,您可以使用ansible environment属性为特定的播放,任务等在内存中设置环境变量。

environment:
  PATH: "{{ lookup('env', 'PATH) }}:/path/to/awscli/dir"

最后,为了简便起见,您可以使用[defaults]部分下的executable键来修改ansible.cfg中shell模块使用的shell ansible。这将使您可以将其从sh解释器更改为bash之类的其他东西。