Memo/Ansible/Lookups

https://dexlab.net:443/pukiwiki/index.php?Memo/Ansible/Lookups
 


lookup: ファイルやテンプレートを取り込む

  • Lookups
    • localにあるファイルを読み込み、変数へ展開する。remoteは非対応
  • jinja2テンプレートで変数を展開して取り込む
    - debug: msg="{{ lookup('template', './some_template.j2') }}"

別のyamlファイルを変数に取り込む

  • YAML自体の機能として、アンカー、エイリアス、dict型のマージが出来る。 Memo/yaml#nc08d175
  • list型は {{ list1 + list2 }} で追加
  • lookup('file', 'var1.yml')で読み込んだ場合は、var1.yml内の変数展開("{{ varname }}")はされない。
  • var1.yml
    name: {{ name1 }}
  • var2.yml
    name: bar
  • playbook.yml
    - hosts: localhost
      connection: local
      vars:
        name1: foo
        list1:
        - "{{ lookup('template', 'var1.yml') | from_yaml }}"
        - "{{ lookup('template', 'var2.yml') | from_yaml }}"
      tasks:
      - debug:
          var: list1
  • 実行結果
    TASK [debug] *****************************************************************************************************************************************
    ok: [localhost] => {
        "list1": [
            {
                "name": "foo"
            },
            {
                "name": "bar"
            }
        ]
    }

ユーザ名, パスワードのdictを生成する

  • 複数のemailアドレスを入力後、パスワードを自動生成したい。
    • 既知の問題: trimを使っても "," の前後に半角スペースがあるとスキップされてしまう
  • パスワード: 16桁、ascii, 数字のみ
  • 冪等性: 初回だけ「/tmp/user.<user name>.password.txt」を生成する
  • playbook.yml
    ---
    - hosts: localhost
      connection: local
      gather_facts: false
      become: false
      vars:
        - debug: 1
        - users: []
        - name: "emails"
          prompt: "Enter emails (user1@example.com,user2@example.com,...)"
          confirm: no
          private: no
          default: ""
    
      tasks:
      - block:
        - set_fact:
            users: >
              {{
                users
                + [{
                  'email': item
                  , 'password': lookup('password', '/tmp/user.' + item + '.password.txt length=16 chars=ascii_letters,digits')
                  }]
              }}
          with_items: "{{ emails.split(',') | trim }}"
    
        - debug:
            var: users
          when: debug
    
        tags:
        - user
  • 実行
    ansible-playbook /tmp/playbook.yml -e "emails=user1@example.com,user2@example.com"
    ...
    TASK [debug] *******************************************************************************************************************************************************
    ok: [localhost] => {
        "users": [
            {
                "email": "user1@example.com", 
                "password": "hHy05pYvpfNBn1S9"
            }, 
            {
                "email": "user2@example.com", 
                "password": "dcqzCC0Zcw9LKc0a"
            }
        ]
    }
    ...
    
    # user毎のパスワードが入ったファイルが出来る
    ls /tmp/user.*.txt
    /tmp/user.user1@example.com.password.txt  /tmp/user.user2@example.com.password.txt

first_found: 初めに見つけたアイテムを返す

  • 例: 変数を纏めたファイルを default.yaml から順番に探して読む
    - include_vars: "{{ lookup('first_found', possible_files) }}"
      vars:
        possible_files:
          - "{{ ansible_distribution }}.yaml"
          - "{{ ansible_os_family }}.yaml"
          - default.yaml
  • ansible 2.9.6: docの通りでは「skip: yes」が動作しないように見えた。以下の書き方なら動作した。
    • NG:
      - include_vars: "{{ lookup('first_found', files=_files, skip=yes ) }}"
    • OK: 「when != ""」だと、空配列の場合でもtrue判定になるため、lengthを使っている。lengthなしだと、deprecated warningが出る。
      - include_vars: "{{ files }}"
        when: files | length
        vars:
          params:
            files:
              - "dir1/var1.yml"
            skip: yes
          files: "{{ lookup('first_found', params) }}"

javaのpropertiesを読む

- debug: msg="user.name is {{ lookup('ini', 'user.name type=properties file=user.properties') }}"

iniファイルを読む

  • v2.0以上で対応
  • aws configのdefaultセクションを読む。ただし、「section」に空白が含まれる場合、エラーになる。
    - debug: msg={{ lookup('ini', 'aws_access_key_id section=default file=~/.aws/config') }}
  • パラメータを渡したい場合、formatを使う
    - debug: msg="{{ lookup('ini', 'aws_access_key_id section=%s file=~/.aws/config'|format(section)) }}"

外部ファイルを変数に取り込む

lookup 関数で出来た

  • EC2(VPC)起動時のuser_dataにcloudinitのファイルを設定する
    • ansible 1.7.1で動作確認
    • roles/cloudinit/files/centos6.yml
    • playbook.yml
      - hosts: 127.0.0.1
        gather_facts: False
        vars:
          ec2_user_data: "{{ lookup('file', 'roles/cloudinit/files/centos6.yml') }}"
        tasks:
        - name: ec2 instance
          local_action:
            module: ec2
            keypair: example-key
            group: example-sg
            instance_type: t2.micro
            image: ami-xxxxxxxx
            region: ap-northeast-1
            vpc_subnet_id: subnet-xxxxxxxx
            assign_public_ip: yes
            count: 1
            volumes:
              - device_name: /dev/sda1
                volume_size: 10
      #        - device_name: /dev/sdb # t2インスタンスはephemeral diskは無い
      #          ephemeral: ephemeral0
            instance_tags: '{"Name":"test.example.com","key2":"val2"}'
            user_data: "{{ ec2_user_data }}"
            wait: yes
            wait_timeout: 600

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-09-09 (水) 17:48:00 (21d)