lookup: ファイルやテンプレートを取り込む †
- Lookups
- localにあるファイルを読み込み、変数へ展開する。remoteは非対応
別のyamlファイルを変数に取り込む †
- YAML自体の機能として、アンカー、エイリアス、dict型のマージが出来る。 Memo/yaml#nc08d175
- list型は {{ list1 + list2 }} で追加
- lookup('file', 'var1.yml')で読み込んだ場合は、var1.yml内の変数展開("{{ varname }}")はされない。
- var1.yml
name: {{ name1 }}
ユーザ名, パスワードの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: 初めに見つけたアイテムを返す †
- 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ファイルを読む †
外部ファイルを変数に取り込む †
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