首页 > 解决方案 > 使用 ansible(HDFS 存储)在命令行中创建文件夹

问题描述

我正在尝试在 HDFS 存储上创建文件夹结构。我有 3 个主文件夹,每个文件夹都有子文件夹。

我在更新子文件夹时遇到问题 - 我希望将执行以下命令

但是相反,执行了以下命令(我使用 debug msg 来打印失败的第二个任务的命令)看起来我需要在作为字典的部门上运行一个循环

ok: [10.201.51.16] => (item={u'department': [u'it', u'logistic'], u'company_folder_name': u'/ibm'}) => {
    "msg": "hadoop fs -mkdir /company//ibm/[u'it', u'logistic']"
}
ok: [10.201.51.16] => (item={u'department': None, u'company_folder_name': u'/hp'}) => {
    "msg": "hadoop fs -mkdir /company//hp/"
}
ok: [10.201.51.16] => (item={u'department': [u'it'], u'company_folder_name': u'/dell'}) => {
    "msg": "hadoop fs -mkdir /company//dell/[u'it']"

谢谢你。

配置文件:

companies:
     - company_folder_name: /ibm
       department:
            - it
            - logistic
     - company_folder_name: /hp
       department:
     - company_folder_name: /dell
       department:
            - it

剧本:

## Createing the main folders - working fine ##
   - name: create company folders
     shell: hadoop fs -mkdir {{ item.company_folder_name }}
     register: result
     ignore_errors: yes
     with_items:
            - "{{ companies }}"

## Create subfolders - Not working ##
   - name: create department folders
     shell: hadoop fs -mkdir {{ item.company_folder_name }}/{{item.department}}
     register: result
     ignore_errors: yes
     with_items:
            - "{{ companies }}"

标签: ansible

解决方案


您的第一项任务是创建公司基本目录。

对于下一个,我们首先在列表中选择具有非空departement字段的对象。这是在下面使用selectattr过滤器完成的

然后我们使用subelements查找在此列表上循环,以便我们为每个公司/部门组合获得一次迭代。

结果剧本如下:

---
- hosts: localhost
  gather_facts: false

  vars:
    companies:
      - company_folder_name: /ibm
        department:
          - it
          - logistic
      - company_folder_name: /hp
        department:
      - company_folder_name: /dell
        department:
          - it

  tasks:

    - name: create company folders
      debug:
        msg: "hadoop fs -mkdir {{ item.company_folder_name }}"
      with_items: "{{ companies }}"

    - name: create department folders
      debug:
        msg: "hadoop fs -mkdir {{ item.0.company_folder_name }}/{{ item.1 }}"
      with_subelements:
        - "{{ companies | selectattr('department') | list }}"
        - department

这使:

PLAY [localhost] ***************************************************************************************************************************************

TASK [create company folders] **************************************************************************************************************************
ok: [localhost] => (item={'company_folder_name': '/ibm', 'department': ['it', 'logistic']}) => {
    "msg": "hadoop fs -mkdir /ibm"
}
ok: [localhost] => (item={'company_folder_name': '/hp', 'department': None}) => {
    "msg": "hadoop fs -mkdir /hp"
}
ok: [localhost] => (item={'company_folder_name': '/dell', 'department': ['it']}) => {
    "msg": "hadoop fs -mkdir /dell"
}

TASK [create department folders] ***********************************************************************************************************************
ok: [localhost] => (item=[{'company_folder_name': '/ibm'}, 'it']) => {
    "msg": "hadoop fs -mkdir /ibm/it"
}
ok: [localhost] => (item=[{'company_folder_name': '/ibm'}, 'logistic']) => {
    "msg": "hadoop fs -mkdir /ibm/logistic"
}
ok: [localhost] => (item=[{'company_folder_name': '/dell'}, 'it']) => {
    "msg": "hadoop fs -mkdir /dell/it"
}

PLAY RECAP *********************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

推荐阅读