我试图收缩几个类似代码的块,看起来像:
- ... multiple things is going here
register: list_register
- name: Generating list
set_fact: my_list="{{ list_register.results | map(attribute='ansible_facts.list_item') | list }}"
# the same code repeats...
Run Code Online (Sandbox Code Playgroud)
事实上,它们之间的唯一区别是我在这里使用不同的列表名称而不是 my_list
事实上我想这样做:
set_fact:
"{{ some var }}" : "{{ some value }}"
Run Code Online (Sandbox Code Playgroud)
我遇到过这篇文章,但在这里找不到任何答案.
是可以这样做还是有任何解决方法?
假设我在group_vars中有3个文件:
abc.yml
all.yml
xyz.yml
Run Code Online (Sandbox Code Playgroud)
并且在它们中定义了相同的变量:
- my_var: abc
- my_var: all
- my_var: xyz
Run Code Online (Sandbox Code Playgroud)
Ansible 文档说:
在任何部分中,重新定义var将覆盖先前的实例.如果多个组具有相同的变量,则加载的最后一个组获胜.如果你在play的vars:section中定义了两次变量,那么第二个获胜.
这是否意味着加载顺序是按字母顺序排列的,abc.yml
具有最低优先级,而xyz.yml
最高,或者它取决于组的顺序hosts
?
什么是装货单?
有趣的是,改变组中的组顺序hosts
也是如此,但是以不可预测的方式.
我尝试运行ansible-playbook my_var.yml -c local
(只返回变量值)的所有组合:
[all]
localhost
[xyz]
localhost
[abc]
localhost
Run Code Online (Sandbox Code Playgroud)
但我仍然无法弄清楚它是如何工作的.
如果您有不同的阶段变量,您建议使用ansible组织多阶段部署的方法是什么?
主要思想是为不同阶段定义组变量.
有两个技巧:
我想了解更多关于组织剧本,变量,主持人以及了解您的方法的优缺点的例子.
我定义了一个方法:
def method(one: 1, two: 2)
[one, two]
end
Run Code Online (Sandbox Code Playgroud)
当我这样称呼时:
method one: 'one', three: 'three'
Run Code Online (Sandbox Code Playgroud)
我明白了:
ArgumentError: unknown keyword: three
Run Code Online (Sandbox Code Playgroud)
我不想逐个从散列中提取所需的键或排除额外的键.有没有办法绕过这种行为,除了定义这样的方法:
def method(one: 1, two: 2, **other)
[one, two, other]
end
Run Code Online (Sandbox Code Playgroud) 如果我想在Ansible中跳过整个循环,我该怎么办?
根据指导方针,
在
when
与with_items
(参见循环)结合使用时,...when
语句将针对每个项目单独处理.
从而在运行这样的剧本时
---
- hosts: all
vars:
skip_the_loop: true
tasks:
- command: echo "{{ item }}"
with_items: [1, 2, 3]
when: not skip_the_loop
Run Code Online (Sandbox Code Playgroud)
我明白了
skipping: [localhost] => (item=1)
skipping: [localhost] => (item=2)
skipping: [localhost] => (item=3)
Run Code Online (Sandbox Code Playgroud)
而我不希望每次都检查一个条件.
然后我想出了使用内联条件的想法
- hosts: all
vars:
skip_the_loop: true
tasks:
- command: echo "{{ item }}"
with_items: "{{ [1, 2, 3] if not skip_the_loop else [] }}"
Run Code Online (Sandbox Code Playgroud)
它似乎解决了我的问题,但后来我没有得到任何输出.我只想说一句话:
skipping: Loop has been skipped
Run Code Online (Sandbox Code Playgroud) 我需要在第一阶段排除 Docker COPY 中的文件,但在第二阶段的另一个 COPY 中使用它,因为它会破坏 Docker 层缓存。
我的文件夹结构如下:
src/
public/
.env
package.json
nginx.conf
Run Code Online (Sandbox Code Playgroud)
我的 Dockerfile 如下所示:
FROM node:14 as builder # line-1
WORKDIR /app # line-2
COPY . /app # line-3 nginx.conf is copied but not needed
RUN yarn && yarn build # line-4
FROM nginx:1.21.1 # line-5
WORKDIR /app # line-6
COPY --from=builder /app/build /app/build # line-7
COPY nginx.conf /app # line-8 nginx.conf is copied
CMD nginx -c /app/nginx.conf # line-9
Run Code Online (Sandbox Code Playgroud)
当我更改nginx.conf
docker 层缓存时,由于第三行,缓存变得无效。
我无法使用,.dockerignore
因为它会在两个阶段都忽略它。 …
我的Dockerfile看起来像:
FROM ubuntu:18.04
RUN apt-get ...
...
COPY app /bin
Run Code Online (Sandbox Code Playgroud)
我的可执行文件app
只是bash脚本:
make -f /app/makefile $@
Run Code Online (Sandbox Code Playgroud)
当我尝试跑步
docker run -v "`pwd`:/project" -it --rm my_image app
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
standard_init_linux.go:207: exec user process caused "exec format error"
make: *** [run] Error 1
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
ansible ×4
docker ×2
dockerfile ×2
variables ×2
deployment ×1
docker-copy ×1
docker-image ×1
docker-layer ×1
dynamic ×1
entry-point ×1
jinja2 ×1
loops ×1
multistage ×1
redefinition ×1
ruby ×1
ruby-2.0 ×1