我试过了:
- command: ./configure chdir=/src/package/
- command: /usr/bin/make chdir=/src/package/
- command: /usr/bin/make install chdir=/src/package/
哪个有效,但我想还有更多......整洁。
所以我尝试了这个:
来自:https://stackoverflow.com/questions/24043561/multiple-commands-in-the-same-line-for-bruker-topspin,它给了我“没有这样的文件或目录”
- command: ./configure;/usr/bin/make;/usr/bin/make install chdir=/src/package/
但我找不到合适的语法:
- command: "{{ item }}" chdir=/src/package/
with_items:
./configure
/usr/bin/make
/usr/bin/make install
这不起作用,说有引用问题。
任何?
答案 0 :(得分:78)
如果YAML中的值以大括号({
)开头,则YAML解析器假定它是a dictionary。因此,对于这样的情况,如果值中存在(Jinja2)变量,则需要采用以下两种策略之一来避免混淆YAML解析器:
引用整个命令:
- command: "{{ item }} chdir=/src/package/"
with_items:
- ./configure
- /usr/bin/make
- /usr/bin/make install
或更改参数的顺序:
- command: chdir=/src/package/ {{ item }}
with_items:
- ./configure
- /usr/bin/make
- /usr/bin/make install
感谢@RamondelaFuente的替代建议。
答案 1 :(得分:41)
要使用ansible运行多个shell命令,您可以将 shell 模块与多行字符串一起使用(请注意shell后的垂直斜杠 :),如下例所示:
- name: Build nginx
shell: |
cd nginx-1.11.13
sudo ./configure
sudo make
sudo make install
答案 2 :(得分:5)
我遇到了同样的问题。在我的例子中,我的部分变量在字典中,即with_dict变量(循环),我必须在每个item.key上运行3个命令。此解决方案更具相关性,您必须使用with_dict字典并运行多个命令(不需要with_items )
在一个任务中使用with_dict和with_items没有帮助,因为它没有解析变量。
我的任务就像:
- name: Make install git source
command: "{{ item }}"
with_items:
- cd {{ tools_dir }}/{{ item.value.artifact_dir }}
- make prefix={{ tools_dir }}/{{ item.value.artifact_dir }} all
- make prefix={{ tools_dir }}/{{ item.value.artifact_dir }} install
with_dict: "{{ git_versions }}"
roles / git / defaults / main.yml是:
---
tool: git
default_git: git_2_6_3
git_versions:
git_2_6_3:
git_tar_name: git-2.6.3.tar.gz
git_tar_dir: git-2.6.3
git_tar_url: https://www.kernel.org/pub/software/scm/git/git-2.6.3.tar.gz
以上导致每个{{item}}的错误类似于以下内容(对于上面提到的3个命令)。如您所见,tools_dir的值未填充(tools_dir是一个在公共角色中定义的变量&defaults./ main.yml,并且还没有填充/解析item.value.git_tar_dir值。)
failed: [server01.poc.jenkins] => (item=cd {# tools_dir #}/{# item.value.git_tar_dir #}) => {"cmd": "cd '{#' tools_dir '#}/{#' item.value.git_tar_dir '#}'", "failed": true, "item": "cd {# tools_dir #}/{# item.value.git_tar_dir #}", "rc": 2}
msg: [Errno 2] No such file or directory
解决方案很简单。而不是使用" COMMAND"在Ansible的模块中,我用了#34; Shell"模块并在roles / git / defaults / main.yml
中创建了一个变量所以,现在roles / git / defaults / main.yml看起来像:
---
tool: git
default_git: git_2_6_3
git_versions:
git_2_6_3:
git_tar_name: git-2.6.3.tar.gz
git_tar_dir: git-2.6.3
git_tar_url: https://www.kernel.org/pub/software/scm/git/git-2.6.3.tar.gz
#git_pre_requisites_install_cmds: "cd {{ tools_dir }}/{{ item.value.git_tar_dir }} && make prefix={{ tools_dir }}/{{ item.value.git_tar_dir }} all && make prefix={{ tools_dir }}/{{ item.value.git_tar_dir }} install"
#or use this if you want git installation to work in ~/tools/git-x.x.x
git_pre_requisites_install_cmds: "cd {{ tools_dir }}/{{ item.value.git_tar_dir }} && make prefix=`pwd` all && make prefix=`pwd` install"
#or use this if you want git installation to use the default prefix during make
#git_pre_requisites_install_cmds: "cd {{ tools_dir }}/{{ item.value.git_tar_dir }} && make all && make install"
任务 roles / git / tasks / main.yml 如下所示:
- name: Make install from git source
shell: "{{ git_pre_requisites_install_cmds }}"
become_user: "{{ build_user }}"
with_dict: "{{ git_versions }}"
tags:
- koba
这一次,成功替换了值,因为模块是" SHELL"和ansible输出回显正确的值。 这并不需要with_items:循环。
"cmd": "cd ~/tools/git-2.6.3 && make prefix=/home/giga/tools/git-2.6.3 all && make prefix=/home/giga/tools/git-2.6.3 install",
答案 3 :(得分:3)
你也可以这样做:
- command: "{{ item }}"
args:
chdir: "/src/package/"
with_items:
- "./configure"
- "/usr/bin/make"
- "/usr/bin/make install"
希望可能有助于其他
答案 4 :(得分:3)
Shell为我工作。
简而言之,Shell与运行Shell脚本相同。
注释:
以下示例显示了shell中的错误,但在执行结束时成功。
- name: test shell with an error
become: no
shell: |
rm -f /test1 # This should be an error.
echo "test2"
echo "test1"
echo "test3" # success
此示例显示stopinng shell并退出1错误。
- name: test shell with exit 1
become: no
shell: |
rm -f /test1 # This should be an error.
echo "test2"
exit 1 # this stops ansible due to returning an error
echo "test1"
echo "test3" # success
参考: https://docs.ansible.com/ansible/latest/modules/shell_module.html
答案 5 :(得分:0)
这里是这样的工人。 \ o /
- name: "Exec items"
shell: "{{ item }}"
with_items:
- echo "hello"
- echo "hello2"