31494


Ansible で、変数にファイル名がバインドされているとします。その拡張子を省いて展開したいです。

以下の通り、 `regex_replace` を用いればできるではないか、と思っているのですが、うまくいっていないです。

どうやったら、やりたいことが実現できるでしょうか。

### 追記:

以下のプログラムは、本当にやりたいことである、「変数から拡張子を省いて展開」をどうにかしてできないかと試行するために作った playbook
です。シェルの機能で回避したいわけではないです。。

* * *

### test.yml

[code]

    ---
    - name: test ansible
      hosts: localhost
      user: ubuntu
      vars:
        file_name: "hoge.txt"
      tasks:
        - name: Hello server
          shell: echo "{{ file_name | regex_replace('^(.*)\\.[^\\.]*$','\\1') }}" > test.txt
    
[/code]

### 実行コマンド

[code]

    ansible-playbook test.yml
    
[/code]

### 期待する動作

  * test.txt の中身が `hoge` になる。

### 実際の動作

  * test.txt の中身が `hoge.txt` になる


CC BY-SA 3.0
2016-12-28T08:16:42.850
31490
2017-01-29T18:18:54.503
2016-12-28T08:53:50.490
754
754
question
ansible
Ansible で、ファイル名が入った変数の拡張子を省いて展開したい


置換の部分を以下のようにしてはいかがでしょうか。

[code]

    echo ${file_name%.*} > test.txt
    
[/code]

手元で試す用に一応シェルスクリプトで書くと

[code]

    #!/bin/sh
    
    file_name="hoge.txt"
    echo ${file_name%.*} > test.txt
    
[/code]


CC BY-SA 3.0
2016-12-28T08:32:05.963
31492
2016-12-28T09:21:14.897
2016-12-28T09:21:14.897
186
186
31490
answer


@unarist さんのコメントに従い、 debug モジュールを試してみることにしました。すると、期待通りの動作をしていることがわかりました。

何が、問題だったのだろうと今考えている状態です。

### 改良した playbook

[code]

    ---
    - name: test ansible
      hosts: localhost
      user: ubuntu
      vars:
        file_name: "hoge.txt"
      tasks:
        - name: Hello server
          debug:
            msg: "Expand file_name Result: {{ file_name | regex_replace('^(.*)\\.[^\\.]*$','\\1') }}"
    
[/code]

### 実行結果

[code]

    PLAY [test ansible] ************************************************************
    
    TASK [setup] *******************************************************************
    ok: [localhost]
    
    TASK [Hello server] ************************************************************
    ok: [localhost] => {
        "msg": "Expand file_name Result: hoge"
    }
    
    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=0    unreachable=0    failed=0
    
[/code]


CC BY-SA 3.0
2016-12-28T09:22:17.840
31494
2016-12-28T09:22:17.840
754
31490
answer


1つ以上の拡張子をリストに分割する `splitext`
というフィルタがあるので、それを通してから最初の要素を取り出せば、拡張子全てを除いたファイル名が得られるかと。

[code]

    ---
    - name: test ansible
      hosts: localhost
      user: ubuntu
      vars:
        file_name: "hoge.txt"
      tasks:
        - name: Hello server
          debug:
            msg: "Expand file_name Result: {{ file_name | splitext | first }}"
    
[/code]

Playbookを作らず試すならこんな感じですね。

[code]

    $ ansible localhost -m debug -a "msg={{'hoge.txt' | splitext | first }}"
    
[/code]

他にもファイルパスに関する様々なフィルタが用意されています。

<http://docs.ansible.com/ansible/playbooks_filters.html#other-useful-filters>


CC BY-SA 3.0
2016-12-28T12:12:43.377
31497
2016-12-28T12:12:43.377
8000
31490
answer