小编emm*_*dee的帖子

保留缩进和换行符的 YAML 多行字符串

背景:

这是一个 Ansible 剧本,使用模板从模板构建 yaml 文件。所以基本上我有一个 jinja2 模板文件,其中一行如下:

private_key: {{ myvar }}
Run Code Online (Sandbox Code Playgroud)

Ansible 使用 yaml 来定义变量。所以我会填写这样的myvar值。这里我使用|特殊字符来定义多行字符串:

myvar: |

        - "-----BEGIN PRIVATE KEY-----"
        - "asdfasdfasdfasdfasdfasdfadfasdfasdfasdfasdfasdfssadf"
        - "asdfasdfasdfasdfasdfasdfadfasdfasdfasdfasdfasdfssadf"
        - "asdfasdfasdfasdfasdfasdfadfasdfasdfasdfasdfasdfssadf"
        - "asdfasdfasdfasdfasdfasdfadfasdfasdfasdfasdfasdfssadf"
        - "asdfasdfasdfasdfasdfasdfadfasdfasdfasdfasdfasdfssadf"
        - "asdfasdfasdfasdfasdfasdfadfasdfasdfasdfasdfasdfssadf"
        - "zzzzzzzzzzzzzzzzzz="
        - "-----END PRIVATE KEY-----"
Run Code Online (Sandbox Code Playgroud)

然而,输出修剪掉了缩进:

  private_key:
- "-----BEGIN PRIVATE KEY-----"
- "asdfasdfasdfasdfasdfasdfadfasdfasdfasdfasdfasdfssadf"
- "asdfasdfasdfasdfasdfasdfadfasdfasdfasdfasdfasdfssadf"
- "asdfasdfasdfasdfasdfasdfadfasdfasdfasdfasdfasdfssadf"
- "asdfasdfasdfasdfasdfasdfadfasdfasdfasdfasdfasdfssadf"
- "asdfasdfasdfasdfasdfasdfadfasdfasdfasdfasdfasdfssadf"
- "asdfasdfasdfasdfasdfasdfadfasdfasdfasdfasdfasdfssadf"
- "zzzzzzzzzzzzzzzzzz="
- "-----END PRIVATE KEY-----"
Run Code Online (Sandbox Code Playgroud)

由于输出文件本身就是一个yaml,所以我需要保留缩进。似乎不管怎样我都会失去缩进。

我需要最终结果看起来完全像这样:

  private_key:
    - "-----BEGIN PRIVATE KEY-----"
    - …
Run Code Online (Sandbox Code Playgroud)

yaml jinja2 ansible

9
推荐指数
1
解决办法
5852
查看次数

在Python中使用ETree保存XML.它不保留命名空间,并添加ns0,ns1和删除xmlns标记

我看到这里有类似的问题,但没有什么能完全帮助我.我还查看了有关命名空间的官方文​​档,但找不到任何真正帮助我的文档,也许我只是对XML格式化方面的新手.我明白也许我需要创建自己的命名空间字典?无论哪种方式,这是我的情况:

我从API调用中得到一个结果,它给了我一个XML,它在我的Python应用程序中存储为一个字符串.

我想要完成的只是抓取这个XML,交换一个微小的值(b:字符串值用户ConditionValue/Default但这与此问题无关)然后将其保存为字符串以便稍后在Rest POST中发送呼叫.

源XML看起来像这样:

<Context xmlns="http://Test.the.Sdk/2010/07" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<xmlns i:nil="true" xmlns="http://schema.test.org/2004/07/Test.Soa.Vocab" xmlns:a="http://schema.test.org/2004/07/System.Xml.Serialize"/>
<Conditions xmlns:a="http://schema.test.org/2004/07/Test.Soa.Vocab">
    <a:Condition>
        <a:xmlns i:nil="true" xmlns:b="http://schema.test.org/2004/07/System.Xml.Serialize"/>
        <Identifier>a23aacaf-9b6b-424f-92bb-5ab71505e3bc</Identifier>
        <Name>Code</Name>
        <ParameterSelections/>
        <ParameterSetCollections/>
        <Parameters/>
        <Summary i:nil="true"/>
        <Instance>25486d6c-36ba-4ab2-9fa6-0dbafbcf0389</Instance>
        <ConditionValue>
            <ComplexValue i:nil="true"/>
            <Text i:nil="true" xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
            <Default>
                <ComplexValue i:nil="true"/>
                <Text xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
                    <b:string>NULLCODE</b:string>
                </Text>
            </Default>
        </ConditionValue>
        <TypeCode>String</TypeCode>
    </a:Condition>
    <a:Condition>
        <a:xmlns i:nil="true" xmlns:b="http://schema.test.org/2004/07/System.Xml.Serialize"/>
        <Identifier>0af860f6-5611-4a23-96dc-eb3863975529</Identifier>
        <Name>Content Type</Name>
        <ParameterSelections/>
        <ParameterSetCollections/>
        <Parameters/>
        <Summary i:nil="true"/>
        <Instance>6364ec20-306a-4cab-aabc-8ec65c0903c9</Instance>
        <ConditionValue>
            <ComplexValue i:nil="true"/>
            <Text i:nil="true" xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
            <Default>
                <ComplexValue i:nil="true"/>
                <Text xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
                    <b:string>Standard</b:string>
                </Text>
            </Default>
        </ConditionValue>
        <TypeCode>String</TypeCode>
    </a:Condition>
</Conditions>
Run Code Online (Sandbox Code Playgroud)

我的工作是交换其中一个值,保留源的整个结构,并使用它在应用程序中稍后提交POST.

我遇到的问题是,当它保存到字符串或文件时,它完全混淆了名称空间:

<ns0:Context xmlns:ns0="http://Test.the.Sdk/2010/07" xmlns:ns1="http://schema.test.org/2004/07/Test.Soa.Vocab" xmlns:ns3="http://schemas.microsoft.com/2003/10/Serialization/Arrays" …
Run Code Online (Sandbox Code Playgroud)

python xml lxml elementtree

8
推荐指数
1
解决办法
5186
查看次数

Boto3 create_image用于AMI创建-仅保存根卷

我正在编写一个脚本来创建实例的AMI图像。

我的目标是仅保存根卷。

我正在使用boto3。

我的测试实例附加了2个EBS卷。我只想用AMI保存根卷。

这是我的代码的工作方式:

  1. 收集实例列表
  2. 分析每个实例以仅标识根设备,收集其映射数据
  3. 执行boto3的instance.create_image,以触发,并通过唯一BlockDeviceMappings根设备。

预期结果: AMI只有我在create_image呼叫中定义的块设备。

实际结果是: AMI具有连接至该源实例,所有的块的装置,而不管所述显式的BlockDeviceMappings期间定义create_image

在下面的代码中,我编写了一个函数,该函数将已收集的源实例数据带到其他位置。我仅定义根卷信息,BlockDeviceMappings没有声明附加到源卷的任何其他设备。

def create_image(inst, instance, inst_dict):
    nowtime = datetime.datetime.now().strftime('%Y-%m-%d')
    try:
        image = instance.create_image(
            BlockDeviceMappings=[
                {
                    'DeviceName': inst_dict[inst]['root_dev_name'],
                    'Ebs': {
                        'Encrypted': inst_dict[inst]['vol_encr'],
                        'DeleteOnTermination': inst_dict[inst]['vol_del_rule'],
                        'VolumeSize': inst_dict[inst]['vol_size'],
                        'VolumeType': inst_dict[inst]['root_dev_type']
                    },
                },
            ],
            Description=inst_dict[inst]['inst_name'] + " " + str(nowtime),
            DryRun=False,
            Name=inst_dict[inst]['inst_name'] + " " + str(nowtime),
            NoReboot=True
        )
    except Exception, e:
        logging.error("Failed to create image! Instance: " …
Run Code Online (Sandbox Code Playgroud)

python amazon-ec2 amazon-web-services boto3

6
推荐指数
1
解决办法
3728
查看次数

Docker 中的 PHP - fopen() 或 file_put_contents() 无法写入 /proc/1/fd/2 以进行 stdout 写入

在基于 CentOS7 的 Docker 容器中运行 php-fpm 应用程序。

由于我使用 Docker,我必须将所有进程的日志输出写入 PID 1 的输出。通过这种方式,Docker 引擎可以获取日志以供以后处理(因此它们显示在 中docker logs)。

我可以通过/proc/1/fd/2在任何应用程序中毫无问题地写入所有日志来实现此目的。我可以用 nginx 来做到这一点,并且只是这样做,echo "test" > /proc/1/fd/2它对于docker logs.

然而,对于 php 软件,我想做同样的事情,但/proc/1/fd/2无论我做什么,我似乎都无法获取文件流。

PHP-FPM 产生许多子进程。因此,我必须显式写入 PID 1 的 stdout!

所以我正在做这样的事情:

$handle = fopen("/proc/1/fd/2", "w");
fwrite($handle, $msg);
fclose($handle);
Run Code Online (Sandbox Code Playgroud)

我刚刚得到Warning: fopen(/proc/1/fd/2): failed to open stream: No such file or directory

注意:我也用https://www.php.net/manual/en/function.file-put-contents.php尝试过此操作,并且发生了相同的结果。它本质上是 fopen、fwrite、fclose 的包装。

我尝试将它扔到符号链接上:

bash-4.2$ ls -l /tmp/stdout
lrwxrwxrwx. 1 nginx nginx 12 Apr 10 11:19 …
Run Code Online (Sandbox Code Playgroud)

php logging stdout docker

6
推荐指数
1
解决办法
3789
查看次数

Python:用新字符串替换字符串中的字符 RANGE

给定以下字符串:

mystring = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

目标是用其他字符交换字符位置范围。

例如,将字符 20-24 替换为ABCDE. 结果如下:

XXXXXXXXXXXXXXXXXXXABCDEXXXXXXXXXXXXXXX

测试:

mystring = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
mystring[20:24] = 'ABCDE'
Run Code Online (Sandbox Code Playgroud)

我收到错误:TypeError: 'str' object does not support item assignment

最终目标是可重用的函数,例如:

def replace_chars(some_string, start_char, end_char, replace_string):
    if len(replace_string) == (end_char_pos - start_char_pos + 1):
        some_string[start_char:end_char] = replace_string
    else:
        print "replace string invalid length"
        sys.exit(1)
    return mystring

new_string = replace_chars('XYZXYZ', 2, 4, 'AAA')
Run Code Online (Sandbox Code Playgroud)

我意识到可以将未更改的范围填充到新字符串中:

mystring = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
mystring = mystring[0:19] + 'ABCDE' + mystring[25:38]
Run Code Online (Sandbox Code Playgroud)

然而,这将迫使更多的计算,因为这将针对文件中的行发生数千次。不同的行有不同的长度,并且交换的字符位置也不同。这样做似乎是一个很长的解决方法,我应该能够直接插入到位的字符位置。

感谢任何帮助,谢谢!

python string character

5
推荐指数
1
解决办法
1万
查看次数

如何从分支索引禁用触发器但仍允许在多分支作业中触发 SCM

使用Jenkins 多分支流水线作业时,如果您Suppress Automatic SCM trigger在作业中选择,它将在索引分支后停止构建作业(强大的功能)。

然而,出于某种原因,这也会终止从 SCM 事件触发构建的能力!

有什么方法可以阻止构建在分支发现(分支索引)后触发,但仍然通过 SCM 事件正常构建?

jenkins jenkins-pipeline multibranch-pipeline

5
推荐指数
1
解决办法
4722
查看次数

Jenkins MultiBranch - 从管道文件(Jenkinsfile)引用 git repo 的标签

这与一年多前回答的问题相同:Jenkinsfile get current tag

那里接受的答案对我不起作用,我认为从那时起,管道内的行为一定已经发生了变化。

我的存储库有标签(推送到原点!),并且我添加了 Jenkins 选项来发现标签,但是我无法从管道步骤中获取或引用它们。它只是显示为空。

在我的多分支管道作业中,我添加了“发现标签”步骤发现标签

我有一个带有发布标签集的 git 存储库:

myhost$ git fetch
myhost$ git tag
0.0.42
myhost$ git tag --sort version:refname
0.0.42
Run Code Online (Sandbox Code Playgroud)

在 Jenkinsfile 中我尝试过:

sh "git tag --sort version:refname | tail -1 > version.tmp"
sh "cat version.tmp"
Run Code Online (Sandbox Code Playgroud)

和:

sh(returnStdout: true, script: "git tag --sort version:refname | tail -1").trim()
Run Code Online (Sandbox Code Playgroud)

两者都没有返回(null)

git jenkins jenkins-pipeline

4
推荐指数
1
解决办法
3161
查看次数

带有 Node.js 的 PM2——“取消保存”进程列表?

遵循此文档:http : //pm2.keymetrics.io/docs/usage/startup/#saving-current-process-list

pm2 save 将当前进程列表保存到 $PM2_HOME/.pm2/dump.pm2

这一切都很完美,但我如何“取消保存”?

显然可以删除,dump.pm2但我不知道这样做的影响或潜在的工件。

node.js pm2

4
推荐指数
1
解决办法
1249
查看次数

Terraform:添加单个规则时,所有安全组规则都会被销毁并替换

地形信息:

  • 地形 v0.12.18
  • 提供商.aws v2.43.0
  • 提供者.模板 v2.1.2

我定义了一个安全组:

如果我运行terraform planterraform apply针对现有堆栈,则没有任何待处理的更改,状态完全是最新的。

resource "aws_security_group" "sg_apps" {
  name        = "Custom apps ${var.env}"
  description = "Custom apps ${var.env}"
  vpc_id      = data.terraform_remote_state.vpc.outputs.vpc_east_id
  tags = {
    Name = "Custom apps ${var.env} - TF"
  }

  ingress {
    from_port = 3306
    to_port   = 3306
    protocol  = "tcp"
    cidr_blocks = [
      data.terraform_remote_state.vpc.outputs.m-1a_cidr,
      data.terraform_remote_state.vpc.outputs.m-1b_cidr,
      data.terraform_remote_state.vpc.outputs.p-1b_cidr,
      data.terraform_remote_state.vpc.outputs.p-1a_cidr,
    ]
  }

  ingress {
    from_port = 8800
    to_port   = 8808
    protocol  = "tcp"
    cidr_blocks = [
      data.terraform_remote_state.vpc.outputs.m-1a_cidr,
      data.terraform_remote_state.vpc.outputs.m-1b_cidr,
      data.terraform_remote_state.vpc.outputs.p-1b_cidr, …
Run Code Online (Sandbox Code Playgroud)

terraform terraform-provider-aws

4
推荐指数
1
解决办法
3906
查看次数

使用boto3检查EC2实例的停止时间

Python 2.7 Boto3

我正在尝试获取实例何时停止或上一次状态转换发生的时间或实例处于当前状态的持续时间的时间戳。

我的目标是测试实例是否已停止x小时。

例如,

instance = ec2.Instance('myinstanceID')
if int(instance.state['Code']) == 80:
    stop_time = instance.state_change_time() #Dummy method.
Run Code Online (Sandbox Code Playgroud)

或类似的东西。

我看到boto3有一个launch_time方法。还有很多使用state_transition_reason和分析状态变化的方法,state_reason但是我看不到关于状态转换时间戳的任何信息。

我一定要错过一些东西。

这是实例“状态”方法的Boto3文档...

state
(dict) --

The current state of the instance.

Code (integer) --

The low byte represents the state. The high byte is an opaque internal value and should be ignored.

0 : pending
16 : running
32 : shutting-down
48 : terminated
64 : stopping
80 : stopped
Name (string) --

The …
Run Code Online (Sandbox Code Playgroud)

python amazon-ec2 amazon-web-services python-2.7 boto3

3
推荐指数
1
解决办法
2284
查看次数

构建Dockerfile-在中间容器之间保留文件

我正在使用keymetrics官方图像docker hub链接构建一个非常基本的容器

但这不是一个node.js或pm2问题,而是一个非常多的Docker问题,尤其是 docker build

Dockerfile(npm install)中的步骤将节点程序包下拉到node_modules文件夹中-IT WORKS。创建文件夹并下载文件,并在生成输出中显示(如下)。

问题在于,该RUN命令完成后,中间容器将被删除,而我丢失了node_modules文件夹。

我的dockerfile有一些ls -l命令来阐明文件的状态。

保留在工作目录(/app)中的唯一文件是我使用COPY命令从主机复制的文件

这是我的Dockerfile:

FROM keymetrics/pm2:latest

# Bundle APP files
COPY src src/
COPY package.json .
COPY pm2.json .

# Install app dependencies
ENV NPM_CONFIG_LOGLEVEL info
RUN pwd && ls -l /app && npm install && ls -l

# Show current folder structure in logs
RUN ls -l

CMD [ "pm2-docker", "start", "pm2.json" ]
Run Code Online (Sandbox Code Playgroud)

生成命令: docker build -t localapps/pm2_test_app:0.0.4 .

建立输出

Sending build …
Run Code Online (Sandbox Code Playgroud)

node.js docker pm2 dockerfile

3
推荐指数
1
解决办法
944
查看次数

MongoDB - 无权添加副本集成员,但 Mongo Auth 已禁用

我计划的步骤(我的目标):

  • 创建 3x Mongo 主机
  • 启动复制 ( rs.initiate())
  • 将主机添加到复制集
  • 在主服务器上启用身份验证(这应该跨集群同步用户/角色/身份验证设置?)

在副本集配置期间禁用身份验证,但是在尝试添加成员时,我收到“未授权在本地执行命令”。

以下是我在尚未启用身份验证的全新 Mongo 安装上运行的步骤 ---

检查是否--auth未启用:

root@3106f5453c95:/# ps -ef |grep mongod
mongodb      1     0  1 16:34 ?        00:00:01 mongod --bind_ip_all --config /etc/mongod.conf
Run Code Online (Sandbox Code Playgroud)

mongod.conf

systemLog:
   destination: file
   path: "/var/log/mongodb/mongod.log"
   logAppend: true
replication:
   replSetName: rsprod
security:
   keyFile: /data/db/replicaSetKey.key
Run Code Online (Sandbox Code Playgroud)

以下命令在 3 节点集中的一台主机上运行:

启动副本集没有问题:

root@b902fd176bdd:/# mongo --eval 'rs.initiate()'
MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.3
{
    "info2" : "no configuration specified. Using a default configuration …
Run Code Online (Sandbox Code Playgroud)

mongodb

3
推荐指数
1
解决办法
4968
查看次数

如何获得真实布尔值的“和”

在这种情况下,我有3个布尔变量(已经设置为truefalse

这里的目标是确定是否一组布尔变量中的一个以上设置为true

现在,我写了以下内容,它可以正常工作:

    boolval := 0
    if *firstbool {
        boolval++
    }
    if *secondbool {
        boolval++
    }
    if *thirdbool {
        boolval++
    }
    if boolval > 1 {
        // More than 1 of the bool vars are true
    }

Run Code Online (Sandbox Code Playgroud)

如果我要写连续的if{}语句,我总是标记我的逻辑,所以我想问一下天才,你将如何做到这一点。

boolean sum go boolean-operations

0
推荐指数
1
解决办法
124
查看次数