Ansible

时间:2016-05-12 08:33:58

标签: ansible ansible-2.x

我想在嵌套哈希上运行命令。我无法找到解决方案。我尝试过使用with_itemswith_dict但我认为这不适合我的用例。

在通过ansible循环时,我认为我可以使用loop-control完成此操作。我多么无法实现它。有人可以帮帮我吗。

Ansible版本:2.0.2.0

我的哈希

users:
  ankit:
    name: ankit
    access:
      opt: /opt/data
      tmp: /tmp
  gupta:
    name: gupta
    access:
      data: /opt/data/gupta

使用上面的哈希在循环中运行预期的执行。

- file: path=/opt/data state=directory owner:ankit mode=0755
- file: path=/tmp state=directory owner:ankit mode=0755
- file: path=/opt/data/gupta state=directory owner:gupta mode=0755

注意:这是一个修改过的例子。我不是在实际任务中创建文件夹。如果基于Storm Topology不存在Kafka主题,我正在创建它。哈希结构是如何相同的,我需要使用这些项

使用实际事实(https://stackoverflow.com/questions/37182895/nested-hash-in-ansible)重新发布问题

2 个答案:

答案 0 :(得分:3)

我的错误是我试图将loop_control与Ansible 2.0一起使用,因此无效。相反,我应该使用loops-and-includes-in-2-0 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_weight="1" > <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="20dp" android:layout_gravity="left" android:layout_marginLeft="1dp"/> <ImageView android:id="@+id/imageButton1" android:layout_width="40dp" android:layout_height="50dp" android:layout_marginBottom="20dp" android:layout_marginRight="40dp" android:layout_marginTop="10dp" android:layout_gravity="right" /> </FrameLayout> <TextView android:id="@+id/textView1" android:layout_width="244dp" android:layout_height="280dp" android:layout_gravity="center" android:layout_marginTop="30dp" android:text="title" android:textAppearance="?android:attr/textAppearanceSmall" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="20dp" android:layout_gravity="center" android:text="Klik hier voor de uitgebreide bezoektijden." android:textAppearance="?android:attr/textAppearanceSmall" /> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:orientation="horizontal"> <Button android:id="@+id/button11" style="?android:attr/buttonStyleSmall" android:layout_width="0dp" android:layout_height="match_parent" android:layout_marginRight="5dp" android:layout_weight="1" android:text="Facebook" /> <Button android:id="@+id/button12" style="?android:attr/buttonStyleSmall" android:layout_width="0dp" android:layout_height="match_parent" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_weight="1" android:text="Youtube" /> <Button android:id="@+id/button13" style="?android:attr/buttonStyleSmall" android:layout_width="0dp" android:layout_height="match_parent" android:layout_alignLeft="@+id/button5" android:layout_below="@+id/button8" android:layout_marginLeft="5dp" android:layout_weight="1" android:text="Twitter" /> <Button android:id="@+id/button14" style="?android:attr/buttonStyleSmall" android:layout_width="0dp" android:layout_height="match_parent" android:layout_alignLeft="@+id/button5" android:layout_below="@+id/button8" android:layout_marginLeft="5dp" android:layout_weight="1" android:text="LinkedIn" /> </LinearLayout> </LinearLayout> </LinearLayout>

main.yml

set_fact

kafka_topic.yml

- include: kafka_topic.yml
  with_dict: project.topology

答案 1 :(得分:2)

我认为没有标准循环允许您对数据结构执行此操作。

with_dict不会处理子元素。如果您有一个列表而不是一个字典,with_subelements 工作。使用此数据结构:

users:
  - name: ankit
    access:
      - /opt/data
      - /tmp
  - name: gupta
    access:
      - /opt/data/gupta

......你可以这样做:

- file: "path={{ item.1 }} state=directory owner={{ item.0.name }} mode=0755"
  with_subelements:
     - "{{ users }}"
     - access

如果您无法更改数据结构,则会变得更加复杂。您可以使用一些丑陋的解决方法,例如首先使用with_dict循环用户和include任务,然后在包含的文件中使用另一个with_dict循环 access < / EM> -items。

或者以正确/干净的方式和create your own lookup plugin进行。有了很少的python知识,你可以遍历任何数据结构。