web-dev-qa-db-fra.com

Est-il possible de modifier un fichier yml via un script Shell?

Voici à quoi ressemble mon docker-compose.yml.

nginx:
  container_name: 'nginx'
  image: 'nginx:1.11'
  restart: 'always'
  ports:
    - '80:80'
    - '443:443'
  volumes:
    - '/opt/nginx/conf.d:/etc/nginx/conf.d:ro'
  links:
    - 'anything'

Maintenant, je dois ajouter du contenu via le script Shell (sur un serveur Ubuntu). Je ne sais pas trop si c'est possible du tout:

  1. Ajouter un nouvel élément à nginx/links, s'il n'existe pas
  2. Ajouter le bloc newthing si aucun nouveau bloc n'est existant

Le nouveau contenu devrait ressembler à ceci:

nginx:
  container_name: 'nginx'
  image: 'nginx:1.11'
  restart: 'always'
  ports:
    - '80:80'
    - '443:443'
  volumes:
    - '/opt/nginx/conf.d:/etc/nginx/conf.d:ro'
    - '/etc/letsencrypt:/etc/letsencrypt'
  links:
    - 'anything'
    - 'newthing'

newthing:
  container_name: foo
  image: 'newthing:1.2.3'
  restart: always
  hostname: 'example.com'
12
user3142695

Il existe un certain nombre de bibliothèques yaml pour Perl, Python etc. si c'est ok de ne pas le faire directement à partir d'un script Shell, mais d'utiliser un autre langage.

Une autre option consiste à installer une ligne de commande processeur yaml , et à l'appeler à partir de votre script Shell.

6
dirkt

J'ai écrit https://github.com/kislyuk/yq , un wrapper autour https://stedolan.github.io/jq/ , pour résoudre ce cas d'utilisation.

8
weaver

J'ai écrit yaml_cli ( https://github.com/Gallore/yaml_cli ) pour faire exactement ce dont vous avez besoin. Il est basé sur python. Ce serait la syntaxe de votre exemple:

yaml_cli \
  -f docker-compose.yml \                # read from and save to file
  --list-append \                        # flag to append to lists instead of replacing existing values
  -s nginx:links newthing \              # add a value of type string; here you need --list-append
  -s newthing:container_name foo \       # key 'newthing' is created automatically
  -s newthing:image 'newthing:1.2.3' \   #
  -s newthing:restart always \           #
  -s newthing:hostname 'example.com'     #

Les commentaires sur yaml_cli sont appréciés.

7
Andy Werner

Étant donné que la raison pour laquelle vous souhaitez effectuer cette opération est de modifier un fichier Docker-compose, une autre alternative consiste à utiliser un fichier JSON. Docker-compose prend désormais en charge fichiers JSON . La prise en charge de la manipulation en ligne de commande des JSON est déjà très bonne (ex: jq )

1
Vivek Kodira