2017-10-09 7 views
1

私はYaml形式のファイルを持っています(下記参照)。YAMLファイルの特定の文字列の後に変数値を渡す

replicaCount: 2 
strategy: 
    type: RollingUpdate 
    rollingUpdate: 
    maxSurge: 1 
    maxUnavailable: 1 
minReadySeconds: 5 
nodeSelector: 
     role: nginxplus 
image: 
    repository: 2xxxxxxxxxxx6.dkr.ecr.us-east-1.amazonaws.com/miqp-devops 
    tag: foo 
    pullPolicy: IfNotPresent 

values.ymlは今、私は別の値とキータグを置き換えたいです。値は変数から来ています。例えば、

VAR=bar 
echo $VAR 
bar 

については

私はvalues.ymlファイルを編集し、

タグに置き換えられます何かしたい:

おかげ

+1

で、このためのPerlを使用したいですか?単純な 'sed'があなたのケースで簡単に動作するはずです – Aserre

+1

ジョブの正しいツールは本当に' jq'のようなものです。 (はい、有効なYAMLを生成します - すべてのJSONは有効なYAMLです)。それ以外の場合は、構造非認識ツールを使用して構造化データを編集することに関するすべての通常の注意事項が適用されます。 –

+0

(つまり、あなたの入力がうまく構成されていないか、データの表現が少し変わった場合、それらの構造非認識ツールはそれに対処する方法を知らないでしょう;あなたの 'sed'ベースの答えが入力のために働くそれが正確に*現在のフォーマットにとどまっている場合にのみ、それと同じデータの他のテキストバージョンが存在し、それは正しく認識されないでしょう。 –

答えて

1

をsedのバー:タグ付けするFOOをアプローチ:

var="bar" 
sed -i "s/^\([[:space:]]*tag:[[:space:]]*\).*/\1$var/" values.yml 

最終values.yml内容:

replicaCount: 2 
strategy: 
    type: RollingUpdate 
    rollingUpdate: 
    maxSurge: 1 
    maxUnavailable: 1 
minReadySeconds: 5 
nodeSelector: 
     role: nginxplus 
image: 
    repository: 2xxxxxxxxxxx6.dkr.ecr.us-east-1.amazonaws.com/miqp-devops 
    tag: bar 
    pullPolicy: IfNotPresent 
+0

ありがとうローマ、あなたの解決策は働いています:) –

+0

@NikitSwaraj、あなたは歓迎です – RomanPerekhrest

+0

ファイルが 'image:{"タグ ":"を含んでいれば入力は有効で意味的には同じですfoo "、" repository ":" ... "、" pullPolicy ":" IfNotPresent "}'となります。このコンテンツをYAML仕様書に書くにはたくさんの異なる方法があり、この 'sed'アプローチは単一のものだけを扱います。 –

1

は確実にこれを行うには(はい、それはあなたのデータの表現を変更しますが、それは100%有効なYAMLのまま):

# This uses/requires the PyYAML library; "pip install PyYAML" 
yaml2json() { 
    python -c 'import yaml, json, sys; print json.dumps(yaml.safe_load(sys.stdin))' 
} 

editYaml() { 
    local file=$1; shift 
    local tempfile=$(mktemp "${file}.XXXXXX") 
    local retval 

    if jq "[email protected]" < <(yaml2json <"$file") >"$tempfile"; then 
    chmod --reference="$file" -- "$tempfile" # on GNU systems, preserve permissions 
    mv -- "$tempfile" "$file" 
    else 
    retval=$? 
    rm -f -- "$tempfile" 
    return "$retval" 
    fi 
} 

newTag=bar 
editYaml values.yml --arg newTag "$newTag" '.image.tag = $newTag' 

このアプローチがあることを保証どのように表現されていても、同じデータが同じ出力に変換されます。これは、YAMLが同じセマンティックコンテンツを書くための数多くのテキスト的に異なる方法を提供するためです。

0

私はあなたがこれまでに試してみました何YAML::Tinyモジュール

cp values.yml values.yml.orig 
perl -MYAML::Tiny -se ' 
    $file = shift @ARGV; 
    $yaml = YAML::Tiny->read($file); 
    $yaml->[0]{image}{tag} = $newtag; 
    $yaml->write($file); 
' -- -newtag="bar" values.yml 
cat values.yml 
--- 
image: 
    pullPolicy: IfNotPresent 
    repository: 2xxxxxxxxxxx6.dkr.ecr.us-east-1.amazonaws.com/miqp-devops 
    tag: bar 
minReadySeconds: '5' 
nodeSelector: 
    role: nginxplus 
replicaCount: '2' 
strategy: 
    rollingUpdate: 
    maxSurge: '1' 
    maxUnavailable: '1' 
    type: RollingUpdate 
関連する問題